PyDecisionGraph 0.3.2.post1__cp315-cp315-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. decision_graph/__infra__.pxd +1 -0
  2. decision_graph/__init__.pxd +1 -0
  3. decision_graph/__init__.py +39 -0
  4. decision_graph/decision_tree/__init__.pxd +2 -0
  5. decision_graph/decision_tree/__init__.py +85 -0
  6. decision_graph/decision_tree/bake/__infra__.pxd +502 -0
  7. decision_graph/decision_tree/bake/__init__.pxd +502 -0
  8. decision_graph/decision_tree/bake/__init__.py +29 -0
  9. decision_graph/decision_tree/bake/c_action.cp315-win_amd64.pyd +0 -0
  10. decision_graph/decision_tree/bake/c_action.h +324 -0
  11. decision_graph/decision_tree/bake/c_action.pxd +54 -0
  12. decision_graph/decision_tree/bake/c_action.pyi +126 -0
  13. decision_graph/decision_tree/bake/c_action.pyx +65 -0
  14. decision_graph/decision_tree/bake/c_allocator_protocol.cp315-win_amd64.pyd +0 -0
  15. decision_graph/decision_tree/bake/c_allocator_protocol.pxd +24 -0
  16. decision_graph/decision_tree/bake/c_allocator_protocol.pyi +61 -0
  17. decision_graph/decision_tree/bake/c_allocator_protocol.pyx +109 -0
  18. decision_graph/decision_tree/bake/c_bake.cp315-win_amd64.pyd +0 -0
  19. decision_graph/decision_tree/bake/c_bake.h +629 -0
  20. decision_graph/decision_tree/bake/c_bake.pxd +52 -0
  21. decision_graph/decision_tree/bake/c_bake.pyi +151 -0
  22. decision_graph/decision_tree/bake/c_bake.pyx +142 -0
  23. decision_graph/decision_tree/bake/c_collections.cp315-win_amd64.pyd +0 -0
  24. decision_graph/decision_tree/bake/c_collections.h +692 -0
  25. decision_graph/decision_tree/bake/c_collections.pxd +52 -0
  26. decision_graph/decision_tree/bake/c_collections.pyi +193 -0
  27. decision_graph/decision_tree/bake/c_collections.pyx +161 -0
  28. decision_graph/decision_tree/bake/c_const.cp315-win_amd64.pyd +0 -0
  29. decision_graph/decision_tree/bake/c_const.h +395 -0
  30. decision_graph/decision_tree/bake/c_const.pxd +56 -0
  31. decision_graph/decision_tree/bake/c_const.pyi +305 -0
  32. decision_graph/decision_tree/bake/c_const.pyx +278 -0
  33. decision_graph/decision_tree/bake/c_edge.cp315-win_amd64.pyd +0 -0
  34. decision_graph/decision_tree/bake/c_edge.h +511 -0
  35. decision_graph/decision_tree/bake/c_edge.pxd +117 -0
  36. decision_graph/decision_tree/bake/c_edge.pyi +192 -0
  37. decision_graph/decision_tree/bake/c_edge.pyx +270 -0
  38. decision_graph/decision_tree/bake/c_eval.h +848 -0
  39. decision_graph/decision_tree/bake/c_eval.pxd +40 -0
  40. decision_graph/decision_tree/bake/c_expr.cp315-win_amd64.pyd +0 -0
  41. decision_graph/decision_tree/bake/c_expr.h +1900 -0
  42. decision_graph/decision_tree/bake/c_expr.pxd +129 -0
  43. decision_graph/decision_tree/bake/c_expr.pyi +280 -0
  44. decision_graph/decision_tree/bake/c_expr.pyx +272 -0
  45. decision_graph/decision_tree/bake/c_hierarchy.cp315-win_amd64.pyd +0 -0
  46. decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
  47. decision_graph/decision_tree/bake/c_hierarchy.pxd +71 -0
  48. decision_graph/decision_tree/bake/c_hierarchy.pyi +409 -0
  49. decision_graph/decision_tree/bake/c_hierarchy.pyx +277 -0
  50. decision_graph/decision_tree/bake/c_logic_group.cp315-win_amd64.pyd +0 -0
  51. decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
  52. decision_graph/decision_tree/bake/c_logic_group.pxd +162 -0
  53. decision_graph/decision_tree/bake/c_logic_group.pyi +264 -0
  54. decision_graph/decision_tree/bake/c_logic_group.pyx +308 -0
  55. decision_graph/decision_tree/bake/c_node.cp315-win_amd64.pyd +0 -0
  56. decision_graph/decision_tree/bake/c_node.h +2660 -0
  57. decision_graph/decision_tree/bake/c_node.pxd +381 -0
  58. decision_graph/decision_tree/bake/c_node.pyi +438 -0
  59. decision_graph/decision_tree/bake/c_node.pyx +639 -0
  60. decision_graph/decision_tree/bake/c_reconstruct.cp315-win_amd64.pyd +0 -0
  61. decision_graph/decision_tree/bake/c_reconstruct.pxd +63 -0
  62. decision_graph/decision_tree/bake/c_reconstruct.pyi +60 -0
  63. decision_graph/decision_tree/bake/c_reconstruct.pyx +252 -0
  64. decision_graph/decision_tree/bake/c_var.cp315-win_amd64.pyd +0 -0
  65. decision_graph/decision_tree/bake/c_var.h +2054 -0
  66. decision_graph/decision_tree/bake/c_var.pxd +205 -0
  67. decision_graph/decision_tree/bake/c_var.pyi +271 -0
  68. decision_graph/decision_tree/bake/c_var.pyx +228 -0
  69. decision_graph/decision_tree/capi/__infra__.pxd +33 -0
  70. decision_graph/decision_tree/capi/__init__.pxd +33 -0
  71. decision_graph/decision_tree/capi/__init__.py +57 -0
  72. decision_graph/decision_tree/capi/c_abc.cp315-win_amd64.pyd +0 -0
  73. decision_graph/decision_tree/capi/c_abc.pxd +246 -0
  74. decision_graph/decision_tree/capi/c_abc.pyi +770 -0
  75. decision_graph/decision_tree/capi/c_abc.pyx +1532 -0
  76. decision_graph/decision_tree/capi/c_collection.cp315-win_amd64.pyd +0 -0
  77. decision_graph/decision_tree/capi/c_collection.pxd +22 -0
  78. decision_graph/decision_tree/capi/c_collection.pyi +245 -0
  79. decision_graph/decision_tree/capi/c_collection.pyx +138 -0
  80. decision_graph/decision_tree/capi/c_node.cp315-win_amd64.pyd +0 -0
  81. decision_graph/decision_tree/capi/c_node.pxd +95 -0
  82. decision_graph/decision_tree/capi/c_node.pyi +492 -0
  83. decision_graph/decision_tree/capi/c_node.pyx +551 -0
  84. decision_graph/decision_tree/exc.py +189 -0
  85. decision_graph/decision_tree/native/__init__.py +57 -0
  86. decision_graph/decision_tree/native/abc.py +1167 -0
  87. decision_graph/decision_tree/native/collection.py +134 -0
  88. decision_graph/decision_tree/native/node.py +521 -0
  89. decision_graph/includes/decision_graph/decision_tree/bake/c_action.c +16320 -0
  90. decision_graph/includes/decision_graph/decision_tree/bake/c_action.h +324 -0
  91. decision_graph/includes/decision_graph/decision_tree/bake/c_allocator_protocol.c +12473 -0
  92. decision_graph/includes/decision_graph/decision_tree/bake/c_bake.c +16485 -0
  93. decision_graph/includes/decision_graph/decision_tree/bake/c_bake.h +629 -0
  94. decision_graph/includes/decision_graph/decision_tree/bake/c_collections.c +17381 -0
  95. decision_graph/includes/decision_graph/decision_tree/bake/c_collections.h +692 -0
  96. decision_graph/includes/decision_graph/decision_tree/bake/c_const.c +20815 -0
  97. decision_graph/includes/decision_graph/decision_tree/bake/c_const.h +395 -0
  98. decision_graph/includes/decision_graph/decision_tree/bake/c_edge.c +20696 -0
  99. decision_graph/includes/decision_graph/decision_tree/bake/c_edge.h +511 -0
  100. decision_graph/includes/decision_graph/decision_tree/bake/c_eval.h +848 -0
  101. decision_graph/includes/decision_graph/decision_tree/bake/c_expr.c +22065 -0
  102. decision_graph/includes/decision_graph/decision_tree/bake/c_expr.h +1900 -0
  103. decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.c +23267 -0
  104. decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
  105. decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.c +22434 -0
  106. decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
  107. decision_graph/includes/decision_graph/decision_tree/bake/c_node.c +28385 -0
  108. decision_graph/includes/decision_graph/decision_tree/bake/c_node.h +2660 -0
  109. decision_graph/includes/decision_graph/decision_tree/bake/c_reconstruct.c +15955 -0
  110. decision_graph/includes/decision_graph/decision_tree/bake/c_var.c +16881 -0
  111. decision_graph/includes/decision_graph/decision_tree/bake/c_var.h +2054 -0
  112. decision_graph/includes/decision_graph/decision_tree/capi/c_abc.c +59196 -0
  113. decision_graph/includes/decision_graph/decision_tree/capi/c_collection.c +19967 -0
  114. decision_graph/includes/decision_graph/decision_tree/capi/c_node.c +39229 -0
  115. decision_graph/logic_group/__init__.py +25 -0
  116. decision_graph/logic_group/base.py +100 -0
  117. decision_graph/logic_group/pending_request.py +384 -0
  118. decision_graph/webui/__init__.py +24 -0
  119. decision_graph/webui/bake/__init__.py +65 -0
  120. decision_graph/webui/bake/app.py +488 -0
  121. decision_graph/webui/bake/static/d3.v7.min.js +2 -0
  122. decision_graph/webui/bake/static/script.js +1440 -0
  123. decision_graph/webui/bake/static/style.css +920 -0
  124. decision_graph/webui/bake/templates/index.html +183 -0
  125. decision_graph/webui/bake/templates/offline.html +184 -0
  126. decision_graph/webui/capi/__init__.py +54 -0
  127. decision_graph/webui/capi/app.py +366 -0
  128. decision_graph/webui/capi/main.py +53 -0
  129. decision_graph/webui/capi/static/d3.v7.min.js +2 -0
  130. decision_graph/webui/capi/static/script.js +1026 -0
  131. decision_graph/webui/capi/static/style.css +656 -0
  132. decision_graph/webui/capi/templates/index.html +93 -0
  133. decision_graph/webui/capi/templates/offline.html +94 -0
  134. decision_graph/webui/native/__init__.py +54 -0
  135. decision_graph/webui/native/app.py +366 -0
  136. decision_graph/webui/native/main.py +53 -0
  137. decision_graph/webui/native/static/d3.v7.min.js +2 -0
  138. decision_graph/webui/native/static/script.js +1026 -0
  139. decision_graph/webui/native/static/style.css +656 -0
  140. decision_graph/webui/native/templates/index.html +93 -0
  141. decision_graph/webui/native/templates/offline.html +94 -0
  142. pydecisiongraph-0.3.2.post1.dist-info/METADATA +136 -0
  143. pydecisiongraph-0.3.2.post1.dist-info/RECORD +148 -0
  144. pydecisiongraph-0.3.2.post1.dist-info/WHEEL +5 -0
  145. pydecisiongraph-0.3.2.post1.dist-info/licenses/LICENSE +373 -0
  146. pydecisiongraph-0.3.2.post1.dist-info/top_level.txt +2 -0
  147. tests/bake_c_evaluator.cp315-win_amd64.pyd +0 -0
  148. tests/bake_eval_probe.cp315-win_amd64.pyd +0 -0
@@ -0,0 +1,63 @@
1
+ from libc.stdint cimport uintptr_t
2
+
3
+ from .c_action cimport ActionNode, CancelAction, ClearAction, LongAction, NoAction, ShortAction
4
+ from .c_collections cimport AttrExpression
5
+ from .c_const cimport ConstantNode, VariableNode
6
+ from .c_expr cimport BinaryExpression, ExpressionNode, TernaryExpression, UnaryExpression
7
+ from .c_hierarchy cimport BreakpointNode, RootLogicNode
8
+ from .c_node cimport LogicNode, NODE_REGISTRY, PlaceholderNode, dcg_node
9
+
10
+
11
+ cdef inline void c_dcg_node_attach_header(LogicNode node, dcg_node* header, bint owner):
12
+ cdef uintptr_t parent_address = 0
13
+
14
+ node.header = header
15
+ node.owner = owner
16
+ node.parent = None
17
+ if header.parent:
18
+ parent_address = <uintptr_t> header.parent
19
+ if parent_address in NODE_REGISTRY:
20
+ node.parent = NODE_REGISTRY[parent_address]
21
+
22
+
23
+ # === Variant Reconstruct ===
24
+
25
+ cdef ConstantNode c_dcg_node_reconstruct_const(dcg_node* header, bint owner=?)
26
+
27
+ cdef VariableNode c_dcg_node_reconstruct_variable(dcg_node* header, bint owner=?)
28
+
29
+ cdef AttrExpression c_dcg_node_reconstruct_attr(dcg_node* header, bint owner=?)
30
+
31
+ cdef ExpressionNode c_dcg_node_reconstruct_expr(dcg_node* header, bint owner=?)
32
+
33
+ cdef UnaryExpression c_dcg_node_reconstruct_unary(dcg_node* header, bint owner=?)
34
+
35
+ cdef BinaryExpression c_dcg_node_reconstruct_binary(dcg_node* header, bint owner=?)
36
+
37
+ cdef TernaryExpression c_dcg_node_reconstruct_ternary(dcg_node* header, bint owner=?)
38
+
39
+ cdef ActionNode c_dcg_node_reconstruct_action(dcg_node* header, bint owner=?)
40
+
41
+ cdef NoAction c_dcg_node_reconstruct_noaction(dcg_node* header, bint owner=?)
42
+
43
+ cdef LongAction c_dcg_node_reconstruct_longaction(dcg_node* header, bint owner=?)
44
+
45
+ cdef ShortAction c_dcg_node_reconstruct_shortaction(dcg_node* header, bint owner=?)
46
+
47
+ cdef CancelAction c_dcg_node_reconstruct_cancelaction(dcg_node* header, bint owner=?)
48
+
49
+ cdef ClearAction c_dcg_node_reconstruct_clearaction(dcg_node* header, bint owner=?)
50
+
51
+ cdef PlaceholderNode c_dcg_node_reconstruct_placeholder(dcg_node* header, bint owner=?)
52
+
53
+ cdef RootLogicNode c_dcg_node_reconstruct_root(dcg_node* header, bint owner=?)
54
+
55
+ cdef BreakpointNode c_dcg_node_reconstruct_breakpoint(dcg_node* header, bint owner=?)
56
+
57
+ # === Dispatch ===
58
+
59
+ cdef LogicNode c_dcg_node_reconstruct(dcg_node* header, bint owner=?)
60
+
61
+ cpdef LogicNode c_dcg_node_reconstruct_from_address(uintptr_t address, bint owner=?)
62
+
63
+ cpdef LogicNode c_dcg_node_root_from_address(uintptr_t address, bint owner=?)
@@ -0,0 +1,60 @@
1
+ """The way back: a node in C to the wrappers that stand for the graph it is in.
2
+
3
+ A graph is built from Python but lives in C, so a caller holding nothing but an
4
+ address - a process reading a graph out of memory another process shared, a
5
+ callback naming a node the C layer grew - needs the Python side back before
6
+ anything can be inspected or rendered.
7
+
8
+ A reconstruction restores the neighbourhood, not just the block: the node as the
9
+ class its type names, its children and their subtrees with the edges they hang
10
+ by, its parent and through it the whole graph up to the root, and what a family
11
+ carries beyond the edges - an expression's operands, a read's store, a
12
+ breakpoint's group.
13
+
14
+ Every wrapper the walk builds is registered, which is what makes one block one
15
+ Python object and what lets the walk terminate: a child asking for its parent
16
+ lands on the wrapper that is already there.
17
+
18
+ The variants themselves - one function per class, and the dispatch over them -
19
+ are ``cdef``, and not module attributes: this stub is the module's Python face.
20
+ """
21
+
22
+ from .c_node import LogicNode
23
+
24
+
25
+ def c_dcg_node_reconstruct_from_address(address: int, owner: bool = False) -> LogicNode:
26
+ """The wrapper for the node at an address, with its graph restored.
27
+
28
+ Args:
29
+ address: Address of the C node block. Zero is refused.
30
+ owner: Whether the wrapper for THAT node may free its block; the
31
+ wrappers the walk adds around it own nothing.
32
+
33
+ Returns:
34
+ The wrapper for the node, with its graph restored around it.
35
+
36
+ Raises:
37
+ ValueError: When the address is zero.
38
+ """
39
+ ...
40
+
41
+
42
+ def c_dcg_node_root_from_address(address: int, owner: bool = False) -> LogicNode:
43
+ """The graph's entry point above a node: its root, reconstructed.
44
+
45
+ A node reached in the middle of a graph is not the graph, and what a caller
46
+ with only an address usually wants is the top of it. The root is found in C,
47
+ by the parent chain, and reconstructed like any other node - which also means
48
+ everything between it and the address comes back on the way.
49
+
50
+ Args:
51
+ address: Address of a node in the graph.
52
+ owner: Whether the wrapper for the ROOT may free its block.
53
+
54
+ Returns:
55
+ The root of the graph the node is in.
56
+
57
+ Raises:
58
+ ValueError: When the address is zero.
59
+ """
60
+ ...
@@ -0,0 +1,252 @@
1
+ from libc.stdio cimport fflush, fprintf, stderr
2
+
3
+ from .c_const cimport dcg_variable_node
4
+ from .c_edge cimport EDGE_REGISTRY, NodeEdgeCondition
5
+ from .c_expr cimport dcg_expression_node
6
+ from .c_hierarchy cimport NodeEvalPathView, dcg_breakpoint_node, dcg_root_node
7
+ from .c_logic_group cimport GROUP_REGISTRY, dcg_logic_group
8
+ from .c_node cimport c_dcg_node_root, dcg_node_type
9
+ from .c_var cimport c_dcg_var_pyunpack
10
+
11
+
12
+ # ========== The Variants ==========
13
+
14
+ cdef ConstantNode c_dcg_node_reconstruct_const(dcg_node* header, bint owner=False):
15
+ cdef ConstantNode node = ConstantNode.__new__(ConstantNode)
16
+ c_dcg_node_attach_header(node, header, owner)
17
+ node.c_register_node()
18
+ return node
19
+
20
+
21
+ cdef VariableNode c_dcg_node_reconstruct_variable(dcg_node* header, bint owner=False):
22
+ cdef VariableNode node = VariableNode.__new__(VariableNode)
23
+ c_dcg_node_attach_header(node, header, owner)
24
+ node.c_register_node()
25
+ return node
26
+
27
+
28
+ cdef AttrExpression c_dcg_node_reconstruct_attr(dcg_node* header, bint owner=False):
29
+ cdef AttrExpression node = AttrExpression.__new__(AttrExpression)
30
+ cdef dcg_logic_group* group = (<dcg_variable_node*> header).logic_group
31
+
32
+ c_dcg_node_attach_header(node, header, owner)
33
+ node.c_register_node()
34
+ if group:
35
+ node.logic_group = <object> GROUP_REGISTRY[<uintptr_t> group]
36
+ return node
37
+
38
+
39
+ cdef void c_dcg_node_restore_operands(ExpressionNode node, dcg_expression_node* header):
40
+ cdef size_t i
41
+ cdef dcg_node** operands = header.components
42
+ cdef object value = None
43
+
44
+ node.c_components_alloc(header.n_args)
45
+ for i in range(header.n_args):
46
+ if operands and operands[i]:
47
+ node.c_components_assign(i, c_dcg_node_reconstruct(operands[i], False))
48
+ continue
49
+
50
+ value = c_dcg_var_pyunpack(&header.args[i])
51
+ if value is not None:
52
+ node.c_components_assign(i, ConstantNode(value))
53
+
54
+
55
+ cdef ExpressionNode c_dcg_node_reconstruct_expr(dcg_node* header, bint owner=False):
56
+ cdef ExpressionNode node = ExpressionNode.__new__(ExpressionNode)
57
+ c_dcg_node_attach_header(node, header, owner)
58
+ node.c_register_node()
59
+ c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
60
+ return node
61
+
62
+
63
+ cdef UnaryExpression c_dcg_node_reconstruct_unary(dcg_node* header, bint owner=False):
64
+ cdef UnaryExpression node = UnaryExpression.__new__(UnaryExpression)
65
+ c_dcg_node_attach_header(node, header, owner)
66
+ node.c_register_node()
67
+ c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
68
+ return node
69
+
70
+
71
+ cdef BinaryExpression c_dcg_node_reconstruct_binary(dcg_node* header, bint owner=False):
72
+ cdef BinaryExpression node = BinaryExpression.__new__(BinaryExpression)
73
+ c_dcg_node_attach_header(node, header, owner)
74
+ node.c_register_node()
75
+ c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
76
+ return node
77
+
78
+
79
+ cdef TernaryExpression c_dcg_node_reconstruct_ternary(dcg_node* header, bint owner=False):
80
+ cdef TernaryExpression node = TernaryExpression.__new__(TernaryExpression)
81
+ c_dcg_node_attach_header(node, header, owner)
82
+ node.c_register_node()
83
+ c_dcg_node_restore_operands(node, <dcg_expression_node*> header)
84
+ return node
85
+
86
+
87
+ cdef ActionNode c_dcg_node_reconstruct_action(dcg_node* header, bint owner=False):
88
+ cdef ActionNode node = ActionNode.__new__(ActionNode)
89
+ c_dcg_node_attach_header(node, header, owner)
90
+ node.c_register_node()
91
+ return node
92
+
93
+
94
+ cdef NoAction c_dcg_node_reconstruct_noaction(dcg_node* header, bint owner=False):
95
+ cdef NoAction node = NoAction.__new__(NoAction)
96
+ c_dcg_node_attach_header(node, header, owner)
97
+ node.c_register_node()
98
+ return node
99
+
100
+
101
+ cdef LongAction c_dcg_node_reconstruct_longaction(dcg_node* header, bint owner=False):
102
+ cdef LongAction node = LongAction.__new__(LongAction)
103
+ c_dcg_node_attach_header(node, header, owner)
104
+ node.c_register_node()
105
+ return node
106
+
107
+
108
+ cdef ShortAction c_dcg_node_reconstruct_shortaction(dcg_node* header, bint owner=False):
109
+ cdef ShortAction node = ShortAction.__new__(ShortAction)
110
+ c_dcg_node_attach_header(node, header, owner)
111
+ node.c_register_node()
112
+ return node
113
+
114
+
115
+ cdef CancelAction c_dcg_node_reconstruct_cancelaction(dcg_node* header, bint owner=False):
116
+ cdef CancelAction node = CancelAction.__new__(CancelAction)
117
+ c_dcg_node_attach_header(node, header, owner)
118
+ node.c_register_node()
119
+ return node
120
+
121
+
122
+ cdef ClearAction c_dcg_node_reconstruct_clearaction(dcg_node* header, bint owner=False):
123
+ cdef ClearAction node = ClearAction.__new__(ClearAction)
124
+ c_dcg_node_attach_header(node, header, owner)
125
+ node.c_register_node()
126
+ return node
127
+
128
+
129
+ cdef PlaceholderNode c_dcg_node_reconstruct_placeholder(dcg_node* header, bint owner=False):
130
+ cdef PlaceholderNode node = PlaceholderNode.__new__(PlaceholderNode)
131
+ c_dcg_node_attach_header(node, header, owner)
132
+ node.c_register_node()
133
+ return node
134
+
135
+
136
+ cdef RootLogicNode c_dcg_node_reconstruct_root(dcg_node* header, bint owner=False):
137
+ cdef RootLogicNode node = RootLogicNode.__new__(RootLogicNode)
138
+ cdef dcg_root_node* root = <dcg_root_node*> header
139
+ c_dcg_node_attach_header(node, header, owner)
140
+ node.eval_path = NodeEvalPathView.c_from_header(&root.eval_path)
141
+ node.c_register_node()
142
+ return node
143
+
144
+
145
+ cdef BreakpointNode c_dcg_node_reconstruct_breakpoint(dcg_node* header, bint owner=False):
146
+ cdef BreakpointNode node = BreakpointNode.__new__(BreakpointNode)
147
+ cdef dcg_logic_group* group = (<dcg_breakpoint_node*> header).break_from
148
+
149
+ c_dcg_node_attach_header(node, header, owner)
150
+ node.c_register_node()
151
+ if group:
152
+ node.break_from = <object> GROUP_REGISTRY[<uintptr_t> group]
153
+ return node
154
+
155
+
156
+ # ========== The Walk ==========
157
+
158
+ cdef void c_dcg_node_restore_edges(LogicNode node, dcg_node* header):
159
+ cdef dcg_node* child = header.children
160
+ cdef LogicNode child_node
161
+ cdef NodeEdgeCondition condition
162
+
163
+ while child:
164
+ condition = <NodeEdgeCondition> EDGE_REGISTRY[<uintptr_t> child.condition_to_parent]
165
+ child_node = c_dcg_node_reconstruct(child, False)
166
+
167
+ node.children[condition] = child_node
168
+ child_node.parent = node
169
+ child_node.condition_to_parent = condition
170
+
171
+ child = child.next_sibling
172
+
173
+ if header.parent:
174
+ node.parent = c_dcg_node_reconstruct(header.parent, False)
175
+
176
+
177
+ cdef LogicNode c_dcg_node_reconstruct(dcg_node* header, bint owner=False):
178
+ if not header:
179
+ raise ValueError('A NULL header is not a node: there is nothing to reconstruct.')
180
+
181
+ cdef uintptr_t address = <uintptr_t> header
182
+ if address in NODE_REGISTRY:
183
+ return NODE_REGISTRY[address]
184
+
185
+ cdef dcg_node_type ntype = header.ntype
186
+ cdef LogicNode node
187
+
188
+ # The input family: the literals, then the read.
189
+ if ntype == dcg_node_type.DCG_NODE_INPUT or ntype == dcg_node_type.DCG_NODE_TRUE or ntype == dcg_node_type.DCG_NODE_FALSE or ntype == dcg_node_type.DCG_NODE_DOUBLE or ntype == dcg_node_type.DCG_NODE_STRING or ntype == dcg_node_type.DCG_NODE_INT:
190
+ node = c_dcg_node_reconstruct_const(header, owner)
191
+ elif ntype == dcg_node_type.DCG_NODE_VARIABLE:
192
+ # A read names the group it reads and a plain variable names none, so
193
+ # the node's own state is what tells the two classes apart - the type
194
+ # they share cannot.
195
+ node = c_dcg_node_reconstruct_attr(header, owner) if (<dcg_variable_node*> header).logic_group else c_dcg_node_reconstruct_variable(header, owner)
196
+ # The operator family, by arity.
197
+ elif ntype == dcg_node_type.DCG_NODE_OP:
198
+ node = c_dcg_node_reconstruct_expr(header, owner)
199
+ elif ntype == dcg_node_type.DCG_NODE_UNARY:
200
+ node = c_dcg_node_reconstruct_unary(header, owner)
201
+ elif ntype == dcg_node_type.DCG_NODE_BINARY:
202
+ node = c_dcg_node_reconstruct_binary(header, owner)
203
+ elif ntype == dcg_node_type.DCG_NODE_TERNARY:
204
+ node = c_dcg_node_reconstruct_ternary(header, owner)
205
+ # The action family, by kind.
206
+ elif ntype == dcg_node_type.DCG_NODE_ACTION:
207
+ node = c_dcg_node_reconstruct_action(header, owner)
208
+ elif ntype == dcg_node_type.DCG_NODE_NOACTION:
209
+ node = c_dcg_node_reconstruct_noaction(header, owner)
210
+ elif ntype == dcg_node_type.DCG_NODE_LONGACTION:
211
+ node = c_dcg_node_reconstruct_longaction(header, owner)
212
+ elif ntype == dcg_node_type.DCG_NODE_SHORTACTION:
213
+ node = c_dcg_node_reconstruct_shortaction(header, owner)
214
+ elif ntype == dcg_node_type.DCG_NODE_CANCELACTION:
215
+ node = c_dcg_node_reconstruct_cancelaction(header, owner)
216
+ elif ntype == dcg_node_type.DCG_NODE_CLEARACTION:
217
+ node = c_dcg_node_reconstruct_clearaction(header, owner)
218
+ elif ntype == dcg_node_type.DCG_NODE_PLACEHOLDER:
219
+ node = c_dcg_node_reconstruct_placeholder(header, owner)
220
+ # The special family.
221
+ elif ntype == dcg_node_type.DCG_NODE_ROOT:
222
+ node = c_dcg_node_reconstruct_root(header, owner)
223
+ elif ntype == dcg_node_type.DCG_NODE_BREAKPOINT:
224
+ node = c_dcg_node_reconstruct_breakpoint(header, owner)
225
+ else:
226
+ # Nothing claims the type, and the difference matters. Two cases reach
227
+ # here with a reason, and both are answered by the generic view: a family
228
+ # head with no variant of its own (DCG_NODE_SPECIAL), and a CALL, whose
229
+ # callee is composed into the node's display text and stored nowhere - a
230
+ # rebuilt call node would not know what it calls. A variant nothing
231
+ # claims is a type this module was never taught, and that is reported
232
+ # rather than silently wrapped as something it is not.
233
+ if ntype != dcg_node_type.DCG_NODE_SPECIAL and ntype != dcg_node_type.DCG_NODE_CALL:
234
+ fprintf(
235
+ stderr, "[DCG] c_dcg_node_reconstruct: node type 0x%x has no reconstruction variant - wrapping it as the base node\n", <unsigned int> ntype
236
+ )
237
+ fflush(stderr)
238
+ node = LogicNode.c_from_header(header, owner)
239
+ node.c_register_node()
240
+
241
+ c_dcg_node_restore_edges(node, header)
242
+ return node
243
+
244
+
245
+ # ========== The Proxies ==========
246
+
247
+ cpdef LogicNode c_dcg_node_reconstruct_from_address(uintptr_t address, bint owner=False):
248
+ return c_dcg_node_reconstruct(<dcg_node*> address, owner)
249
+
250
+
251
+ cpdef LogicNode c_dcg_node_root_from_address(uintptr_t address, bint owner=False):
252
+ return c_dcg_node_reconstruct(c_dcg_node_root(<dcg_node*> address), owner)