Node system lays the foundation to build TVM's AST structures. Each AST object corresponds to a subclass of Node. Besides the Node itself, we also usually defines a reference type which can be used to store a strong reference to the node. The following code example shows how to define Node ```XYZNode``` and reference type ```XYZ```.
```c++ class XYZ; class XYZNode : public Node { public: static XYZ make(args); }; class XYZ : public NodeRef { public: ... }; void MyFunction() { XYZ ref = XYZNode::make(args); } ``` Historically, we introduced a static factory function ```make``` to each Node type which creates a new reference to the Node(as shown in the above code). This is less natural compared to direct usage of a constructor or moves the static factory function into the reference class. As shown in below. ```c++ class XYZNode : public Node { public: }; class XYZ : public NodeRef { public: XYZ(args); ... }; void MyFunction() { // use constructor. XYZ ref = XYZ(args); } ``` At the moment, not all the Node have a specific reference type -- this is also the reason why we adopt make in the Node historically. However, we start to see a trend of giving a specific reference type to each of the new Node introduced(e.g. in relay). I would also like to mention that we have already transitioned the python API to directly use the constructor-style code. Favor constructors in c++ will make both sides of the code to be more consistent. This RFC tries to see if we want to migrate to the new style, specifically: - For Nodes that do not have a corresponding reference type, keep the make function on Node. - For Nodes that have a reference type - Favor constructor over XYZNode::make - Favor static factory functions in the reference type. Most of the changes will be quite mechanical and we can do it incrementally. Please share your thoughts. -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/dmlc/tvm/issues/3223