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.
- decision_graph/__infra__.pxd +1 -0
- decision_graph/__init__.pxd +1 -0
- decision_graph/__init__.py +39 -0
- decision_graph/decision_tree/__init__.pxd +2 -0
- decision_graph/decision_tree/__init__.py +85 -0
- decision_graph/decision_tree/bake/__infra__.pxd +502 -0
- decision_graph/decision_tree/bake/__init__.pxd +502 -0
- decision_graph/decision_tree/bake/__init__.py +29 -0
- decision_graph/decision_tree/bake/c_action.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_action.h +324 -0
- decision_graph/decision_tree/bake/c_action.pxd +54 -0
- decision_graph/decision_tree/bake/c_action.pyi +126 -0
- decision_graph/decision_tree/bake/c_action.pyx +65 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pxd +24 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pyi +61 -0
- decision_graph/decision_tree/bake/c_allocator_protocol.pyx +109 -0
- decision_graph/decision_tree/bake/c_bake.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_bake.h +629 -0
- decision_graph/decision_tree/bake/c_bake.pxd +52 -0
- decision_graph/decision_tree/bake/c_bake.pyi +151 -0
- decision_graph/decision_tree/bake/c_bake.pyx +142 -0
- decision_graph/decision_tree/bake/c_collections.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_collections.h +692 -0
- decision_graph/decision_tree/bake/c_collections.pxd +52 -0
- decision_graph/decision_tree/bake/c_collections.pyi +193 -0
- decision_graph/decision_tree/bake/c_collections.pyx +161 -0
- decision_graph/decision_tree/bake/c_const.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_const.h +395 -0
- decision_graph/decision_tree/bake/c_const.pxd +56 -0
- decision_graph/decision_tree/bake/c_const.pyi +305 -0
- decision_graph/decision_tree/bake/c_const.pyx +278 -0
- decision_graph/decision_tree/bake/c_edge.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_edge.h +511 -0
- decision_graph/decision_tree/bake/c_edge.pxd +117 -0
- decision_graph/decision_tree/bake/c_edge.pyi +192 -0
- decision_graph/decision_tree/bake/c_edge.pyx +270 -0
- decision_graph/decision_tree/bake/c_eval.h +848 -0
- decision_graph/decision_tree/bake/c_eval.pxd +40 -0
- decision_graph/decision_tree/bake/c_expr.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_expr.h +1900 -0
- decision_graph/decision_tree/bake/c_expr.pxd +129 -0
- decision_graph/decision_tree/bake/c_expr.pyi +280 -0
- decision_graph/decision_tree/bake/c_expr.pyx +272 -0
- decision_graph/decision_tree/bake/c_hierarchy.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
- decision_graph/decision_tree/bake/c_hierarchy.pxd +71 -0
- decision_graph/decision_tree/bake/c_hierarchy.pyi +409 -0
- decision_graph/decision_tree/bake/c_hierarchy.pyx +277 -0
- decision_graph/decision_tree/bake/c_logic_group.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
- decision_graph/decision_tree/bake/c_logic_group.pxd +162 -0
- decision_graph/decision_tree/bake/c_logic_group.pyi +264 -0
- decision_graph/decision_tree/bake/c_logic_group.pyx +308 -0
- decision_graph/decision_tree/bake/c_node.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_node.h +2660 -0
- decision_graph/decision_tree/bake/c_node.pxd +381 -0
- decision_graph/decision_tree/bake/c_node.pyi +438 -0
- decision_graph/decision_tree/bake/c_node.pyx +639 -0
- decision_graph/decision_tree/bake/c_reconstruct.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_reconstruct.pxd +63 -0
- decision_graph/decision_tree/bake/c_reconstruct.pyi +60 -0
- decision_graph/decision_tree/bake/c_reconstruct.pyx +252 -0
- decision_graph/decision_tree/bake/c_var.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/bake/c_var.h +2054 -0
- decision_graph/decision_tree/bake/c_var.pxd +205 -0
- decision_graph/decision_tree/bake/c_var.pyi +271 -0
- decision_graph/decision_tree/bake/c_var.pyx +228 -0
- decision_graph/decision_tree/capi/__infra__.pxd +33 -0
- decision_graph/decision_tree/capi/__init__.pxd +33 -0
- decision_graph/decision_tree/capi/__init__.py +57 -0
- decision_graph/decision_tree/capi/c_abc.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_abc.pxd +246 -0
- decision_graph/decision_tree/capi/c_abc.pyi +770 -0
- decision_graph/decision_tree/capi/c_abc.pyx +1532 -0
- decision_graph/decision_tree/capi/c_collection.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_collection.pxd +22 -0
- decision_graph/decision_tree/capi/c_collection.pyi +245 -0
- decision_graph/decision_tree/capi/c_collection.pyx +138 -0
- decision_graph/decision_tree/capi/c_node.cp315-win_amd64.pyd +0 -0
- decision_graph/decision_tree/capi/c_node.pxd +95 -0
- decision_graph/decision_tree/capi/c_node.pyi +492 -0
- decision_graph/decision_tree/capi/c_node.pyx +551 -0
- decision_graph/decision_tree/exc.py +189 -0
- decision_graph/decision_tree/native/__init__.py +57 -0
- decision_graph/decision_tree/native/abc.py +1167 -0
- decision_graph/decision_tree/native/collection.py +134 -0
- decision_graph/decision_tree/native/node.py +521 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_action.c +16320 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_action.h +324 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_allocator_protocol.c +12473 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_bake.c +16485 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_bake.h +629 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_collections.c +17381 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_collections.h +692 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_const.c +20815 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_const.h +395 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_edge.c +20696 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_edge.h +511 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_eval.h +848 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_expr.c +22065 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_expr.h +1900 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.c +23267 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_hierarchy.h +731 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.c +22434 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_logic_group.h +1226 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_node.c +28385 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_node.h +2660 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_reconstruct.c +15955 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_var.c +16881 -0
- decision_graph/includes/decision_graph/decision_tree/bake/c_var.h +2054 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_abc.c +59196 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_collection.c +19967 -0
- decision_graph/includes/decision_graph/decision_tree/capi/c_node.c +39229 -0
- decision_graph/logic_group/__init__.py +25 -0
- decision_graph/logic_group/base.py +100 -0
- decision_graph/logic_group/pending_request.py +384 -0
- decision_graph/webui/__init__.py +24 -0
- decision_graph/webui/bake/__init__.py +65 -0
- decision_graph/webui/bake/app.py +488 -0
- decision_graph/webui/bake/static/d3.v7.min.js +2 -0
- decision_graph/webui/bake/static/script.js +1440 -0
- decision_graph/webui/bake/static/style.css +920 -0
- decision_graph/webui/bake/templates/index.html +183 -0
- decision_graph/webui/bake/templates/offline.html +184 -0
- decision_graph/webui/capi/__init__.py +54 -0
- decision_graph/webui/capi/app.py +366 -0
- decision_graph/webui/capi/main.py +53 -0
- decision_graph/webui/capi/static/d3.v7.min.js +2 -0
- decision_graph/webui/capi/static/script.js +1026 -0
- decision_graph/webui/capi/static/style.css +656 -0
- decision_graph/webui/capi/templates/index.html +93 -0
- decision_graph/webui/capi/templates/offline.html +94 -0
- decision_graph/webui/native/__init__.py +54 -0
- decision_graph/webui/native/app.py +366 -0
- decision_graph/webui/native/main.py +53 -0
- decision_graph/webui/native/static/d3.v7.min.js +2 -0
- decision_graph/webui/native/static/script.js +1026 -0
- decision_graph/webui/native/static/style.css +656 -0
- decision_graph/webui/native/templates/index.html +93 -0
- decision_graph/webui/native/templates/offline.html +94 -0
- pydecisiongraph-0.3.2.post1.dist-info/METADATA +136 -0
- pydecisiongraph-0.3.2.post1.dist-info/RECORD +148 -0
- pydecisiongraph-0.3.2.post1.dist-info/WHEEL +5 -0
- pydecisiongraph-0.3.2.post1.dist-info/licenses/LICENSE +373 -0
- pydecisiongraph-0.3.2.post1.dist-info/top_level.txt +2 -0
- tests/bake_c_evaluator.cp315-win_amd64.pyd +0 -0
- tests/bake_eval_probe.cp315-win_amd64.pyd +0 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from libcpp cimport bool as c_bool
|
|
2
|
+
|
|
3
|
+
from cbase.allocator_protocol cimport allocator_protocol
|
|
4
|
+
from cbase.bytemap cimport BoundByteMap, bytemap
|
|
5
|
+
|
|
6
|
+
from .c_hierarchy cimport dcg_breakpoint_node, dcg_root_node
|
|
7
|
+
from .c_node cimport LogicNode, dcg_node
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
cdef extern from "decision_graph/decision_tree/bake/c_logic_group.h":
|
|
11
|
+
const size_t DCG_LGM_DEFAULT_CAPACITY
|
|
12
|
+
|
|
13
|
+
ctypedef enum dcg_logic_group_type:
|
|
14
|
+
DCG_LG_BASE
|
|
15
|
+
DCG_LG_MAPPING
|
|
16
|
+
|
|
17
|
+
ctypedef struct dcg_logic_group:
|
|
18
|
+
dcg_logic_group_type lgtype
|
|
19
|
+
const char* name
|
|
20
|
+
dcg_logic_group* parent
|
|
21
|
+
|
|
22
|
+
ctypedef struct dcg_lgm_state:
|
|
23
|
+
dcg_logic_group** groups
|
|
24
|
+
size_t n_groups
|
|
25
|
+
size_t groups_capacity
|
|
26
|
+
dcg_node** nodes
|
|
27
|
+
size_t n_nodes
|
|
28
|
+
size_t nodes_capacity
|
|
29
|
+
dcg_breakpoint_node** breakpoints
|
|
30
|
+
size_t n_breakpoints
|
|
31
|
+
size_t breakpoints_capacity
|
|
32
|
+
c_bool inspection_mode
|
|
33
|
+
c_bool vigilant_mode
|
|
34
|
+
|
|
35
|
+
ctypedef struct dcg_action_node:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
ctypedef enum dcg_node_type:
|
|
39
|
+
DCG_NODE_NOACTION
|
|
40
|
+
|
|
41
|
+
ctypedef struct dcg_logic_group_manager:
|
|
42
|
+
allocator_protocol* allocator
|
|
43
|
+
bytemap registry
|
|
44
|
+
dcg_logic_group** groups
|
|
45
|
+
size_t n_groups
|
|
46
|
+
size_t groups_capacity
|
|
47
|
+
dcg_node** nodes
|
|
48
|
+
size_t n_nodes
|
|
49
|
+
size_t nodes_capacity
|
|
50
|
+
dcg_breakpoint_node** breakpoints
|
|
51
|
+
size_t n_breakpoints
|
|
52
|
+
size_t breakpoints_capacity
|
|
53
|
+
dcg_lgm_state* shelved
|
|
54
|
+
size_t n_shelved
|
|
55
|
+
size_t shelved_capacity
|
|
56
|
+
c_bool inspection_mode
|
|
57
|
+
c_bool vigilant_mode
|
|
58
|
+
|
|
59
|
+
const char* c_dcg_logic_group_type_name(dcg_logic_group_type lgtype) noexcept nogil
|
|
60
|
+
|
|
61
|
+
void* c_dcg_lgm_reserve(void** block, size_t* capacity, size_t count, size_t element_size, allocator_protocol* allocator) noexcept nogil
|
|
62
|
+
int c_dcg_lgm_push_group(dcg_logic_group_manager* mgr, dcg_logic_group* group) noexcept nogil
|
|
63
|
+
int c_dcg_lgm_push_node(dcg_logic_group_manager* mgr, dcg_node* node) noexcept nogil
|
|
64
|
+
int c_dcg_lgm_push_breakpoint(dcg_logic_group_manager* mgr, dcg_breakpoint_node* breakpoint) noexcept nogil
|
|
65
|
+
|
|
66
|
+
int c_dcg_logic_group_init(dcg_logic_group* group, dcg_logic_group_type lgtype, const char* name) noexcept nogil
|
|
67
|
+
dcg_logic_group* c_dcg_logic_group_new(dcg_logic_group_type lgtype, const char* name, allocator_protocol* allocator) noexcept nogil
|
|
68
|
+
void c_dcg_logic_group_dealloc(dcg_logic_group* group) noexcept nogil
|
|
69
|
+
void c_dcg_logic_group_free(dcg_logic_group* group) noexcept nogil
|
|
70
|
+
|
|
71
|
+
dcg_logic_group_manager* c_dcg_lgm_new(allocator_protocol* allocator) noexcept nogil
|
|
72
|
+
int c_dcg_lgm_init(dcg_logic_group_manager* mgr, allocator_protocol* allocator) noexcept nogil
|
|
73
|
+
void c_dcg_lgm_dealloc(dcg_logic_group_manager* mgr) noexcept nogil
|
|
74
|
+
void c_dcg_lgm_free(dcg_logic_group_manager* mgr) noexcept nogil
|
|
75
|
+
void c_dcg_lgm_clear(dcg_logic_group_manager* mgr) noexcept nogil
|
|
76
|
+
|
|
77
|
+
int c_dcg_lgm_register(dcg_logic_group_manager* mgr, dcg_logic_group* group) noexcept nogil
|
|
78
|
+
dcg_logic_group* c_dcg_lgm_find(const dcg_logic_group_manager* mgr, const char* name, size_t name_len) noexcept nogil
|
|
79
|
+
|
|
80
|
+
int c_dcg_lgm_enter_group(dcg_logic_group_manager* mgr, dcg_logic_group* group) noexcept nogil
|
|
81
|
+
int c_dcg_lgm_exit_group(dcg_logic_group_manager* mgr, dcg_logic_group* group) noexcept nogil
|
|
82
|
+
int c_dcg_lgm_enter_node(dcg_logic_group_manager* mgr, dcg_node* node) noexcept nogil
|
|
83
|
+
int c_dcg_lgm_connect_awaiting(dcg_logic_group_manager* mgr, dcg_node* node) noexcept nogil
|
|
84
|
+
int c_dcg_lgm_exit_node(dcg_logic_group_manager* mgr, dcg_node* node) noexcept nogil
|
|
85
|
+
int c_dcg_lgm_label_node(dcg_logic_group_manager* mgr, dcg_node* node) noexcept nogil
|
|
86
|
+
int c_dcg_lgm_install_breakpoint(dcg_logic_group_manager* mgr, dcg_breakpoint_node* breakpoint) noexcept nogil
|
|
87
|
+
int c_dcg_lgm_break_inspection(dcg_logic_group_manager* mgr, dcg_logic_group* group) noexcept nogil
|
|
88
|
+
|
|
89
|
+
int c_dcg_node_root_ctx_shelve(dcg_root_node* root, dcg_logic_group_manager* mgr) noexcept nogil
|
|
90
|
+
int c_dcg_node_root_ctx_unshelve(dcg_root_node* root, dcg_logic_group_manager* mgr) noexcept nogil
|
|
91
|
+
int c_dcg_lgm_shelve(dcg_logic_group_manager* mgr) noexcept nogil
|
|
92
|
+
int c_dcg_lgm_unshelve(dcg_logic_group_manager* mgr) noexcept nogil
|
|
93
|
+
|
|
94
|
+
dcg_logic_group* c_dcg_lgm_active_group(const dcg_logic_group_manager* mgr) noexcept nogil
|
|
95
|
+
dcg_node* c_dcg_lgm_active_node(const dcg_logic_group_manager* mgr) noexcept nogil
|
|
96
|
+
size_t c_dcg_lgm_breakpoint_count(const dcg_logic_group_manager* mgr) noexcept nogil
|
|
97
|
+
|
|
98
|
+
int c_dcg_node_auto_connect(dcg_node* node, dcg_logic_group_manager* mgr) noexcept nogil
|
|
99
|
+
dcg_action_node* c_dcg_node_connect_new_action(dcg_node_type action_type, const char* repr, c_bool auto_connect, ssize_t sig, void* action_data, dcg_logic_group_manager* mgr, allocator_protocol* allocator) noexcept nogil
|
|
100
|
+
dcg_action_node* c_dcg_node_connect_new_action_trade(dcg_node_type action_type, c_bool auto_connect, dcg_logic_group_manager* mgr, allocator_protocol* allocator) noexcept nogil
|
|
101
|
+
dcg_action_node* c_dcg_node_connect_new_action_clear(c_bool auto_connect, dcg_logic_group_manager* mgr, allocator_protocol* allocator) noexcept nogil
|
|
102
|
+
dcg_node* c_dcg_node_connect_new_placeholder(c_bool auto_connect, dcg_logic_group_manager* mgr, allocator_protocol* allocator) noexcept nogil
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
cdef class LogicGroupNameRegistry(BoundByteMap):
|
|
106
|
+
cdef void* _ws_key_buf
|
|
107
|
+
|
|
108
|
+
@staticmethod
|
|
109
|
+
cdef LogicGroupNameRegistry c_from_header(dcg_logic_group_manager* header, bint owner=?)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
cdef class LogicGroupManager:
|
|
113
|
+
cdef dcg_logic_group_manager* header
|
|
114
|
+
cdef bint owner
|
|
115
|
+
|
|
116
|
+
cdef list node_stack
|
|
117
|
+
|
|
118
|
+
cdef readonly LogicGroupNameRegistry registry
|
|
119
|
+
|
|
120
|
+
cdef void c_register(self, dcg_logic_group* group)
|
|
121
|
+
|
|
122
|
+
cdef dcg_logic_group* c_find(self, const char* name)
|
|
123
|
+
|
|
124
|
+
cdef void c_enter_group(self, dcg_logic_group* group)
|
|
125
|
+
|
|
126
|
+
cdef void c_exit_group(self, dcg_logic_group* group)
|
|
127
|
+
|
|
128
|
+
cdef int c_label_node(self, dcg_node* node)
|
|
129
|
+
|
|
130
|
+
cdef void c_break_inspection(self, dcg_logic_group* group)
|
|
131
|
+
|
|
132
|
+
cdef void c_shelve(self)
|
|
133
|
+
|
|
134
|
+
cdef void c_unshelve(self)
|
|
135
|
+
|
|
136
|
+
cpdef void node_stack_append(self, LogicNode node)
|
|
137
|
+
|
|
138
|
+
cpdef void node_stack_pop(self, LogicNode node)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
cdef LogicGroupManager LGM
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
cdef class LogicGroup:
|
|
145
|
+
cdef dcg_logic_group* header
|
|
146
|
+
cdef bint owner
|
|
147
|
+
|
|
148
|
+
@staticmethod
|
|
149
|
+
cdef inline LogicGroup c_from_header(dcg_logic_group* header, bint owner=False)
|
|
150
|
+
|
|
151
|
+
cdef void c_free_header(self)
|
|
152
|
+
|
|
153
|
+
cdef void c_break(self, dcg_logic_group* scope)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
cdef class LogicGroupWrapperRegistry(BoundByteMap):
|
|
157
|
+
cdef void* _ws_key_buf
|
|
158
|
+
|
|
159
|
+
@staticmethod
|
|
160
|
+
cdef LogicGroupWrapperRegistry c_from_header(bytemap* header, bint owner=?)
|
|
161
|
+
|
|
162
|
+
cdef LogicGroupWrapperRegistry GROUP_REGISTRY
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"""The logic group layer: the scopes a graph is built inside, and the manager.
|
|
2
|
+
|
|
3
|
+
A logic group is a scope, not a node: it carries a name, a type and a parent, and
|
|
4
|
+
a build entered into it is inside it. The manager is the build's state - which
|
|
5
|
+
group is active, which node is active, what has been entered and not yet left -
|
|
6
|
+
and it is what a `with` block talks to.
|
|
7
|
+
|
|
8
|
+
Groups register themselves with the manager under their name, and by their
|
|
9
|
+
address in the wrapper registry, so a group reached from C comes back as the
|
|
10
|
+
instance the build made.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from typing import Any, Self
|
|
14
|
+
|
|
15
|
+
from cbase.bytemap import BoundByteMap
|
|
16
|
+
|
|
17
|
+
from .c_node import LogicNode
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class LogicGroupNameRegistry(BoundByteMap):
|
|
21
|
+
"""The manager's name index: a group's name to the group itself."""
|
|
22
|
+
|
|
23
|
+
def __getitem__(self, key: str) -> LogicGroup:
|
|
24
|
+
"""The group registered under a name.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
key: The group's name.
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
The group wrapper registered under it.
|
|
31
|
+
|
|
32
|
+
Raises:
|
|
33
|
+
KeyError: When no group is registered under that name.
|
|
34
|
+
"""
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class LogicGroupManager:
|
|
39
|
+
"""The state of a build: the stacks of groups, nodes and breakpoints.
|
|
40
|
+
|
|
41
|
+
It is the caller's struct, not an allocated block, and it keeps the
|
|
42
|
+
allocator it was initialised with. A node entered with the `with` statement
|
|
43
|
+
is placed by this manager - into the active node's reserved arm - and the
|
|
44
|
+
manager knows the group a node belongs to.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self) -> None:
|
|
48
|
+
"""Initialize an empty manager: no groups, no nodes, no breakpoints."""
|
|
49
|
+
...
|
|
50
|
+
|
|
51
|
+
def register(self, group: LogicGroup) -> None:
|
|
52
|
+
"""Register a group under its name and its address.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
group: Group to register - by name when it has one, always by
|
|
56
|
+
address.
|
|
57
|
+
"""
|
|
58
|
+
...
|
|
59
|
+
|
|
60
|
+
def find(self, name: str) -> LogicGroup | None:
|
|
61
|
+
"""The group registered under a name.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
name: The group's name.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
The group, or None when no group is registered under that name.
|
|
68
|
+
"""
|
|
69
|
+
...
|
|
70
|
+
|
|
71
|
+
def shelve(self) -> None:
|
|
72
|
+
"""Put the current build away, to be taken back by ``unshelve``."""
|
|
73
|
+
...
|
|
74
|
+
|
|
75
|
+
def unshelve(self) -> None:
|
|
76
|
+
"""Take back a build that was shelved."""
|
|
77
|
+
...
|
|
78
|
+
|
|
79
|
+
def clear(self) -> None:
|
|
80
|
+
"""Empty the manager: every stack, shelved state included."""
|
|
81
|
+
...
|
|
82
|
+
|
|
83
|
+
def label_node(self, node: LogicNode) -> None:
|
|
84
|
+
"""Label a node with the names of the groups it was built inside.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
node: Node to label.
|
|
88
|
+
"""
|
|
89
|
+
...
|
|
90
|
+
|
|
91
|
+
def node_stack_append(self, node: LogicNode) -> None:
|
|
92
|
+
"""Push a node onto the manager's node stack.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
node: Node being entered.
|
|
96
|
+
"""
|
|
97
|
+
...
|
|
98
|
+
|
|
99
|
+
def node_stack_pop(self, node: LogicNode) -> None:
|
|
100
|
+
"""Pop a node off the manager's node stack.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
node: Node being left.
|
|
104
|
+
"""
|
|
105
|
+
...
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def registry(self) -> LogicGroupNameRegistry:
|
|
109
|
+
"""The manager's own name index."""
|
|
110
|
+
...
|
|
111
|
+
|
|
112
|
+
@property
|
|
113
|
+
def inspection_mode(self) -> bool:
|
|
114
|
+
"""Whether a build records the path an evaluation takes."""
|
|
115
|
+
...
|
|
116
|
+
|
|
117
|
+
@inspection_mode.setter
|
|
118
|
+
def inspection_mode(self, value: bool) -> None:
|
|
119
|
+
"""Set the inspection flag."""
|
|
120
|
+
...
|
|
121
|
+
|
|
122
|
+
@property
|
|
123
|
+
def vigilant_mode(self) -> bool:
|
|
124
|
+
"""Whether the layer reports a mistake where it is made."""
|
|
125
|
+
...
|
|
126
|
+
|
|
127
|
+
@vigilant_mode.setter
|
|
128
|
+
def vigilant_mode(self, value: bool) -> None:
|
|
129
|
+
"""Set the vigilant flag."""
|
|
130
|
+
...
|
|
131
|
+
|
|
132
|
+
@property
|
|
133
|
+
def active_group(self) -> LogicGroup | None:
|
|
134
|
+
"""The group a build is currently inside, or None outside any group."""
|
|
135
|
+
...
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def active_node(self) -> LogicNode | None:
|
|
139
|
+
"""The node a build is currently inside, or None outside any node."""
|
|
140
|
+
...
|
|
141
|
+
|
|
142
|
+
@property
|
|
143
|
+
def address(self) -> int:
|
|
144
|
+
"""The manager's own address, which is how the layer names it to C."""
|
|
145
|
+
...
|
|
146
|
+
|
|
147
|
+
@property
|
|
148
|
+
def n_groups(self) -> int:
|
|
149
|
+
"""How many groups are entered."""
|
|
150
|
+
...
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def n_nodes(self) -> int:
|
|
154
|
+
"""How many nodes are entered."""
|
|
155
|
+
...
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def n_breakpoints(self) -> int:
|
|
159
|
+
"""How many breakpoints are queued and waiting."""
|
|
160
|
+
...
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class LogicGroup:
|
|
164
|
+
"""A scope a graph is built inside.
|
|
165
|
+
|
|
166
|
+
A group carries a name, a type and a parent, and a build entered into it is
|
|
167
|
+
inside it - `with group:` enters, and leaving restores whatever was active
|
|
168
|
+
before.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
def __init__(self, *, name: str | None = None, parent: LogicGroup | None = None, **kwargs: Any) -> None:
|
|
172
|
+
"""Build a group of the base type.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
name: The group's name.
|
|
176
|
+
parent: The group it is built inside, if any.
|
|
177
|
+
|
|
178
|
+
Raises:
|
|
179
|
+
MemoryError: When the block cannot be allocated.
|
|
180
|
+
"""
|
|
181
|
+
...
|
|
182
|
+
|
|
183
|
+
def __repr__(self) -> str:
|
|
184
|
+
"""The group's own text: its class and its name."""
|
|
185
|
+
...
|
|
186
|
+
|
|
187
|
+
def __enter__(self) -> Self:
|
|
188
|
+
"""Enter the group as the scope of the build inside it.
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
This group.
|
|
192
|
+
"""
|
|
193
|
+
...
|
|
194
|
+
|
|
195
|
+
def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> bool:
|
|
196
|
+
"""Leave the group, restoring what was active before it.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
False, so an exception raised inside the block keeps travelling.
|
|
200
|
+
"""
|
|
201
|
+
...
|
|
202
|
+
|
|
203
|
+
def break_(self, scope: LogicGroup | None = None) -> None:
|
|
204
|
+
"""Raise an inspection breakpoint inside this group.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
scope: The group to break out of; this one when not given.
|
|
208
|
+
"""
|
|
209
|
+
...
|
|
210
|
+
|
|
211
|
+
@classmethod
|
|
212
|
+
def break_active(cls, scope: LogicGroup | None = None) -> None:
|
|
213
|
+
"""Raise an inspection breakpoint in the build that is running.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
scope: The group to break out of.
|
|
217
|
+
"""
|
|
218
|
+
...
|
|
219
|
+
|
|
220
|
+
@property
|
|
221
|
+
def name(self) -> str | None:
|
|
222
|
+
"""The group's name, or None for a group that has none."""
|
|
223
|
+
...
|
|
224
|
+
|
|
225
|
+
@property
|
|
226
|
+
def parent(self) -> LogicGroup | None:
|
|
227
|
+
"""The group this one was built inside, or None."""
|
|
228
|
+
...
|
|
229
|
+
|
|
230
|
+
@property
|
|
231
|
+
def lgtype(self) -> int:
|
|
232
|
+
"""The group's C type, as the enumerator's value."""
|
|
233
|
+
...
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def address(self) -> int:
|
|
237
|
+
"""The group's C block, which is what the registry is keyed by."""
|
|
238
|
+
...
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
class LogicGroupWrapperRegistry(BoundByteMap):
|
|
242
|
+
"""The wrapper every group is looked up by, keyed by its block's address.
|
|
243
|
+
|
|
244
|
+
The same rule the node registry keeps: a lookup that finds the address
|
|
245
|
+
answers with the wrapper the layer holds, and one that misses builds a new
|
|
246
|
+
wrapper over the block.
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
def __getitem__(self, key: int) -> LogicGroup:
|
|
250
|
+
"""The wrapper at an address, rebuilding it when it is not held.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
key: Address of the C group block.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
The group wrapper for that address.
|
|
257
|
+
"""
|
|
258
|
+
...
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
# The manager every build runs through, and the registry every group is looked
|
|
262
|
+
# up by.
|
|
263
|
+
LGM: LogicGroupManager
|
|
264
|
+
GROUP_REGISTRY: LogicGroupWrapperRegistry
|