Base abstract class for all the nodes added and used by the node system. More...
#include <Dataflow/Core/Node.hpp>
Public Types | |
using | PortIndex = Ra::Core::Utils::Index |
template<typename Port > | |
using | PortCollection = std::vector<Port> |
template<typename Port > | |
using | PortPtr = std::shared_ptr<Port> |
template<typename Port > | |
using | PortRawPtr = Port* |
template<typename Type > | |
using | PortInPtr = PortPtr<PortIn<Type>> |
template<typename Type > | |
using | PortInRawPtr = PortIn<Type>* |
template<typename Type > | |
using | PortOutPtr = PortPtr<PortOut<Type>> |
template<typename Type > | |
using | PortOutRawPtr = PortOut<Type>* |
using | PortBasePtr = PortPtr<PortBase> |
using | PortBaseRawPtr = PortRawPtr<PortBase> |
using | PortBaseCollection = PortCollection<PortBasePtr> |
using | PortBaseInPtr = PortPtr<PortBaseIn> |
using | PortBaseInRawPtr = PortRawPtr<PortBaseIn> |
using | PortBaseInCollection = PortCollection<PortBaseInPtr> |
using | PortBaseOutPtr = PortPtr<PortBaseOut> |
using | PortBaseOutRawPtr = PortRawPtr<PortBaseOut> |
using | PortBaseOutCollection = PortCollection<PortBaseOutPtr> |
template<typename Port > | |
using | IndexAndPort = std::pair<PortIndex, Port> |
template<typename T > | |
using | ParamHandle = Ra::Core::VariableSet::VariableHandle<T> |
Public Member Functions | |
virtual | ~Node ()=default |
make Node a base abstract class | |
bool | operator== (const Node &node) |
Two nodes are considered equal if there model and instance names are the same. | |
void | add_metadata (const nlohmann::json &data) |
Add a metadata to the node to store application specific information. | |
const nlohmann::json & | metadata () |
Give access to extra json data stored on the node. | |
bool | is_initialized () const |
Ra::Core::VariableSet & | parameters () |
Return node's parameters. | |
Ra::Core::VariableSet & | input_variables () |
Return a variable set of input ports default value reference, if any. | |
bool | is_output () |
Node is output if none of the output ports is linked. | |
bool | is_input () |
Node is input if all input ports have default values and not linked. | |
Constructors | |
delete default constructors. | |
Node (const Node &)=delete | |
Node & | operator= (const Node &)=delete |
Function execution control | |
virtual void | init () |
Initializes the node content. | |
virtual bool | compile () |
Compile the node to check its validity. | |
virtual bool | execute ()=0 |
Executes the node. | |
virtual void | destroy () |
Delete the node's content. | |
Control the interfaces of the nodes (inputs, outputs, internal data, ...) | |
auto | port_by_name (const std::string &type, const std::string &name) const -> IndexAndPort< PortBaseRawPtr > |
Get a port by its name. | |
auto | input_by_name (const std::string &name) const -> IndexAndPort< PortBaseInRawPtr > |
Convenience alias to port_by_name("in", name) | |
auto | output_by_name (const std::string &name) const -> IndexAndPort< PortBaseOutRawPtr > |
Convenience alias to port_by_name("out", name) | |
PortBaseRawPtr | port_by_index (const std::string &type, PortIndex index) const |
Get a port by its index. | |
auto | input_by_index (PortIndex index) const |
Convenience alias to port_by_index("in", index) | |
auto | output_by_index (PortIndex index) const |
Convenience alias to port_by_index("out", index) | |
template<typename T > | |
auto | input_by_index (PortIndex index) const |
Convenience alias with typed port. | |
template<typename T > | |
auto | output_by_index (PortIndex index) const |
Convenience alias with typed port. | |
const PortBaseInCollection & | inputs () const |
Gets the in ports of the node. | |
const PortBaseOutCollection & | outputs () const |
Gets the out ports of the node. | |
Identification methods | |
const std::string & | model_name () const |
Gets the model (type/class) name of the node. | |
const std::string & | display_name () const |
Gets the display name of the node (e.g. for gui), no need to be unique in a graph. | |
void | set_display_name (const std::string &name) |
Set the display name. | |
const std::string & | instance_name () const |
Gets the instance name of the node. | |
void | set_instance_name (const std::string &name) |
Sets the instance name the node (unused?) instance name must be unique in a graph. | |
Serialization of a node | |
| |
void | toJson (nlohmann::json &data) const |
Serialize the content of the node. | |
bool | fromJson (const nlohmann::json &data) |
Unserialized the content of the node. | |
Protected Member Functions | |
Node (const std::string &instance, const std::string &typeName) | |
Construct the base node given its name and type. | |
template<typename PortType > | |
auto | port_by_name (const PortCollection< PortPtr< PortType > > &ports, const std::string &name) const -> IndexAndPort< PortRawPtr< PortType > > |
Gets the Port By Name. | |
template<typename PortType > | |
auto | port_base (const PortCollection< PortPtr< PortType > > &ports, PortIndex idx) const -> PortRawPtr< PortType > |
Gets the PortBase In or Out by its index. | |
template<typename T , typename PortType > | |
auto | port (const PortCollection< PortPtr< PortType > > &ports, PortIndex index) const |
Gets a port in a collection by its index. | |
virtual bool | fromJsonInternal (const nlohmann::json &data) |
Internal json representation of the Node. | |
virtual void | toJsonInternal (nlohmann::json &data) const |
Internal json representation of the Node. | |
template<typename PortType > | |
PortIndex | add_port (PortCollection< PortPtr< PortType > > &, PortPtr< PortType > port) |
Adds a port to port collection. | |
PortIndex | add_input (PortBaseInPtr in) |
Convenience alias to add_port(inputs(), in) | |
PortIndex | add_output (PortBaseOutPtr out) |
Convenience alias to add_port(outputs(), out) | |
template<typename T , typename... U> | |
auto | add_input (U &&... u) |
Adds a typed input port. | |
template<typename T , typename... U> | |
auto | add_output (U &&... u) |
Adds a typed output port. | |
template<typename T > | |
auto | input_port (PortIndex index) |
Gets a typed (input/output) port. | |
template<typename T > | |
auto | output_port (PortIndex index) |
Gets a typed (input/output) port. | |
void | remove_input (PortIndex index) |
Remove the given port from the managed (input/output) ports. | |
void | remove_output (PortIndex index) |
Remove the given port from the managed (input/output) ports. | |
template<typename T > | |
auto | add_parameter (const std::string &name, const T &value) |
template<typename T > | |
bool | remove_parameter (const std::string &name) |
template<typename T > | |
bool | remove_parameter (ParamHandle< T > &handle) |
Protected Attributes | |
bool | m_initialized { false } |
Flag that checks if the node is already initialized. | |
std::string | m_model_name |
The type name of the node. Initialized once at construction. | |
std::string | m_instance_name |
The instance name of the node. | |
std::string | m_display_name { "" } |
Node's name if needed for display. | |
PortCollection< PortPtr< PortBaseIn > > | m_inputs |
The in ports of the node (own by the node) | |
PortCollection< PortPtr< PortBaseOut > > | m_outputs |
The out ports of the node (own by the node) | |
Ra::Core::VariableSet | m_parameters |
The editable parameters of the node. | |
Ra::Core::VariableSet | m_input_variables |
nlohmann::json | m_metadata |
Additional data on the node, added by application or gui or ... | |
Base abstract class for all the nodes added and used by the node system.
A node represent a function acting on some input data and generating some outputs. To build a computation graph, nodes should be added to the graph, which is itself a node (
Nodes computes their function using the input data collecting from the input ports, in an evaluation context (possibly empty) defined by their internal data to generate results sent to their output ports.
Derived class must implement bool execute() and static const std::string & node_typename()
static const std::string& node_typename() returns the demangled type name of the node or any human readable representation of the type name. This is a public static member each node concrete class must define to be serializable. Since we want to manipulate Node*, CRTP is not an option here.
using Ra::Dataflow::Core::Node::IndexAndPort = std::pair<PortIndex, Port> |
using Ra::Dataflow::Core::Node::ParamHandle = Ra::Core::VariableSet::VariableHandle<T> |
using Ra::Dataflow::Core::Node::PortBaseInPtr = PortPtr<PortBaseIn> |
using Ra::Dataflow::Core::Node::PortBaseInRawPtr = PortRawPtr<PortBaseIn> |
using Ra::Dataflow::Core::Node::PortBaseOutPtr = PortPtr<PortBaseOut> |
using Ra::Dataflow::Core::Node::PortBaseOutRawPtr = PortRawPtr<PortBaseOut> |
using Ra::Dataflow::Core::Node::PortBaseRawPtr = PortRawPtr<PortBase> |
using Ra::Dataflow::Core::Node::PortCollection = std::vector<Port> |
using Ra::Dataflow::Core::Node::PortIndex = Ra::Core::Utils::Index |
using Ra::Dataflow::Core::Node::PortInPtr = PortPtr<PortIn<Type>> |
using Ra::Dataflow::Core::Node::PortInRawPtr = PortIn<Type>* |
using Ra::Dataflow::Core::Node::PortOutPtr = PortPtr<PortOut<Type>> |
using Ra::Dataflow::Core::Node::PortOutRawPtr = PortOut<Type>* |
using Ra::Dataflow::Core::Node::PortPtr = std::shared_ptr<Port> |
using Ra::Dataflow::Core::Node::PortRawPtr = Port* |
|
protected |
|
inlineprotected |
|
inlineprotected |
void Ra::Dataflow::Core::Node::add_metadata | ( | const nlohmann::json & | data | ) |
Add a metadata to the node to store application specific information.
Merge/replace node's metadata using data
. Used, e.g. by the node editor gui to save node position in the graphical canvas. To remove a field, set it to "null"_json == nullptr
data | a json object containing metadata. |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
inlinevirtual |
Compile the node to check its validity.
Only nodes defining a full computation graph will need to override this method. The base version do nothing.
Reimplemented in Ra::Dataflow::Core::DataflowGraph.
|
inlinevirtual |
Delete the node's content.
The destroy() function is called once at the end of the lifetime of the node. Its goal is to free the internal data that have been allocated.
Reimplemented in Ra::Dataflow::Core::DataflowGraph.
Definition at line 432 of file Node.hpp.
|
inline |
|
pure virtual |
Executes the node.
Execute the node function on the input ports (to be fetched) and write the results to the output ports.
Implemented in Customs::FilterSelector< T >, Ra::Dataflow::Core::DataflowGraph, Ra::Dataflow::Core::Functionals::BinaryOpNode< t_a, t_b, t_result >, Ra::Dataflow::Core::Functionals::FilterNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::ReduceNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::TransformNode< coll_t, v_t >, Ra::Dataflow::Core::Sinks::SinkNode< T >, Ra::Dataflow::Core::Sources::FunctionSourceNode< R, Args >, and Ra::Dataflow::Core::Sources::SingleDataSourceNode< T >.
bool Ra::Dataflow::Core::Node::fromJson | ( | const nlohmann::json & | data | ) |
|
protectedvirtual |
Internal json representation of the Node.
Default implementation warn about unsupported deserialization. Effective deserialzation must be implemented by inheriting classes. Be careful with template specialization and function member overriding in derived classes.
Reimplemented in Customs::FilterSelector< T >, Ra::Dataflow::Core::DataflowGraph, Ra::Dataflow::Core::Functionals::BinaryOpNode< t_a, t_b, t_result >, Ra::Dataflow::Core::Functionals::FilterNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::ReduceNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::TransformNode< coll_t, v_t >, Ra::Dataflow::Core::Sinks::SinkNode< T >, Ra::Dataflow::Core::Sources::FunctionSourceNode< R, Args >, Ra::Dataflow::Core::Sources::SingleDataSourceNode< T >, and Ra::Dataflow::Rendering::Nodes::RenderingNode.
Definition at line 91 of file Node.cpp.
|
inlinevirtual |
Initializes the node content.
The init() function should be called once at the beginning of the lifetime of the node by the owner of the node (the graph which contains the node). Its goal is to initialize the node's internal data if any. The default do nothing.
Reimplemented in Ra::Dataflow::Core::DataflowGraph, Ra::Dataflow::Core::Functionals::BinaryOpNode< t_a, t_b, t_result >, Ra::Dataflow::Core::Functionals::FilterNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::ReduceNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::TransformNode< coll_t, v_t >, and Ra::Dataflow::Core::Sinks::SinkNode< T >.
|
inline |
|
inline |
auto Ra::Dataflow::Core::Node::input_by_name | ( | const std::string & | name | ) | const -> IndexAndPort<PortBaseInRawPtr> |
|
inlineprotected |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
auto Ra::Dataflow::Core::Node::output_by_name | ( | const std::string & | name | ) | const -> IndexAndPort<PortBaseOutRawPtr> |
|
inlineprotected |
|
inline |
|
inline |
|
inlineprotected |
|
protected |
PortBase * Ra::Dataflow::Core::Node::port_by_index | ( | const std::string & | type, |
PortIndex | index ) const |
Get a port by its index.
type | either "in" or "out", the directional type of the port |
index | Index of the port \in [0 get(Inputs|Output).size()[ |
Definition at line 86 of file Node.cpp.
|
protected |
Gets the Port By Name.
PortType | PortBaseIn or PortBaseOut |
ports | Port collection to search in. |
name | The named used to add the port. |
Definition at line 523 of file Node.hpp.
auto Ra::Dataflow::Core::Node::port_by_name | ( | const std::string & | type, |
const std::string & | name ) const -> IndexAndPort<PortBaseRawPtr> |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
inline |
|
inline |
void Ra::Dataflow::Core::Node::toJson | ( | nlohmann::json & | data | ) | const |
|
protectedvirtual |
Internal json representation of the Node.
Default implementation warn about unsupported deserialization. Effective deserialzation must be implemented by inheriting classes. Be careful with template specialization and function member overriding in derived classes.
Reimplemented in Customs::FilterSelector< T >, Ra::Dataflow::Core::DataflowGraph, Ra::Dataflow::Core::Functionals::BinaryOpNode< t_a, t_b, t_result >, Ra::Dataflow::Core::Functionals::FilterNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::ReduceNode< coll_t, v_t >, Ra::Dataflow::Core::Functionals::TransformNode< coll_t, v_t >, Ra::Dataflow::Core::Sinks::SinkNode< T >, Ra::Dataflow::Core::Sources::FunctionSourceNode< R, Args >, Ra::Dataflow::Core::Sources::SingleDataSourceNode< T >, and Ra::Dataflow::Rendering::Nodes::RenderingNode.
Definition at line 109 of file Node.cpp.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |