primitives.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. # Exception to indicate the result value of the primitive, as a return cannot be used
  2. class PrimitiveFinished(Exception):
  3. def __init__(self, value):
  4. self.result = value
  5. def integer_subtraction(a, b, **remainder):
  6. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  7. result = yield [("CNV", [a_value - b_value])]
  8. raise PrimitiveFinished(result)
  9. def integer_addition(a, b, **remainder):
  10. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  11. result = yield [("CNV", [a_value + b_value])]
  12. raise PrimitiveFinished(result)
  13. def integer_multiplication(a, b, **remainder):
  14. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  15. result = yield [("CNV", [a_value * b_value])]
  16. raise PrimitiveFinished(result)
  17. def integer_division(a, b, **remainder):
  18. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  19. result = yield [("CNV", [int(a_value) / b_value])]
  20. raise PrimitiveFinished(result)
  21. def integer_gt(a, b, **remainder):
  22. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  23. result = yield [("CNV", [a_value > b_value])]
  24. raise PrimitiveFinished(result)
  25. def integer_lt(a, b, **remainder):
  26. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  27. result = yield [("CNV", [a_value < b_value])]
  28. raise PrimitiveFinished(result)
  29. def integer_gte(a, b, **remainder):
  30. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  31. result = yield [("CNV", [a_value >= b_value])]
  32. raise PrimitiveFinished(result)
  33. def integer_lte(a, b, **remainder):
  34. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  35. result = yield [("CNV", [a_value <= b_value])]
  36. raise PrimitiveFinished(result)
  37. def integer_eq(a, b, **remainder):
  38. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  39. result = yield [("CNV", [a_value == b_value])]
  40. raise PrimitiveFinished(result)
  41. def integer_neq(a, b, **remainder):
  42. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  43. result = yield [("CNV", [a_value != b_value])]
  44. raise PrimitiveFinished(result)
  45. def integer_neg(a, **remainder):
  46. a_value = yield [("RV", [a])]
  47. result = yield [("CNV", [-a_value])]
  48. raise PrimitiveFinished(result)
  49. def bool_and(a, b, **remainder):
  50. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  51. result = yield [("CNV", [a_value and b_value])]
  52. raise PrimitiveFinished(result)
  53. def bool_or(a, b, **remainder):
  54. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  55. result = yield [("CNV", [a_value or b_value])]
  56. raise PrimitiveFinished(result)
  57. def bool_not(a, **remainder):
  58. a_value = yield [("RV", [a])]
  59. result = yield [("CNV", [not a_value])]
  60. raise PrimitiveFinished(result)
  61. def bool_eq(a, b, **remainder):
  62. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  63. result = yield [("CNV", [a_value == b_value])]
  64. raise PrimitiveFinished(result)
  65. def bool_neq(a, b, **remainder):
  66. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  67. result = yield [("CNV", [a_value != b_value])]
  68. raise PrimitiveFinished(result)
  69. def float_subtraction(a, b, **remainder):
  70. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  71. result = yield [("CNV", [a_value - b_value])]
  72. raise PrimitiveFinished(result)
  73. def float_addition(a, b, **remainder):
  74. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  75. result = yield [("CNV", [a_value + b_value])]
  76. raise PrimitiveFinished(result)
  77. def float_multiplication(a, b, **remainder):
  78. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  79. result = yield [("CNV", [a_value * b_value])]
  80. raise PrimitiveFinished(result)
  81. def float_division(a, b, **remainder):
  82. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  83. result = yield [("CNV", [a_value / b_value])]
  84. raise PrimitiveFinished(result)
  85. def float_gt(a, b, **remainder):
  86. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  87. result = yield [("CNV", [a_value > b_value])]
  88. raise PrimitiveFinished(result)
  89. def float_lt(a, b, **remainder):
  90. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  91. result = yield [("CNV", [a_value < b_value])]
  92. raise PrimitiveFinished(result)
  93. def float_gte(a, b, **remainder):
  94. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  95. result = yield [("CNV", [a_value >= b_value])]
  96. raise PrimitiveFinished(result)
  97. def float_lte(a, b, **remainder):
  98. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  99. result = yield [("CNV", [a_value <= b_value])]
  100. raise PrimitiveFinished(result)
  101. def float_eq(a, b, **remainder):
  102. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  103. result = yield [("CNV", [a_value == b_value])]
  104. raise PrimitiveFinished(result)
  105. def float_neq(a, b, **remainder):
  106. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  107. result = yield [("CNV", [a_value != b_value])]
  108. raise PrimitiveFinished(result)
  109. def float_neg(a, **remainder):
  110. a_value = yield [("RV", [a])]
  111. result = yield [("CNV", [-a_value])]
  112. raise PrimitiveFinished(result)
  113. def string_join(a, b, **remainder):
  114. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  115. result = yield [("CNV", [a_value + b_value])]
  116. raise PrimitiveFinished(result)
  117. def string_split(a, b, **remainder):
  118. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  119. result = a_value.split(b_value)
  120. elems = yield [("CN", [])] + [("CNV", [v]) for v in result]
  121. new_val = elems[0]
  122. yield [("CD", [new_val, i, v]) for i, v in enumerate(elems[1:])]
  123. raise PrimitiveFinished(new_val)
  124. def string_get(a, b, **remainder):
  125. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  126. result = yield [("CNV", [a_value[b_value]])]
  127. raise PrimitiveFinished(result)
  128. def string_substr(a, b, c, **remainder):
  129. a_value, b_value, c_value = yield [("RV", [a]), ("RV", [b]), ("RV", [c])]
  130. result = yield [("CNV", [a_value[b_value:c_value]])]
  131. raise PrimitiveFinished(result)
  132. def string_len(a, **remainder):
  133. a_value = yield [("RV", [a])]
  134. result = yield [("CNV", [len(a_value)])]
  135. raise PrimitiveFinished(result)
  136. def string_eq(a, b, **remainder):
  137. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  138. result = yield [("CNV", [a_value == b_value])]
  139. raise PrimitiveFinished(result)
  140. def string_neq(a, b, **remainder):
  141. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  142. result = yield [("CNV", [a_value != b_value])]
  143. raise PrimitiveFinished(result)
  144. def string_startswith(a, b, **remainder):
  145. #TODO implement in AL
  146. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  147. result = yield [("CNV", [a_value.startswith(b_value)])]
  148. raise PrimitiveFinished(result)
  149. def action_eq(a, b, **remainder):
  150. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  151. result = yield [("CNV", [a_value == b_value])]
  152. raise PrimitiveFinished(result)
  153. def action_neq(a, b, **remainder):
  154. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  155. result = yield [("CNV", [a_value != b_value])]
  156. raise PrimitiveFinished(result)
  157. def type_eq(a, b, **remainder):
  158. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  159. result = yield [("CNV", [a_value == b_value])]
  160. raise PrimitiveFinished(result)
  161. def type_neq(a, b, **remainder):
  162. a_value, b_value = yield [("RV", [a]), ("RV", [b])]
  163. result = yield [("CNV", [a_value != b_value])]
  164. raise PrimitiveFinished(result)
  165. def element_eq(a, b, **remainder):
  166. result = yield [("CNV", [a == b])]
  167. raise PrimitiveFinished(result)
  168. def element_neq(a, b, **remainder):
  169. result = yield [("CNV", [a != b])]
  170. raise PrimitiveFinished(result)
  171. def cast_a2s(a, **remainder):
  172. a_value = yield [("RV", [a])]
  173. result = yield [("CNV", [str(a_value["value"])])]
  174. raise PrimitiveFinished(result)
  175. def cast_t2s(a, **remainder):
  176. a_value = yield [("RV", [a])]
  177. result = yield [("CNV", [str(a_value["value"])])]
  178. raise PrimitiveFinished(result)
  179. def cast_i2f(a, **remainder):
  180. a_value = yield [("RV", [a])]
  181. result = yield [("CNV", [float(a_value)])]
  182. raise PrimitiveFinished(result)
  183. def cast_i2s(a, **remainder):
  184. a_value = yield [("RV", [a])]
  185. result = yield [("CNV", [str(a_value)])]
  186. raise PrimitiveFinished(result)
  187. def cast_i2b(a, **remainder):
  188. a_value = yield [("RV", [a])]
  189. result = yield [("CNV", [bool(a_value)])]
  190. raise PrimitiveFinished(result)
  191. def cast_f2i(a, **remainder):
  192. a_value = yield [("RV", [a])]
  193. result = yield [("CNV", [int(a_value)])]
  194. raise PrimitiveFinished(result)
  195. def cast_f2s(a, **remainder):
  196. a_value = yield [("RV", [a])]
  197. result = yield [("CNV", [str(a_value)])]
  198. raise PrimitiveFinished(result)
  199. def cast_f2b(a, **remainder):
  200. a_value = yield [("RV", [a])]
  201. result = yield [("CNV", [bool(a_value)])]
  202. raise PrimitiveFinished(result)
  203. def cast_s2i(a, **remainder):
  204. a_value = yield [("RV", [a])]
  205. result = yield [("CNV", [int(a_value)])]
  206. raise PrimitiveFinished(result)
  207. def cast_s2f(a, **remainder):
  208. a_value = yield [("RV", [a])]
  209. result = yield [("CNV", [float(a_value)])]
  210. raise PrimitiveFinished(result)
  211. def cast_s2b(a, **remainder):
  212. a_value = yield [("RV", [a])]
  213. result = yield [("CNV", [bool(a_value)])]
  214. raise PrimitiveFinished(result)
  215. def cast_b2i(a, **remainder):
  216. a_value = yield [("RV", [a])]
  217. result = yield [("CNV", [int(a_value)])]
  218. raise PrimitiveFinished(result)
  219. def cast_b2f(a, **remainder):
  220. a_value = yield [("RV", [a])]
  221. result = yield [("CNV", [float(a_value)])]
  222. raise PrimitiveFinished(result)
  223. def cast_b2s(a, **remainder):
  224. a_value = yield [("RV", [a])]
  225. result = yield [("CNV", [str(a_value)])]
  226. raise PrimitiveFinished(result)
  227. def cast_e2s(a, **remainder):
  228. a_value = yield [("RV", [a])]
  229. result = yield [("CNV", ["{ID: %s, value: %s}" % (a, a_value)])]
  230. raise PrimitiveFinished(result)
  231. def cast_v2s(a, **remainder):
  232. a_value = yield [("RV", [a])]
  233. if isinstance(a_value, (str, unicode)):
  234. # String should be encoded to distinguish between 3 and "3"
  235. a_value = '"%s"' % a_value
  236. elif isinstance(a_value, dict):
  237. # Action or type
  238. a_value = a_value["value"]
  239. result = yield [("CNV", ["%s" % (a_value)])]
  240. raise PrimitiveFinished(result)
  241. def cast_id2s(a, **remainder):
  242. result = yield [("CNV", ["%s" % (a)])]
  243. raise PrimitiveFinished(result)
  244. def list_append(a, b, **remainder):
  245. a_outgoing = yield [("RO", [a])]
  246. _ = yield [("CD", [a, len(a_outgoing), b])]
  247. raise PrimitiveFinished(a)
  248. def list_insert(a, b, c, **remainder):
  249. a_outgoing, c_value = yield [("RO", [a]), ("RV", [c])]
  250. links = yield [("RD", [a, i]) for i in range(c_value, len(a_outgoing))] + \
  251. [("RDE", [a, i]) for i in range(c_value, len(a_outgoing))]
  252. values = links[:len(links)/2]
  253. edges = links[len(links)/2:]
  254. yield [("CD", [a, c_value, b])] + \
  255. [("CD", [a, c_value + 1 + index, value]) for index, value in enumerate(values)] + \
  256. [("DE", [i]) for i in edges]
  257. raise PrimitiveFinished(a)
  258. def list_delete(a, b, **remainder):
  259. a_outgoing, b_value = yield [("RO", [a]), ("RV", [b])]
  260. links = yield [("RD", [a, i]) for i in range(b_value, len(a_outgoing))] + \
  261. [("RDE", [a, i]) for i in range(b_value, len(a_outgoing))]
  262. values = links[:len(links)/2]
  263. edges = links[len(links)/2:]
  264. yield [("CD", [a, b_value + index, value]) for index, value in enumerate(values[1:])] + \
  265. [("DE", [i]) for i in edges]
  266. raise PrimitiveFinished(a)
  267. def list_read(a, b, **remainder):
  268. b_value = yield [("RV", [b])]
  269. result = yield [("RD", [a, b_value])]
  270. if result is None:
  271. raise Exception("List read out of bounds: %s" % b_value)
  272. raise PrimitiveFinished(result)
  273. def list_len(a, **remainder):
  274. outgoings = yield [("RO", [a])]
  275. result = yield [("CNV", [len(outgoings)])]
  276. raise PrimitiveFinished(result)
  277. def dict_add(a, b, c, **remainder):
  278. is_here, new_edge = yield [("RD", [a, b]), ("CE", [a, c])]
  279. if is_here is not None:
  280. raise Exception("dict_add on existing value!")
  281. yield [("CE", [new_edge, b])]
  282. raise PrimitiveFinished(a)
  283. def dict_delete(a, b, **remainder):
  284. edge = yield [("RDNE", [a, b])]
  285. if edge is None:
  286. # This exact node isn't in this dictionary, so delete everything matching the value instead
  287. b_value = yield [("RV", [b])]
  288. edge = yield [("RDE", [a, b_value])]
  289. yield [("DE", [edge])]
  290. raise PrimitiveFinished(a)
  291. def dict_read(a, b, **remainder):
  292. b_value = yield [("RV", [b])]
  293. result = yield [("RD", [a, b_value])]
  294. raise PrimitiveFinished(result)
  295. def dict_read_edge(a, b, **remainder):
  296. b_value = yield [("RV", [b])]
  297. result = yield [("RDE", [a, b_value])]
  298. raise PrimitiveFinished(result)
  299. def dict_read_node(a, b, **remainder):
  300. result = yield [("RDN", [a, b])]
  301. raise PrimitiveFinished(result)
  302. def dict_in(a, b, **remainder):
  303. b_value = yield [("RV", [b])]
  304. value = yield [("RD", [a, b_value])]
  305. is_in = value is not None
  306. result = yield [("CNV", [is_in])]
  307. raise PrimitiveFinished(result)
  308. def dict_in_node(a, b, **remainder):
  309. value = yield [("RDN", [a, b])]
  310. result = yield [("CNV", [value is not None])]
  311. raise PrimitiveFinished(result)
  312. def dict_len(a, **remainder):
  313. outgoings = yield [("RO", [a])]
  314. result = yield [("CNV", [len(outgoings)])]
  315. raise PrimitiveFinished(result)
  316. def dict_keys(a, **remainder):
  317. keys, result = yield [("RDK", [a]), ("CN", [])]
  318. yield [("CE", [result, v]) for v in keys]
  319. raise PrimitiveFinished(result)
  320. def typeof(a, **remainder):
  321. t = yield [("RV", [a])]
  322. if isinstance(t, bool):
  323. r = "Boolean"
  324. elif isinstance(t, int) or isinstance(t, long):
  325. r = "Integer"
  326. elif isinstance(t, str) or isinstance(t, unicode):
  327. r = "String"
  328. elif isinstance(t, float):
  329. r = "Float"
  330. elif isinstance(t, dict):
  331. if t["value"] in ["if", "while", "assign", "call", "break", "continue", "return","resolve","access", "constant"]:
  332. r = "Action"
  333. elif t["value"] in ["Integer", "Float", "String", "Boolean", "Action", "Type"]:
  334. r = "Type"
  335. else:
  336. result = yield [("CN", [])]
  337. raise PrimitiveFinished(result)
  338. result = yield [("CNV", [{"value": r}])]
  339. raise PrimitiveFinished(result)
  340. def create_node(**remainder):
  341. result = yield [("CN", [])]
  342. raise PrimitiveFinished(result)
  343. def create_edge(a, b, **remainder):
  344. result = yield [("CE", [a, b])]
  345. raise PrimitiveFinished(result)
  346. def create_value(a, **remainder):
  347. a_value = yield [("RV", [a])]
  348. result = yield [("CNV", [a_value])]
  349. raise PrimitiveFinished(result)
  350. def read_nr_out(a, **remainder):
  351. outgoing = yield [("RO", [a])]
  352. result = yield [("CNV", [len(outgoing)])]
  353. raise PrimitiveFinished(result)
  354. def read_out(a, b, **remainder):
  355. outgoing, b_value = yield [("RO", [a]), ("RV", [b])]
  356. raise PrimitiveFinished(sorted(outgoing)[b_value])
  357. def read_nr_in(a, **remainder):
  358. incoming = yield [("RI", [a])]
  359. result = yield [("CNV", [len(incoming)])]
  360. raise PrimitiveFinished(result)
  361. def read_in(a, b, **remainder):
  362. incoming, b_value = yield [("RI", [a]), ("RV", [b])]
  363. raise PrimitiveFinished(sorted(incoming)[b_value])
  364. def read_edge_src(a, **remainder):
  365. result = yield [("RE", [a])]
  366. raise PrimitiveFinished(result[0])
  367. def read_edge_dst(a, **remainder):
  368. result = yield [("RE", [a])]
  369. raise PrimitiveFinished(result[1])
  370. def delete_element(a, **remainder):
  371. edge = yield [("RE", [a])]
  372. if edge[0] is None:
  373. # Not an edge:
  374. yield [("DN", [a])]
  375. result = yield [("CNV", [False])]
  376. raise PrimitiveFinished(result)
  377. else:
  378. yield [("DE", [a])]
  379. result = yield [("CNV", [True])]
  380. raise PrimitiveFinished(result)
  381. def read_root(root, **remainder):
  382. raise PrimitiveFinished(root)
  383. def set_add(a, b, **remainder):
  384. yield [("CE", [a, b])]
  385. raise PrimitiveFinished(a)
  386. def set_pop(a, **remainder):
  387. outgoing = yield [("RO", [a])]
  388. v, _ = yield [("RE", [outgoing[0]]), ("DE", [outgoing[0]])]
  389. raise PrimitiveFinished(v[1])
  390. def set_remove(a, b, **remainder):
  391. outgoing, b_value = yield [("RO", [a]), ("RV", [b])]
  392. elements = yield [("RE", [i]) for i in outgoing]
  393. elements = [elements] if not isinstance(elements[0], list) else elements
  394. values = yield [("RV", [i[1]]) for i in elements]
  395. values = [values] if not isinstance(values, list) else values
  396. yield [("DE", [identifier]) for identifier, edge in zip(outgoing, values) if edge == b_value]
  397. raise PrimitiveFinished(a)
  398. def set_remove_node(a, b, **remainder):
  399. outgoing = yield [("RO", [a])]
  400. elements = yield [("RE", [i]) for i in outgoing]
  401. elements = [elements] if not isinstance(elements[0], list) else elements
  402. yield [("DE", [identifier]) for identifier, edge in zip(outgoing, elements) if edge[1] == b]
  403. raise PrimitiveFinished(a)
  404. def set_in(a, b, **remainder):
  405. outgoing, b_value = yield [("RO", [a]), ("RV", [b])]
  406. if outgoing:
  407. elements = yield [("RE", [i]) for i in outgoing]
  408. elements = [elements] if not isinstance(elements[0], list) else elements
  409. values = yield [("RV", [i[1]]) for i in elements]
  410. values = [values] if not isinstance(values, list) else values
  411. if b_value in [v for v in values]:
  412. result = yield [("CNV", [True])]
  413. else:
  414. result = yield [("CNV", [False])]
  415. else:
  416. result = yield [("CNV", [False])]
  417. raise PrimitiveFinished(result)
  418. def set_in_node(a, b, **remainder):
  419. outgoing = yield [("RO", [a])]
  420. if outgoing:
  421. elements = yield [("RE", [i]) for i in outgoing]
  422. elements = [elements] if not isinstance(elements[0], list) else elements
  423. if b in [v[1] for v in elements]:
  424. result = yield [("CNV", [True])]
  425. else:
  426. result = yield [("CNV", [False])]
  427. else:
  428. result = yield [("CNV", [False])]
  429. raise PrimitiveFinished(result)
  430. def is_edge(a, **remainder):
  431. edge = yield [("RE", [a])]
  432. result = yield [("CNV", [edge[0] is not None])]
  433. raise PrimitiveFinished(result)
  434. #TODO deprecate
  435. def deserialize(a, root, **remainder):
  436. print("DESERIALIZE")
  437. value = yield [("RV", [a])]
  438. id_mappings = {}
  439. complex_primitives = frozenset(["if", "while", "assign", "call", "break", "continue", "return","resolve","access", "constant", "input", "output", "declare", "global", "Integer", "Float", "String", "Boolean", "Action", "Type"])
  440. for l in value.split("\n"):
  441. try:
  442. graph_type, constructor = l.split(None, 1)
  443. except:
  444. continue
  445. if graph_type == "N":
  446. # Node
  447. id_mappings[constructor] = yield [("CN", [])]
  448. elif graph_type == "V":
  449. # Node with Value
  450. name, temp = constructor.split("(", 1)
  451. string_value = temp[:-1]
  452. if string_value in complex_primitives:
  453. value = {"value": string_value}
  454. else:
  455. #TODO this is very dangerous!
  456. value = eval(string_value)
  457. id_mappings[name] = yield [("CNV", [value])]
  458. elif graph_type == "E":
  459. # Edge
  460. name, temp = constructor.split("(", 1)
  461. source, target = temp[:-1].split(",", 1)
  462. if target[0] == "?" and target not in id_mappings:
  463. hierarchy = target[1:].split("/")
  464. current = yield [("RD", [root, "__hierarchy"])]
  465. for i in hierarchy:
  466. current = yield [("RD", [current, i])]
  467. id_mappings[target] = current
  468. try:
  469. source = int(source)
  470. except:
  471. source = id_mappings[source]
  472. try:
  473. target = int(target)
  474. except:
  475. target = id_mappings[target]
  476. # Both nodes will normally be already present in the matching dictionary, so can just pass them along
  477. id_mappings[name] = yield [("CE", [source, target])]
  478. elif graph_type == "D":
  479. source, value, target = constructor.split(",",3)
  480. if value in complex_primitives:
  481. value = {"value": value}
  482. else:
  483. #TODO this is very dangerous!
  484. value = eval(value)
  485. if target[0] == "?" and target not in id_mappings:
  486. hierarchy = target[1:].split("/")
  487. current = yield [("RD", [root, "__hierarchy"])]
  488. for i in hierarchy:
  489. current = yield [("RD", [current, i])]
  490. id_mappings[target] = current
  491. try:
  492. source = int(source)
  493. except:
  494. source = id_mappings[source]
  495. try:
  496. target = int(target)
  497. except:
  498. target = id_mappings[target]
  499. yield [("CD", [source, value, target])]
  500. else:
  501. print("Unknown graph type: " + str(graph_type))
  502. raise PrimitiveFinished(id_mappings["auto_initial_IP"])
  503. def log(a, **remainder):
  504. a_value = yield [("RV", [a])]
  505. print("== LOG == " + str(a_value))
  506. raise PrimitiveFinished(a)