/tags/rel-0-5-1/FreeSpeech/data-flow/src/UINode.cc

# · C++ · 281 lines · 201 code · 54 blank · 26 comment · 25 complexity · f4acb5457e463d3abfd4b63d0fcf0fdc MD5 · raw file

  1. // Copyright (C) 2001 Jean-Marc Valin
  2. extern "C" {
  3. }
  4. #include "UINode.h"
  5. #include "UINetwork.h"
  6. #include "UITerminal.h"
  7. #include "UINodeParameters.h"
  8. #include <tree.h>
  9. #include "Node.h"
  10. #include "UIDocument.h"
  11. #include "UILink.h"
  12. #include "ParameterSet.h"
  13. #include "Network.h"
  14. UINode::UINode(UINetwork* _net, string _name, string _type, double _x, double _y, bool doInit)
  15. : net(_net)
  16. , name(_name)
  17. , type(_type)
  18. , x(_x)
  19. , xtmp(_x)
  20. , y(_y)
  21. , ytmp(_y)
  22. , destroyed(false)
  23. {
  24. parameters = newNodeParameters(this,type);
  25. if (doInit)
  26. {
  27. vector<ItemInfo *> inputname;
  28. vector<ItemInfo *> outputname;
  29. inputname = net->getDocument()->getNetInputs(type);
  30. outputname = net->getDocument()->getNetOutputs(type);
  31. //cerr << "UINode::draw factory not found in simple nodes\n";
  32. for (int i=0;i<inputname.size();i++) {
  33. inputs.insert(inputs.end(), new UITerminal (inputname[i],
  34. this, true, 0.0, 0.0));
  35. }
  36. for (int i=0;i<outputname.size();i++) {
  37. outputs.insert(outputs.end(), new UITerminal (outputname[i],
  38. this, false, 0.0, 0.0));
  39. }
  40. description = net->getDocument()->getDescription(type);
  41. }
  42. }
  43. UINode::UINode(UINetwork* _net, xmlNodePtr def, bool doInit)
  44. : net(_net)
  45. , destroyed(false)
  46. {
  47. name = string((char *)xmlGetProp(def, (CHAR *)"name"));
  48. type = string((char *)xmlGetProp(def, (CHAR *)"type"));
  49. x = atof((char *)xmlGetProp(def, (CHAR *)"x"));
  50. y = atof((char *)xmlGetProp(def, (CHAR *)"y"));
  51. xtmp = x;
  52. ytmp=y;
  53. //draw();
  54. parameters = newNodeParameters(this, type);
  55. //cerr << "ici\n";
  56. parameters->load(def);
  57. if (doInit)
  58. {
  59. vector<ItemInfo *> inputname;
  60. vector<ItemInfo *> outputname;
  61. {
  62. inputname = net->getDocument()->getNetInputs(type);
  63. outputname = net->getDocument()->getNetOutputs(type);
  64. //cerr << "UINode::draw factory not found in simple nodes\n";
  65. }
  66. for (int i=0;i<inputname.size();i++)
  67. inputs.insert(inputs.end(), new UITerminal (inputname[i],
  68. this, true, 0.0, 0.0));
  69. for (int i=0;i<outputname.size();i++)
  70. outputs.insert(outputs.end(), new UITerminal (outputname[i],
  71. this, false, 0.0, 0.0));
  72. description = net->getDocument()->getDescription(type);
  73. }
  74. }
  75. UINode::~UINode()
  76. {
  77. if (!destroyed)
  78. {
  79. for (int i=0;i<inputs.size();i++)
  80. delete inputs[i];
  81. for (int i=0;i<outputs.size();i++)
  82. delete outputs[i];
  83. delete parameters;
  84. net->removeNode(this);
  85. }
  86. }
  87. void UINode::saveXML(xmlNode *root)
  88. {
  89. xmlNodePtr tree = xmlNewChild(root, NULL, (CHAR *)"Node", NULL);
  90. xmlSetProp(tree, (CHAR *)"name", (CHAR *)name.c_str());
  91. xmlSetProp(tree, (CHAR *)"type", (CHAR *)type.c_str());
  92. char tmp[15];
  93. sprintf (tmp, "%f", float(x));
  94. xmlSetProp(tree, (CHAR *)"x", (CHAR *)tmp);
  95. sprintf (tmp, "%f", float(y));
  96. xmlSetProp(tree, (CHAR *)"y", (CHAR *)tmp);
  97. parameters->saveXML(tree);
  98. }
  99. void UINode::export2net (ostream &out)
  100. {
  101. out << " <node: " << name << "> <type: " << type << ">" << endl;
  102. parameters->export2net(out);
  103. for (int i=0;i<inputs.size();i++)
  104. inputs[i]->export2net(out);
  105. out << endl;
  106. }
  107. UITerminal *UINode::getInputNamed(string n)
  108. {
  109. for (int i=0;i<inputs.size();i++)
  110. if (inputs[i]->getName() == n)
  111. return inputs[i];
  112. return NULL;
  113. }
  114. UITerminal *UINode::getOutputNamed(string n)
  115. {
  116. for (int i=0;i<outputs.size();i++)
  117. if (outputs[i]->getName() == n)
  118. return outputs[i];
  119. return NULL;
  120. }
  121. void UINode::setNodeParameters(UINodeParameters *params)
  122. {
  123. parameters = params;
  124. }
  125. void UINode::insertNetParams(vector<ItemInfo *> &params)
  126. {
  127. parameters->insertNetParams(params);
  128. }
  129. UILink *UINode::newLink (UITerminal *_from, UITerminal *_to)
  130. {
  131. return new UILink (_from, _to);
  132. }
  133. UINetTerminal *UINode::newNetTerminal (UITerminal *_terminal, UINetTerminal::NetTermType _type, string _name)
  134. {
  135. return new UINetTerminal (_terminal, _type, _name);
  136. }
  137. UINodeParameters *UINode::newNodeParameters (UINode *_node, string type)
  138. {
  139. //cerr << "UINode::newNodeParameters\n";
  140. return new UINodeParameters (_node, type);
  141. }
  142. Node *UINode::build(const ParameterSet &params)
  143. {
  144. //cerr << "UINode::build for node" << name << endl;
  145. //params.print();
  146. //for all params, it will perform substitution in parameters (process subnet_params)
  147. //cerr << "building parameters\n";
  148. ParameterSet *par = parameters->build(params);
  149. //This is only true is type is in the dictionary
  150. Node *node=NULL;
  151. _NodeFactory *factory = NULL;
  152. factory = Node::getFactoryNamed(type);
  153. //cerr << "building " << type << endl;
  154. try {
  155. if (factory)
  156. {
  157. node = factory->Create(name, *par);
  158. } else {
  159. UINetwork *buildNet = net->getDocument()->getNetworkNamed(type);
  160. if (buildNet)
  161. node = buildNet->build(name, *par);
  162. else
  163. {
  164. //cerr << "building external\n";
  165. node = UIDocument::buildExternal(type, name, *par);
  166. if (!node)
  167. {
  168. throw new GeneralException(string("Node not found: ")+type, __FILE__, __LINE__);
  169. }
  170. //cerr << "done\n";
  171. }
  172. }
  173. } catch (BaseException *e)
  174. {
  175. //e->print(cerr);
  176. //cerr << "caught here\n";
  177. throw e->add (new GeneralException(string("Exception caught while creating ")+name + " (type " + type + ")", __FILE__, __LINE__));
  178. }
  179. node->setUINode(this);
  180. //cerr << "done\n";
  181. /*if (name == "node1")
  182. {
  183. cout << "params for node: " << name << " (" << net->getName() << ")\n";
  184. par->print();
  185. cout << endl;
  186. }*/
  187. //cerr << "node created\n";
  188. //FIXME: The "par" object is leaked
  189. return node;
  190. }
  191. void UINode::genCode(ostream &out, int &id)
  192. {
  193. int bakID=id;
  194. id++;
  195. int bakID2=id;
  196. bool builtin=false;
  197. Node *node=NULL;
  198. _NodeFactory *factory = NULL;
  199. factory = Node::getFactoryNamed(type);
  200. if (factory)
  201. {
  202. builtin=true;
  203. }
  204. else
  205. {
  206. builtin=false;
  207. UINetwork *buildNet = net->getDocument()->getNetworkNamed(type);
  208. if (buildNet)
  209. buildNet->genCode(out, id);
  210. else {
  211. throw new GeneralException("external nodes not supported yet\n", __FILE__, __LINE__);
  212. }
  213. }
  214. out << "static Node *genNode" << bakID << "(const ParameterSet &params)\n";
  215. out << "{\n";
  216. parameters->genCode(out);
  217. if (builtin)
  218. {
  219. out << " _NodeFactory *factory = Node::getFactoryNamed(\"" << type << "\");\n";
  220. //FIXME: Should still for (factory == NULL) in generated code and report errors
  221. out << " Node *node = factory->Create(\""<<name << "\", parameters);\n";
  222. } else {
  223. out << " Node *node = genNet" << bakID2 << "(\""<<name << "\", parameters);\n";
  224. }
  225. out << " return node;\n";
  226. out << "}\n\n";
  227. }