math-spec-mapping 0.3.0__py3-none-any.whl → 0.3.2__py3-none-any.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.
- math_spec_mapping/Classes/MathSpec.py +40 -0
- math_spec_mapping/Classes/State.py +1 -0
- math_spec_mapping/Convenience/__init__.py +2 -1
- math_spec_mapping/Convenience/documentation.py +1 -1
- math_spec_mapping/Convenience/starter.py +271 -0
- math_spec_mapping/Load/metrics.py +6 -2
- math_spec_mapping/Load/parameters.py +3 -1
- math_spec_mapping/Load/states.py +2 -0
- math_spec_mapping/Load/type.py +5 -1
- math_spec_mapping/Reports/html.py +4 -1
- math_spec_mapping/Reports/markdown.py +55 -5
- math_spec_mapping/Reports/state.py +2 -0
- math_spec_mapping/__init__.py +1 -0
- math_spec_mapping/schema.schema.json +8 -4
- {math_spec_mapping-0.3.0.dist-info → math_spec_mapping-0.3.2.dist-info}/METADATA +1 -1
- {math_spec_mapping-0.3.0.dist-info → math_spec_mapping-0.3.2.dist-info}/RECORD +19 -19
- {math_spec_mapping-0.3.0.dist-info → math_spec_mapping-0.3.2.dist-info}/LICENSE +0 -0
- {math_spec_mapping-0.3.0.dist-info → math_spec_mapping-0.3.2.dist-info}/WHEEL +0 -0
- {math_spec_mapping-0.3.0.dist-info → math_spec_mapping-0.3.2.dist-info}/top_level.txt +0 -0
@@ -6,6 +6,7 @@ from .ControlAction import ControlAction
|
|
6
6
|
from .BoundaryAction import BoundaryAction
|
7
7
|
import os
|
8
8
|
from copy import deepcopy
|
9
|
+
import shutil
|
9
10
|
|
10
11
|
|
11
12
|
class MathSpec:
|
@@ -603,6 +604,45 @@ class MathSpec:
|
|
603
604
|
with open(path, "w") as f:
|
604
605
|
f.write(out)
|
605
606
|
|
607
|
+
def metaprogramming_julia_types(self, model_directory, overwrite=False):
|
608
|
+
path = model_directory + "/types.jl"
|
609
|
+
if not overwrite:
|
610
|
+
assert "types.jl" not in os.listdir(
|
611
|
+
model_directory
|
612
|
+
), "The types file is already written, either delete it or switch to overwrite mode"
|
613
|
+
|
614
|
+
shutil.copyfile("src/TypeMappings/types.jl", path)
|
615
|
+
|
616
|
+
def metaprogramming_julia_spaces(
|
617
|
+
self, model_directory, cadCAD_path, overwrite=False
|
618
|
+
):
|
619
|
+
path = model_directory + "/spaces.jl"
|
620
|
+
if not overwrite:
|
621
|
+
assert "spaces.jl" not in os.listdir(
|
622
|
+
model_directory
|
623
|
+
), "The spaces file is already written, either delete it or switch to overwrite mode"
|
624
|
+
|
625
|
+
out = """include("{}")
|
626
|
+
include("types.jl")
|
627
|
+
using .Spaces: generate_space_type
|
628
|
+
|
629
|
+
""".format(
|
630
|
+
cadCAD_path
|
631
|
+
)
|
632
|
+
|
633
|
+
for space in self.spaces:
|
634
|
+
name = self.spaces[space].name
|
635
|
+
schema = self.spaces[space].schema
|
636
|
+
schema = ["{}={}".format(x, schema[x].original_type_name) for x in schema]
|
637
|
+
if len(schema) >= 1:
|
638
|
+
schema = ", ".join(schema) + ","
|
639
|
+
out += 'generate_space_type(({}), "{}")'.format(schema, name)
|
640
|
+
out += "\n"
|
641
|
+
# out += "{} = Spaces.{}".format(name, name)
|
642
|
+
|
643
|
+
with open(path, "w") as f:
|
644
|
+
f.write(out)
|
645
|
+
|
606
646
|
def build_implementation(self, params):
|
607
647
|
return MathSpecImplementation(self, params)
|
608
648
|
|
@@ -1 +1,2 @@
|
|
1
|
-
from .documentation import write_top_level_json_description
|
1
|
+
# from .documentation import write_top_level_json_description
|
2
|
+
from .starter import remove_dummy_repo_components
|
@@ -0,0 +1,271 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
|
4
|
+
def remove_dummy_repo_components(path):
|
5
|
+
|
6
|
+
directory_folders = os.listdir(path)
|
7
|
+
|
8
|
+
if "StatefulMetrics" in directory_folders:
|
9
|
+
path2 = path + "/StatefulMetrics"
|
10
|
+
contents = os.listdir(path2)
|
11
|
+
if "Dummy.py" in contents:
|
12
|
+
os.remove(path2 + "/Dummy.py")
|
13
|
+
if "__init__.py" in contents:
|
14
|
+
with open(path2 + "/__init__.py", "r") as f:
|
15
|
+
contents = f.read()
|
16
|
+
contents = contents.replace(
|
17
|
+
"from .Dummy import dummy_stateful_metrics\n", ""
|
18
|
+
)
|
19
|
+
contents = contents.replace(
|
20
|
+
"stateful_metrics.extend(dummy_stateful_metrics)\n", ""
|
21
|
+
)
|
22
|
+
contents = contents.replace(
|
23
|
+
"stateful_metrics.extend(dummy_stateful_metrics)", ""
|
24
|
+
)
|
25
|
+
with open(path2 + "/__init__.py", "w") as f:
|
26
|
+
f.write(contents)
|
27
|
+
|
28
|
+
if "Metrics" in directory_folders:
|
29
|
+
path2 = path + "/Metrics"
|
30
|
+
contents = os.listdir(path2)
|
31
|
+
if "Dummy.py" in contents:
|
32
|
+
os.remove(path2 + "/Dummy.py")
|
33
|
+
if "__init__.py" in contents:
|
34
|
+
with open(path2 + "/__init__.py", "r") as f:
|
35
|
+
contents = f.read()
|
36
|
+
contents = contents.replace("from .Dummy import metrics_x\n", "")
|
37
|
+
contents = contents.replace("metrics.extend(metrics_x)\n", "")
|
38
|
+
contents = contents.replace("metrics.extend(metrics_x)", "")
|
39
|
+
with open(path2 + "/__init__.py", "w") as f:
|
40
|
+
f.write(contents)
|
41
|
+
|
42
|
+
"""if "Displays" in directory_folders:
|
43
|
+
path2 = path + "/Displays"
|
44
|
+
contents = os.listdir(path2)
|
45
|
+
if "Dummy.py" in contents:
|
46
|
+
os.remove(path2 + "/Dummy.py")
|
47
|
+
if "__init__.py" in contents:
|
48
|
+
with open(path2 + "/__init__.py", "r") as f:
|
49
|
+
contents = f.read()
|
50
|
+
contents = contents.replace("from .Dummy import metrics_x\n", "")
|
51
|
+
contents = contents.replace("metrics.extend(metrics_x)\n", "")
|
52
|
+
contents = contents.replace("metrics.extend(metrics_x)", "")
|
53
|
+
with open(path2 + "/__init__.py", "w") as f:
|
54
|
+
f.write(contents)"""
|
55
|
+
|
56
|
+
if "Wiring" in directory_folders:
|
57
|
+
path2 = path + "/Wiring"
|
58
|
+
contents = os.listdir(path2)
|
59
|
+
if "Dummy.py" in contents:
|
60
|
+
os.remove(path2 + "/Dummy.py")
|
61
|
+
if "__init__.py" in contents:
|
62
|
+
with open(path2 + "/__init__.py", "r") as f:
|
63
|
+
contents = f.read()
|
64
|
+
contents = contents.replace("from .Dummy import dummy_wiring\n", "")
|
65
|
+
contents = contents.replace("wiring.extend(dummy_wiring)\n", "")
|
66
|
+
contents = contents.replace("wiring.extend(dummy_wiring)", "")
|
67
|
+
with open(path2 + "/__init__.py", "w") as f:
|
68
|
+
f.write(contents)
|
69
|
+
|
70
|
+
if "Mechanisms" in directory_folders:
|
71
|
+
path2 = path + "/Mechanisms"
|
72
|
+
contents = os.listdir(path2)
|
73
|
+
if "Dummy.py" in contents:
|
74
|
+
os.remove(path2 + "/Dummy.py")
|
75
|
+
if "__init__.py" in contents:
|
76
|
+
with open(path2 + "/__init__.py", "r") as f:
|
77
|
+
contents = f.read()
|
78
|
+
contents = contents.replace("from .Dummy import dummy_mechanisms\n", "")
|
79
|
+
contents = contents.replace("mechanism.extend(dummy_mechanisms)\n", "")
|
80
|
+
contents = contents.replace("mechanism.extend(dummy_mechanisms)", "")
|
81
|
+
with open(path2 + "/__init__.py", "w") as f:
|
82
|
+
f.write(contents)
|
83
|
+
|
84
|
+
if "Policies" in directory_folders:
|
85
|
+
path2 = path + "/Policies"
|
86
|
+
contents = os.listdir(path2)
|
87
|
+
if "Dummy.py" in contents:
|
88
|
+
os.remove(path2 + "/Dummy.py")
|
89
|
+
if "__init__.py" in contents:
|
90
|
+
with open(path2 + "/__init__.py", "r") as f:
|
91
|
+
contents = f.read()
|
92
|
+
contents = contents.replace("from .Dummy import dummy_policies\n", "")
|
93
|
+
contents = contents.replace("policies.extend(dummy_policies)\n", "")
|
94
|
+
contents = contents.replace("policies.extend(dummy_policies)", "")
|
95
|
+
with open(path2 + "/__init__.py", "w") as f:
|
96
|
+
f.write(contents)
|
97
|
+
|
98
|
+
if "BoundaryActions" in directory_folders:
|
99
|
+
path2 = path + "/BoundaryActions"
|
100
|
+
contents = os.listdir(path2)
|
101
|
+
if "Dummy.py" in contents:
|
102
|
+
os.remove(path2 + "/Dummy.py")
|
103
|
+
if "__init__.py" in contents:
|
104
|
+
with open(path2 + "/__init__.py", "r") as f:
|
105
|
+
contents = f.read()
|
106
|
+
contents = contents.replace(
|
107
|
+
"from .Dummy import dummy_boundary_action\n", ""
|
108
|
+
)
|
109
|
+
contents = contents.replace("dummy_boundary_action,\n", "")
|
110
|
+
contents = contents.replace("dummy_boundary_action,", "")
|
111
|
+
contents = contents.replace("dummy_boundary_action", "")
|
112
|
+
with open(path2 + "/__init__.py", "w") as f:
|
113
|
+
f.write(contents)
|
114
|
+
|
115
|
+
if "ControlActions" in directory_folders:
|
116
|
+
path2 = path + "/ControlActions"
|
117
|
+
contents = os.listdir(path2)
|
118
|
+
if "Dummy.py" in contents:
|
119
|
+
os.remove(path2 + "/Dummy.py")
|
120
|
+
if "__init__.py" in contents:
|
121
|
+
with open(path2 + "/__init__.py", "r") as f:
|
122
|
+
contents = f.read()
|
123
|
+
contents = contents.replace(
|
124
|
+
"from .Dummy import dummy_control_action\n", ""
|
125
|
+
)
|
126
|
+
contents = contents.replace("dummy_control_action,\n", "")
|
127
|
+
contents = contents.replace("dummy_control_action,", "")
|
128
|
+
contents = contents.replace("dummy_control_action", "")
|
129
|
+
with open(path2 + "/__init__.py", "w") as f:
|
130
|
+
f.write(contents)
|
131
|
+
if "Entities" in directory_folders:
|
132
|
+
path2 = path + "/Entities"
|
133
|
+
contents = os.listdir(path2)
|
134
|
+
if "Dummy.py" in contents:
|
135
|
+
os.remove(path2 + "/Dummy.py")
|
136
|
+
if "__init__.py" in contents:
|
137
|
+
with open(path2 + "/__init__.py", "r") as f:
|
138
|
+
contents = f.read()
|
139
|
+
contents = contents.replace("from .Dummy import dummy_entity\n", "")
|
140
|
+
contents = contents.replace("dummy_entity, ", "")
|
141
|
+
contents = contents.replace("dummy_entity,", "")
|
142
|
+
contents = contents.replace("dummy_entity", "")
|
143
|
+
with open(path2 + "/__init__.py", "w") as f:
|
144
|
+
f.write(contents)
|
145
|
+
if "State" in directory_folders:
|
146
|
+
path2 = path + "/State"
|
147
|
+
contents = os.listdir(path2)
|
148
|
+
if "Dummy.py" in contents:
|
149
|
+
os.remove(path2 + "/Dummy.py")
|
150
|
+
if "__init__.py" in contents:
|
151
|
+
with open(path2 + "/__init__.py", "r") as f:
|
152
|
+
contents = f.read()
|
153
|
+
contents = contents.replace("from .Dummy import dummy_state\n", "")
|
154
|
+
contents = contents.replace("dummy_state, ", "")
|
155
|
+
contents = contents.replace("dummy_state,", "")
|
156
|
+
contents = contents.replace("dummy_state", "")
|
157
|
+
with open(path2 + "/__init__.py", "w") as f:
|
158
|
+
f.write(contents)
|
159
|
+
|
160
|
+
if "Parameters" in directory_folders:
|
161
|
+
path2 = path + "/Parameters"
|
162
|
+
contents = os.listdir(path2)
|
163
|
+
if "Dummy.py" in contents:
|
164
|
+
os.remove(path2 + "/Dummy.py")
|
165
|
+
if "__init__.py" in contents:
|
166
|
+
with open(path2 + "/__init__.py", "r") as f:
|
167
|
+
contents = f.read()
|
168
|
+
contents = contents.replace(
|
169
|
+
"from .Dummy import dummy_parameter_sets", ""
|
170
|
+
)
|
171
|
+
contents = contents.replace(
|
172
|
+
"parameters.extend(dummy_parameter_sets)", ""
|
173
|
+
)
|
174
|
+
|
175
|
+
with open(path2 + "/__init__.py", "w") as f:
|
176
|
+
f.write(contents)
|
177
|
+
|
178
|
+
if "Spaces" in directory_folders:
|
179
|
+
path2 = path + "/Spaces"
|
180
|
+
contents = os.listdir(path2)
|
181
|
+
if "Dummy.py" in contents:
|
182
|
+
os.remove(path2 + "/Dummy.py")
|
183
|
+
if "__init__.py" in contents:
|
184
|
+
with open(path2 + "/__init__.py", "r") as f:
|
185
|
+
contents = f.read()
|
186
|
+
contents = contents.replace("from .Dummy import dummy_spaces\n", "")
|
187
|
+
contents = contents.replace("spaces.extend(dummy_spaces)", "")
|
188
|
+
|
189
|
+
with open(path2 + "/__init__.py", "w") as f:
|
190
|
+
f.write(contents)
|
191
|
+
|
192
|
+
if "Types" in directory_folders:
|
193
|
+
path2 = path + "/Types"
|
194
|
+
contents = os.listdir(path2)
|
195
|
+
if "Dummy.py" in contents:
|
196
|
+
os.remove(path2 + "/Dummy.py")
|
197
|
+
if "__init__.py" in contents:
|
198
|
+
with open(path2 + "/__init__.py", "r") as f:
|
199
|
+
contents = f.read()
|
200
|
+
contents = contents.replace(
|
201
|
+
"from .Dummy import DummyCompoundType, DummyType1, DummyType2\n", ""
|
202
|
+
)
|
203
|
+
contents = contents.replace(
|
204
|
+
""" DummyType1,
|
205
|
+
DummyType2,
|
206
|
+
DummyCompoundType,""",
|
207
|
+
"",
|
208
|
+
)
|
209
|
+
contents = contents.replace(
|
210
|
+
""" DummyType1,
|
211
|
+
DummyType2,
|
212
|
+
DummyCompoundType""",
|
213
|
+
"",
|
214
|
+
)
|
215
|
+
|
216
|
+
with open(path2 + "/__init__.py", "w") as f:
|
217
|
+
f.write(contents)
|
218
|
+
|
219
|
+
if "TypeMappings" in directory_folders:
|
220
|
+
path2 = path + "/TypeMappings"
|
221
|
+
contents = os.listdir(path2)
|
222
|
+
|
223
|
+
if "types.py" in contents:
|
224
|
+
with open(path2 + "/types.py", "r") as f:
|
225
|
+
contents = f.read()
|
226
|
+
contents = contents.replace(
|
227
|
+
""" "DummyType1": str,
|
228
|
+
"DummyType2": int,
|
229
|
+
"DummyCompoundType": {"A": "Dummy Type 1", "B": "Dummy Type 2"},""",
|
230
|
+
"",
|
231
|
+
)
|
232
|
+
|
233
|
+
with open(path2 + "/types.py", "w") as f:
|
234
|
+
f.write(contents)
|
235
|
+
|
236
|
+
if "TypeMappings" in directory_folders:
|
237
|
+
path2 = path + "/TypeMappings"
|
238
|
+
contents = os.listdir(path2)
|
239
|
+
|
240
|
+
if "types.py" in contents:
|
241
|
+
with open(path2 + "/types.jl", "r") as f:
|
242
|
+
contents = f.read()
|
243
|
+
contents = contents.replace(
|
244
|
+
"""const DummyType1 = String
|
245
|
+
const DummyType2 = Integer
|
246
|
+
struct DummyCompoundType
|
247
|
+
A::DummyType1
|
248
|
+
B::DummyType2
|
249
|
+
end""",
|
250
|
+
"",
|
251
|
+
)
|
252
|
+
|
253
|
+
with open(path2 + "/types.jl", "w") as f:
|
254
|
+
f.write(contents)
|
255
|
+
|
256
|
+
if "TypeMappings" in directory_folders:
|
257
|
+
path2 = path + "/TypeMappings"
|
258
|
+
contents = os.listdir(path2)
|
259
|
+
|
260
|
+
if "types.py" in contents:
|
261
|
+
with open(path2 + "/types.ts", "r") as f:
|
262
|
+
contents = f.read()
|
263
|
+
contents = contents.replace(
|
264
|
+
"""type DummyType1 = string
|
265
|
+
type DummyType2 = number
|
266
|
+
type DummyCompoundType = {"A": DummyType1, "B": DummyType2}""",
|
267
|
+
"",
|
268
|
+
)
|
269
|
+
|
270
|
+
with open(path2 + "/types.ts", "w") as f:
|
271
|
+
f.write(contents)
|
@@ -100,5 +100,9 @@ def load_metrics(ms: Dict, json: Dict, stateful_metrics_map) -> None:
|
|
100
100
|
hold = policy.metrics_used[:]
|
101
101
|
policy.metrics_used = []
|
102
102
|
for x in hold:
|
103
|
-
assert
|
104
|
-
|
103
|
+
assert (
|
104
|
+
x in ms["Metrics"] or x in stateful_metrics_map
|
105
|
+
), "{} not a valid metric or stateful metric".format(x)
|
106
|
+
policy.metrics_used.append(
|
107
|
+
ms["Metrics"][x] if x in ms["Metrics"] else stateful_metrics_map[x]
|
108
|
+
)
|
@@ -18,7 +18,9 @@ def convert_parameter_set(ms, data: Dict) -> ParameterSet:
|
|
18
18
|
if "metadata" not in param:
|
19
19
|
param["metadata"] = {}
|
20
20
|
check_json_keys(param, "Parameter")
|
21
|
-
assert param["variable_type"] in ms["Types"], "Type not in ms"
|
21
|
+
assert param["variable_type"] in ms["Types"], "Type of {} not in ms".format(
|
22
|
+
param["variable_type"]
|
23
|
+
)
|
22
24
|
param["variable_type"] = ms["Types"][param["variable_type"]]
|
23
25
|
new_parameters.append(Parameter(param))
|
24
26
|
data["parameters"] = new_parameters
|
math_spec_mapping/Load/states.py
CHANGED
@@ -27,6 +27,8 @@ def convert_state(ms, data: Dict) -> State:
|
|
27
27
|
check_json_keys(var, "State Variable")
|
28
28
|
assert var["type"] in ms["Types"], "Type not in ms"
|
29
29
|
var["type"] = ms["Types"][var["type"]]
|
30
|
+
if "metadata" not in var:
|
31
|
+
var["metadata"] = {}
|
30
32
|
new_variables.append(StateVariable(var))
|
31
33
|
data["variables"] = new_variables
|
32
34
|
|
math_spec_mapping/Load/type.py
CHANGED
@@ -71,7 +71,8 @@ def load_typescript_type_key(path):
|
|
71
71
|
type_definitions = [x for x in type_definitions if len(x) > 0]
|
72
72
|
hold = type_definitions[:]
|
73
73
|
type_definitions = []
|
74
|
-
|
74
|
+
if len(hold) > 0:
|
75
|
+
type_definitions.append(hold.pop(0))
|
75
76
|
while len(hold) > 0:
|
76
77
|
curr = hold.pop(0)
|
77
78
|
if "type" in curr or "interface" in curr:
|
@@ -111,6 +112,9 @@ def load_julia_type_key(path):
|
|
111
112
|
elif x.startswith("struct"):
|
112
113
|
name = name[7:]
|
113
114
|
name = name[: name.index("\n")].strip()
|
115
|
+
if x.startswith("const"):
|
116
|
+
name = name[6:]
|
117
|
+
name = name[: name.index("=")].strip()
|
114
118
|
else:
|
115
119
|
assert False
|
116
120
|
|
@@ -152,7 +152,10 @@ cssclasses:
|
|
152
152
|
else:
|
153
153
|
out += symbol2 + name + "\n"
|
154
154
|
for var in ms.state[name].variable_map.keys():
|
155
|
-
|
155
|
+
if linking:
|
156
|
+
out += symbol3 + "[[{}-{}\|{}]]".format(name, var, var) + "\n"
|
157
|
+
else:
|
158
|
+
out += symbol3 + var + "\n"
|
156
159
|
|
157
160
|
out += symbol1 + "**Stateful Metrics**\n"
|
158
161
|
for name in ms.stateful_metrics.keys():
|
@@ -145,7 +145,7 @@ def write_boundary_action_markdown_report(ms, path, boundary_action, add_metadat
|
|
145
145
|
out += "\n"
|
146
146
|
out += "\n"
|
147
147
|
|
148
|
-
out += "## Constraints"
|
148
|
+
out += "## Constraints\n"
|
149
149
|
for i, x in enumerate(boundary_action.constraints):
|
150
150
|
out += "{}. {}".format(i + 1, x)
|
151
151
|
out += "\n"
|
@@ -179,6 +179,8 @@ def write_policy_markdown_report(ms, path, policy, add_metadata=True):
|
|
179
179
|
policy = ms.policies[policy]
|
180
180
|
if "Policies" not in os.listdir(path):
|
181
181
|
os.makedirs(path + "/Policies")
|
182
|
+
|
183
|
+
out = ""
|
182
184
|
if add_metadata:
|
183
185
|
metadata = policy.metadata
|
184
186
|
if len(metadata) > 0:
|
@@ -188,7 +190,7 @@ def write_policy_markdown_report(ms, path, policy, add_metadata=True):
|
|
188
190
|
""".format(
|
189
191
|
"\n".join(["{}: {}".format(x, metadata[x]) for x in metadata])
|
190
192
|
)
|
191
|
-
|
193
|
+
|
192
194
|
out += "## Description"
|
193
195
|
out += "\n"
|
194
196
|
out += "\n"
|
@@ -292,7 +294,9 @@ def write_mechanism_markdown_report(ms, path, mechanism, add_metadata=True):
|
|
292
294
|
out += "\n\n"
|
293
295
|
out += "## Updates\n\n"
|
294
296
|
for i, x in enumerate(mechanism.updates):
|
295
|
-
out += "{}. [[{}]].{}".format(
|
297
|
+
out += "{}. [[{}]].[[{}|{}]]".format(
|
298
|
+
i + 1, x[0].name, x[0].state.name + "-" + x[1].name, x[1].name
|
299
|
+
)
|
296
300
|
out += "\n"
|
297
301
|
|
298
302
|
with open("{}/Mechanisms/{}.md".format(path, mechanism.label), "w") as f:
|
@@ -472,8 +476,14 @@ def write_wiring_markdown_report(ms, path, wiring, add_metadata=True):
|
|
472
476
|
out += "\n"
|
473
477
|
|
474
478
|
out += "## All State Updates\n"
|
479
|
+
|
475
480
|
for i, x in enumerate(wiring.all_updates):
|
476
|
-
out += "{}. [[{}]].{}".format(
|
481
|
+
out += "{}. [[{}]].[[{}|{}]]".format(
|
482
|
+
i + 1,
|
483
|
+
x[0].name,
|
484
|
+
ms.entities[x[0].name].state.name + "-" + x[1].name,
|
485
|
+
x[1].name,
|
486
|
+
)
|
477
487
|
out += "\n"
|
478
488
|
out += "\n"
|
479
489
|
|
@@ -575,7 +585,7 @@ def write_metrics_markdown_report(ms, path, metric, add_metadata=True):
|
|
575
585
|
|
576
586
|
out += "## Variables Used\n"
|
577
587
|
for i, x in enumerate(metric.variables_used):
|
578
|
-
out += "{}. {}.{}".format(i + 1, x[0], x[1])
|
588
|
+
out += "{}. [[{}]].[[{}-{}|{}]]".format(i + 1, x[0], x[0], x[1], x[1])
|
579
589
|
var = ms.state[x[0]].variable_map[x[1]]
|
580
590
|
if var.symbol:
|
581
591
|
out += " , symbol: {}".format(var.symbol)
|
@@ -608,6 +618,45 @@ def write_displays_markdown_reports(ms, path, add_metadata=True):
|
|
608
618
|
)
|
609
619
|
|
610
620
|
|
621
|
+
def write_state_variables_markdown_reports(ms, path, state, add_metadata=True):
|
622
|
+
if "State Variables" not in os.listdir(path):
|
623
|
+
os.makedirs(path + "/State Variables")
|
624
|
+
state = ms.state[state]
|
625
|
+
for variable in state.variables:
|
626
|
+
out = ""
|
627
|
+
if add_metadata:
|
628
|
+
metadata = variable.metadata
|
629
|
+
if len(metadata) > 0:
|
630
|
+
out += """---
|
631
|
+
{}
|
632
|
+
---
|
633
|
+
""".format(
|
634
|
+
"\n".join(["{}: {}".format(x, metadata[x]) for x in metadata])
|
635
|
+
)
|
636
|
+
out += "Description: "
|
637
|
+
out += variable.description
|
638
|
+
out += "\n\n"
|
639
|
+
out += "Type: [["
|
640
|
+
out += variable.type.name
|
641
|
+
out += "]]\n\n"
|
642
|
+
out += "Symbol: "
|
643
|
+
if variable.symbol:
|
644
|
+
out += variable.symbol
|
645
|
+
out += "\n\n"
|
646
|
+
out += "Domain: "
|
647
|
+
if variable.domain:
|
648
|
+
out += variable.domain
|
649
|
+
out += "\n\n"
|
650
|
+
|
651
|
+
with open(
|
652
|
+
"{}/State Variables/{}.md".format(
|
653
|
+
path, "{}-{}".format(state.name, variable.name)
|
654
|
+
),
|
655
|
+
"w",
|
656
|
+
) as f:
|
657
|
+
f.write(out)
|
658
|
+
|
659
|
+
|
611
660
|
def write_wiring_display_markdown_report(ms, path, wiring, add_metadata=True):
|
612
661
|
wirings = [ms.wiring[w] for w in wiring["components"]]
|
613
662
|
out = ""
|
@@ -696,6 +745,7 @@ def write_all_markdown_reports(ms, path, clear_folders=False):
|
|
696
745
|
states = list(ms.state.keys())
|
697
746
|
for x in states:
|
698
747
|
write_state_markdown_report(ms, path, x)
|
748
|
+
write_state_variables_markdown_reports(ms, path, x)
|
699
749
|
|
700
750
|
# Write types
|
701
751
|
for t in ms.types.values():
|
@@ -51,6 +51,8 @@ def write_state_variable_table_markdown(target_state, links=False):
|
|
51
51
|
if tv:
|
52
52
|
if links and i == 2:
|
53
53
|
table += "[[{}]]".format(tv)
|
54
|
+
elif links and i == 0:
|
55
|
+
table += "[[{}-{}\|{}]]".format(target_state.name, tv, tv)
|
54
56
|
else:
|
55
57
|
table += "{}".format(tv)
|
56
58
|
table += "|"
|
math_spec_mapping/__init__.py
CHANGED
@@ -360,7 +360,8 @@
|
|
360
360
|
"type": "string"
|
361
361
|
},
|
362
362
|
"description": "All metrics used in implementation of policies"
|
363
|
-
}
|
363
|
+
},
|
364
|
+
"metadata": {"type": "object"}
|
364
365
|
},
|
365
366
|
"required": [
|
366
367
|
"codomain",
|
@@ -390,7 +391,8 @@
|
|
390
391
|
"logic": {
|
391
392
|
"type": "string",
|
392
393
|
"description": "Any logic associated with the implementation"
|
393
|
-
}
|
394
|
+
},
|
395
|
+
"metadata": {"type": "object"}
|
394
396
|
},
|
395
397
|
"required": [
|
396
398
|
"description",
|
@@ -561,7 +563,8 @@
|
|
561
563
|
"domain": {
|
562
564
|
"type": ["string","null"],
|
563
565
|
"description": "The mathematical domain of the parameter (optional)"
|
564
|
-
}
|
566
|
+
},
|
567
|
+
"metadata": {"type": "object"}
|
565
568
|
},
|
566
569
|
"required": [
|
567
570
|
"description",
|
@@ -690,7 +693,8 @@
|
|
690
693
|
"items": {
|
691
694
|
"type": "integer"
|
692
695
|
}
|
693
|
-
}
|
696
|
+
},
|
697
|
+
"metadata": {"type": "object"}
|
694
698
|
},
|
695
699
|
"required": [
|
696
700
|
"components",
|
@@ -1,25 +1,25 @@
|
|
1
|
-
math_spec_mapping/__init__.py,sha256=
|
1
|
+
math_spec_mapping/__init__.py,sha256=CzT9KycdX5nuiUzDFmLXVeAIr8v8UKGbXsEQF8vjl1c,961
|
2
2
|
math_spec_mapping/schema.py,sha256=6mrRqzEnTTSXjb19xJ63MBp0KjKH0s7i6TfT4MkAY9k,233
|
3
|
-
math_spec_mapping/schema.schema.json,sha256=
|
3
|
+
math_spec_mapping/schema.schema.json,sha256=5_DiubQzPo8koyx5PKFh_zIINyjtrhGWG_7N73s9b1Q,29400
|
4
4
|
math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
|
5
5
|
math_spec_mapping/Classes/Block.py,sha256=hXQO221IP-TqZm_TwFKfURpEEjZm7L1TPZDCYlaOdho,17302
|
6
6
|
math_spec_mapping/Classes/BoundaryAction.py,sha256=AOENCqCEfpjotnHhzUj_F2SOP0SGpkN1tNPr8Mtl6Tc,476
|
7
7
|
math_spec_mapping/Classes/ControlAction.py,sha256=ysqpgANwdizVdwqtgZmnxXMpCqrzmVEF_6YT0M3l4Ho,526
|
8
8
|
math_spec_mapping/Classes/Entity.py,sha256=fA0-b128_OHHxfCg4pzqyQV083EYev1HlVpy86S5igg,1226
|
9
|
-
math_spec_mapping/Classes/MathSpec.py,sha256=
|
9
|
+
math_spec_mapping/Classes/MathSpec.py,sha256=KEk7oUs21YznNmsdCUtldpOl7p-rwFmpZcolVNHlaTo,28854
|
10
10
|
math_spec_mapping/Classes/Mechanism.py,sha256=2sLm3wYBIeTQaMBcsJ9btqIWsbS895Ra8NY6Y9_G_Dg,379
|
11
11
|
math_spec_mapping/Classes/Metric.py,sha256=AhPgYppOP6q49xvR8S9STxQsXUKJlTWx7wI1LfZEtww,581
|
12
12
|
math_spec_mapping/Classes/Parameter.py,sha256=ZuJ_w0sChvRElJ4sOnXZ2EV4Ell2xXFulKLjVOpgz2E,1237
|
13
13
|
math_spec_mapping/Classes/Policy.py,sha256=fzV85tB3QScjiYGfhw_dyQt9L1BYYfTyTIQQcxeT8ac,530
|
14
14
|
math_spec_mapping/Classes/Space.py,sha256=QsahxoUfRsDWQLBL683KnGx72MAmRxv7CDE7TMgCG-E,472
|
15
|
-
math_spec_mapping/Classes/State.py,sha256=
|
15
|
+
math_spec_mapping/Classes/State.py,sha256=2Yn4wQnbBK-Au40tx5YHR8ZsLA7NHHbWvVPjDzU6Tq0,1538
|
16
16
|
math_spec_mapping/Classes/StateUpdateTransmissionChannel.py,sha256=3hBLvD1lE64PkwqksBXAfFWv7foOZzGQLAFQWy42tOA,257
|
17
17
|
math_spec_mapping/Classes/StatefulMetric.py,sha256=UCis1BJ7fsajHHxFF05ZiyDean2D4s4a95uYYW1Mjq4,749
|
18
18
|
math_spec_mapping/Classes/Type.py,sha256=2KFY8d3cv1PzJJ7SSMHJf1zcfQ3ZbqxotK2KgTaLZdM,289
|
19
19
|
math_spec_mapping/Classes/__init__.py,sha256=0zxgOqns_9JybD74HKMVh6aw8ij8WVbfQ4Q_1uWzof0,761
|
20
|
-
math_spec_mapping/Convenience/__init__.py,sha256
|
21
|
-
math_spec_mapping/Convenience/documentation.py,sha256=
|
22
|
-
math_spec_mapping/Convenience/starter.py,sha256=
|
20
|
+
math_spec_mapping/Convenience/__init__.py,sha256=z2W-E5Wg1CNEkDI5UqH3qIVBqp-3A1e63f3u9fA-N7w,112
|
21
|
+
math_spec_mapping/Convenience/documentation.py,sha256=1ziWVJznbCUxeAAt03nAdEYtMlXNo5TeedHfgs0vSBU,1625
|
22
|
+
math_spec_mapping/Convenience/starter.py,sha256=Pv0b5pHnv5Bxk3PkY8O9Nv62z2C_gxj5xcf8G9r4Pkw,11010
|
23
23
|
math_spec_mapping/Load/__init__.py,sha256=_ga5nHi7U5rY5lCF36_XI9Qmybq4P8R4m5I5mmjLBk8,33
|
24
24
|
math_spec_mapping/Load/action_transmission_channel.py,sha256=9Wer7g2s5SSOcUYuZ0PqSKUVVnW3EvGQJZNXJTwW__0,2561
|
25
25
|
math_spec_mapping/Load/boundary_actions.py,sha256=WvEj2tqN0pUZtE4EiKUuGzMdAcWsMlLslJJeFjIu6gk,2058
|
@@ -30,31 +30,31 @@ math_spec_mapping/Load/general.py,sha256=2q6aGKxXhebiHHTZhtACvM4nWIkTben0o5rXuvf
|
|
30
30
|
math_spec_mapping/Load/implementations.py,sha256=SGKZ_YXeNpJUTnw5fajQTXji7S2bNQo8sh-7YcIO6pk,395
|
31
31
|
math_spec_mapping/Load/load.py,sha256=CLprDhJpbwm9RAzKM2Ghwr8eqBu0a-wvGDOCMmc01YE,2484
|
32
32
|
math_spec_mapping/Load/mechanism.py,sha256=JBy-QpB4W0Z2OcNiakONjD4_RtEgxlFKtLXfDqfhR-0,2037
|
33
|
-
math_spec_mapping/Load/metrics.py,sha256=
|
34
|
-
math_spec_mapping/Load/parameters.py,sha256=
|
33
|
+
math_spec_mapping/Load/metrics.py,sha256=EyCFEgHpyffBPKaqISdIeTyqUtPtu2xoS0gZjh-6i3U,3434
|
34
|
+
math_spec_mapping/Load/parameters.py,sha256=W4utm7to3s2fo4z3XgLH0TM1agaIad1qfM2I-lLMua4,1393
|
35
35
|
math_spec_mapping/Load/policy.py,sha256=HvlhGHGJTweVs7DOI2HSL_2_diECr8ukDUmzoFLQELo,2444
|
36
36
|
math_spec_mapping/Load/spaces.py,sha256=7zgGA57Te7T4hfuCCDElffiidWgn1lKm5E14e1yjt8M,1116
|
37
37
|
math_spec_mapping/Load/state_update_transmission_channels.py,sha256=FJWp5n4HdtHAfof5BUQ6BnRakljatL2h8dWCapaVSc0,2238
|
38
38
|
math_spec_mapping/Load/stateful_metrics.py,sha256=uGSTc6x6lld5xptgSUMHrO0Vg0QDRIL14C6zTg33S8o,1977
|
39
|
-
math_spec_mapping/Load/states.py,sha256=
|
40
|
-
math_spec_mapping/Load/type.py,sha256=
|
39
|
+
math_spec_mapping/Load/states.py,sha256=gAiCGxqc8_js8Gd0aRRrK4PeUW4jgZsgukR6e-5fcg4,1290
|
40
|
+
math_spec_mapping/Load/type.py,sha256=z6cBdBNjWed7cRyA0Bj7Jd5PmtemVVh07n3mWFj_5U4,4356
|
41
41
|
math_spec_mapping/Load/wiring.py,sha256=1dR94U5N1W_WI5rL6lYBltH25ZvApB2pIpq9r5Opkug,3083
|
42
42
|
math_spec_mapping/Reports/__init__.py,sha256=W27I6S9Ro1hWeHmnxIokCA06awB__eYey7PvKD4Hc1s,933
|
43
43
|
math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-YdcI2ZZ19_Qv_K7Qk,1410
|
44
44
|
math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
|
45
45
|
math_spec_mapping/Reports/general.py,sha256=WOOn6Wlb8M4fsdN49FlKLwOka6vJPQ9aCUy88TL2ki0,1610
|
46
|
-
math_spec_mapping/Reports/html.py,sha256=
|
47
|
-
math_spec_mapping/Reports/markdown.py,sha256=
|
46
|
+
math_spec_mapping/Reports/html.py,sha256=tqydmwFWz_1Bg_J_avG4t9LtE-DUGbOKAPNuwg6lgRI,9007
|
47
|
+
math_spec_mapping/Reports/markdown.py,sha256=JF4D95pocWfQFi5uFjMFewWabuo4MSlfKeoB-TUpWFk,22505
|
48
48
|
math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
|
49
49
|
math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
|
50
50
|
math_spec_mapping/Reports/parameters.py,sha256=yizNG4lNGrgrlzYYcHMGfXKDFlPw4PMDYshDqZ3YARs,535
|
51
51
|
math_spec_mapping/Reports/policies.py,sha256=EuBzBsTM6QSS_GHFcAyhGgWvDDZwRuKe7Eos9nX13ho,1814
|
52
52
|
math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYdtsYnjQ,579
|
53
|
-
math_spec_mapping/Reports/state.py,sha256=
|
53
|
+
math_spec_mapping/Reports/state.py,sha256=RkqfSonar74KVC8PpA9GgI2xaHX6BrkNdAuWMZlYQfI,2321
|
54
54
|
math_spec_mapping/Reports/tables.py,sha256=O0CNuqh3LMECq5uLjBOoxMUk5hUvkUK660FNnwWUxDY,1505
|
55
55
|
math_spec_mapping/Reports/wiring.py,sha256=u9SvKWy6T-WJUEgFI6-zgZanoOaTTs_2YwmEceDLsV8,1618
|
56
|
-
math_spec_mapping-0.3.
|
57
|
-
math_spec_mapping-0.3.
|
58
|
-
math_spec_mapping-0.3.
|
59
|
-
math_spec_mapping-0.3.
|
60
|
-
math_spec_mapping-0.3.
|
56
|
+
math_spec_mapping-0.3.2.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
|
57
|
+
math_spec_mapping-0.3.2.dist-info/METADATA,sha256=whpL8E0F7P53HUUVAYIMsMVTOBv8oFGSok6a6IHF2BM,6012
|
58
|
+
math_spec_mapping-0.3.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
59
|
+
math_spec_mapping-0.3.2.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
|
60
|
+
math_spec_mapping-0.3.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|