math-spec-mapping 0.3.18__py3-none-any.whl → 0.3.20__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/Block.py +3 -0
- math_spec_mapping/Classes/MathSpec.py +109 -7
- math_spec_mapping/Classes/Space.py +17 -2
- math_spec_mapping/Classes/Type.py +3 -0
- math_spec_mapping/Load/action_transmission_channel.py +8 -2
- math_spec_mapping/Load/boundary_actions.py +3 -1
- math_spec_mapping/Load/control_actions.py +3 -1
- math_spec_mapping/Load/general.py +9 -0
- math_spec_mapping/Load/mechanism.py +3 -1
- math_spec_mapping/Load/policy.py +2 -1
- math_spec_mapping/Load/spaces.py +3 -0
- math_spec_mapping/Load/spec_tree.py +28 -7
- math_spec_mapping/Load/stateful_metrics.py +6 -0
- math_spec_mapping/Reports/html.py +13 -0
- math_spec_mapping/Reports/markdown.py +19 -4
- math_spec_mapping/schema.schema.json +3 -0
- {math_spec_mapping-0.3.18.dist-info → math_spec_mapping-0.3.20.dist-info}/METADATA +1 -1
- {math_spec_mapping-0.3.18.dist-info → math_spec_mapping-0.3.20.dist-info}/RECORD +21 -21
- {math_spec_mapping-0.3.18.dist-info → math_spec_mapping-0.3.20.dist-info}/LICENSE +0 -0
- {math_spec_mapping-0.3.18.dist-info → math_spec_mapping-0.3.20.dist-info}/WHEEL +0 -0
- {math_spec_mapping-0.3.18.dist-info → math_spec_mapping-0.3.20.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,7 @@ import os
|
|
8
8
|
from copy import deepcopy
|
9
9
|
import shutil
|
10
10
|
import pandas as pd
|
11
|
-
from inspect import signature, getsource, getfile
|
11
|
+
from inspect import signature, getsource, getfile, getsourcelines
|
12
12
|
from IPython.display import display, Markdown
|
13
13
|
|
14
14
|
|
@@ -439,7 +439,14 @@ class MathSpec:
|
|
439
439
|
|
440
440
|
self._used_spaces = list(set().union(*self._used_spaces))
|
441
441
|
us_names = [y.name for y in self._used_spaces]
|
442
|
-
self._unused_spaces = [
|
442
|
+
self._unused_spaces = [
|
443
|
+
self.spaces[x]
|
444
|
+
for x in self.spaces
|
445
|
+
if x not in us_names and x not in ["Terminating Space", "Empty Space"]
|
446
|
+
]
|
447
|
+
|
448
|
+
if len(self._unused_spaces) > 0:
|
449
|
+
print("The following spaces are not used: {}".format(self._unused_spaces))
|
443
450
|
|
444
451
|
def _add_spec_tree(self, tree):
|
445
452
|
self.tree = tree
|
@@ -535,8 +542,17 @@ class MathSpec:
|
|
535
542
|
component
|
536
543
|
]
|
537
544
|
elif folder == "Displays":
|
538
|
-
|
539
|
-
|
545
|
+
|
546
|
+
for component in self.displays["Wiring"]:
|
547
|
+
if component["name"] not in tree:
|
548
|
+
print(
|
549
|
+
"Can't find component code source in {} for {}".format(
|
550
|
+
folder, component["name"]
|
551
|
+
)
|
552
|
+
)
|
553
|
+
component["Source Code Location"] = None
|
554
|
+
else:
|
555
|
+
component["Source Code Location"] = tree[component["name"]]
|
540
556
|
elif folder == "Spaces":
|
541
557
|
for component in self.spaces:
|
542
558
|
if component in ["Terminating Space", "Empty Space"]:
|
@@ -955,23 +971,31 @@ using .Spaces: generate_space_type
|
|
955
971
|
with open(path, "w") as f:
|
956
972
|
f.write(out)
|
957
973
|
|
958
|
-
def build_implementation(self, params):
|
959
|
-
return MathSpecImplementation(
|
974
|
+
def build_implementation(self, params, domain_codomain_checking=False):
|
975
|
+
return MathSpecImplementation(
|
976
|
+
self, params, domain_codomain_checking=domain_codomain_checking
|
977
|
+
)
|
960
978
|
|
961
979
|
def _set_source_code(self):
|
962
980
|
if "python" not in self.implementations:
|
963
981
|
self.source_code = None
|
964
982
|
return
|
965
983
|
self.source_code = deepcopy(self.implementations["python"])
|
984
|
+
self.source_code_lines = {}
|
966
985
|
for x in self.source_code:
|
986
|
+
self.source_code_lines[x] = {}
|
967
987
|
for y in self.source_code[x]:
|
988
|
+
self.source_code_lines[x][y] = "#L{}".format(
|
989
|
+
getsourcelines(self.source_code[x][y])[1]
|
990
|
+
)
|
968
991
|
self.source_code[x][y] = getsource(self.source_code[x][y])
|
969
992
|
|
970
993
|
|
971
994
|
class MathSpecImplementation:
|
972
|
-
def __init__(self, ms: MathSpec, params):
|
995
|
+
def __init__(self, ms: MathSpec, params, domain_codomain_checking):
|
973
996
|
self.ms = deepcopy(ms)
|
974
997
|
self.params = params
|
998
|
+
self.domain_codomain_checking = domain_codomain_checking
|
975
999
|
self.control_actions = self.load_control_actions()
|
976
1000
|
self.boundary_actions = self.load_boundary_actions()
|
977
1001
|
self.policies = self.load_policies()
|
@@ -1010,6 +1034,14 @@ class MathSpecImplementation:
|
|
1010
1034
|
)
|
1011
1035
|
else:
|
1012
1036
|
control_actions[ca.name] = opt.implementations["python"]
|
1037
|
+
|
1038
|
+
for opt_i in [x for x in ca.control_action_options if x != opt]:
|
1039
|
+
if "python" not in opt_i.implementations:
|
1040
|
+
print(
|
1041
|
+
"No python implementation for {} / {}. To fix this, go to Implementations/Python/ControlActions and add {}".format(
|
1042
|
+
ca.name, opt_i.name, opt_i.name
|
1043
|
+
)
|
1044
|
+
)
|
1013
1045
|
return control_actions
|
1014
1046
|
|
1015
1047
|
def load_boundary_actions(self):
|
@@ -1041,6 +1073,14 @@ class MathSpecImplementation:
|
|
1041
1073
|
)
|
1042
1074
|
else:
|
1043
1075
|
boundary_actions[ba.name] = opt.implementations["python"]
|
1076
|
+
|
1077
|
+
for opt_i in [x for x in ba.boundary_action_options if x != opt]:
|
1078
|
+
if "python" not in opt_i.implementations:
|
1079
|
+
print(
|
1080
|
+
"No python implementation for {} / {}. To fix this, go to Implementations/Python/BoundaryActions and add {}".format(
|
1081
|
+
ba.name, opt_i.name, opt_i.name
|
1082
|
+
)
|
1083
|
+
)
|
1044
1084
|
return boundary_actions
|
1045
1085
|
|
1046
1086
|
def load_mechanisms(self):
|
@@ -1137,6 +1177,14 @@ class MathSpecImplementation:
|
|
1137
1177
|
)
|
1138
1178
|
else:
|
1139
1179
|
policies[p.name] = opt.implementations["python"]
|
1180
|
+
for opt_i in [x for x in p.policy_options if x != opt]:
|
1181
|
+
if "python" not in opt_i.implementations:
|
1182
|
+
print(
|
1183
|
+
"No python implementation for {} / {}. To fix this, go to Implementations/Python/Policies and add {}".format(
|
1184
|
+
p.name, opt_i.name, opt_i.name
|
1185
|
+
)
|
1186
|
+
)
|
1187
|
+
|
1140
1188
|
return policies
|
1141
1189
|
|
1142
1190
|
def load_stateful_metrics(self):
|
@@ -1283,6 +1331,60 @@ class MathSpecImplementation:
|
|
1283
1331
|
self.components.update(self.mechanisms)
|
1284
1332
|
self.components.update(self.wiring)
|
1285
1333
|
|
1334
|
+
self.components_enhanced = {}
|
1335
|
+
|
1336
|
+
def create_wrapper(component, domain_codomain_checking):
|
1337
|
+
def wrapper(
|
1338
|
+
state,
|
1339
|
+
params,
|
1340
|
+
spaces,
|
1341
|
+
domain_codomain_checking=self.domain_codomain_checking,
|
1342
|
+
):
|
1343
|
+
domain = spaces
|
1344
|
+
|
1345
|
+
# Domain Checking
|
1346
|
+
if domain_codomain_checking:
|
1347
|
+
prototype_spaces = self.ms.blocks[component].domain
|
1348
|
+
prototype_spaces = [
|
1349
|
+
x.schema for x in prototype_spaces if x.name != "Empty Space"
|
1350
|
+
]
|
1351
|
+
assert len(prototype_spaces) == len(
|
1352
|
+
domain
|
1353
|
+
), "Length of domain incorrect for {}".format(component)
|
1354
|
+
for space1, space2 in zip(domain, prototype_spaces):
|
1355
|
+
assert set(space1.keys()) == set(
|
1356
|
+
space2.keys()
|
1357
|
+
), "Keys for domain schema of {} is not matched by {} in {} component".format(
|
1358
|
+
set(space2.keys()), set(space1.keys()), component
|
1359
|
+
)
|
1360
|
+
|
1361
|
+
codomain = self.components[component](state, params, spaces)
|
1362
|
+
|
1363
|
+
# Codomain Checking
|
1364
|
+
if domain_codomain_checking and codomain:
|
1365
|
+
prototype_spaces = self.ms.blocks[component].codomain
|
1366
|
+
prototype_spaces = [
|
1367
|
+
x.schema for x in prototype_spaces if x.name != "Empty Space"
|
1368
|
+
]
|
1369
|
+
assert len(prototype_spaces) == len(
|
1370
|
+
codomain
|
1371
|
+
), "Length of codomain incorrect for {}".format(component)
|
1372
|
+
for space1, space2 in zip(codomain, prototype_spaces):
|
1373
|
+
assert set(space1.keys()) == set(
|
1374
|
+
space2.keys()
|
1375
|
+
), "Keys for codomain schema of {} is not matched by {} in {} component".format(
|
1376
|
+
set(space2.keys()), set(space1.keys()), component
|
1377
|
+
)
|
1378
|
+
return codomain
|
1379
|
+
|
1380
|
+
return wrapper
|
1381
|
+
|
1382
|
+
for component in self.components:
|
1383
|
+
|
1384
|
+
self.components_enhanced[component] = create_wrapper(
|
1385
|
+
component, self.domain_codomain_checking
|
1386
|
+
)
|
1387
|
+
|
1286
1388
|
def execute_blocks(self, state, params, blocks):
|
1287
1389
|
for block in blocks:
|
1288
1390
|
self.components[block](state, params, [])
|
@@ -6,6 +6,7 @@ class Space:
|
|
6
6
|
self.name = data["name"]
|
7
7
|
self.schema = data["schema"]
|
8
8
|
self.metadata = data["metadata"]
|
9
|
+
self.description = data["description"]
|
9
10
|
self.name_variable = self.name.replace(" ", "").replace("-", "_")
|
10
11
|
self.domain_blocks = []
|
11
12
|
self.codomain_blocks = []
|
@@ -14,5 +15,19 @@ class Space:
|
|
14
15
|
return self.name
|
15
16
|
|
16
17
|
|
17
|
-
TerminatingSpace = Space(
|
18
|
-
|
18
|
+
TerminatingSpace = Space(
|
19
|
+
{
|
20
|
+
"name": "Terminating Space",
|
21
|
+
"schema": {},
|
22
|
+
"metadata": {},
|
23
|
+
"description": "Built-in space for denoting termination of block",
|
24
|
+
}
|
25
|
+
)
|
26
|
+
EmptySpace = Space(
|
27
|
+
{
|
28
|
+
"name": "Empty Space",
|
29
|
+
"schema": {},
|
30
|
+
"metadata": {},
|
31
|
+
"description": "Built-in space for denoting returning no data",
|
32
|
+
}
|
33
|
+
)
|
@@ -50,8 +50,14 @@ def convert_action_transmission_channel(
|
|
50
50
|
data["target"] = ms["Mechanisms"][target]
|
51
51
|
|
52
52
|
# Add in called by and called here with origin and target
|
53
|
-
|
54
|
-
|
53
|
+
if (data["target"], data["optional"], data["space"]) not in data["origin"].calls:
|
54
|
+
data["origin"].calls.append((data["target"], data["optional"], data["space"]))
|
55
|
+
if (data["origin"], data["optional"], data["space"]) not in data[
|
56
|
+
"target"
|
57
|
+
].called_by:
|
58
|
+
data["target"].called_by.append(
|
59
|
+
(data["origin"], data["optional"], data["space"])
|
60
|
+
)
|
55
61
|
|
56
62
|
# Build the action transmission channel object
|
57
63
|
return ActionTransmissionChannel(data)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from typing import Dict
|
2
2
|
from ..Classes import BoundaryAction, BoundaryActionOption
|
3
|
-
from .general import check_json_keys
|
3
|
+
from .general import check_json_keys, check_domain_codomain_spaces
|
4
4
|
|
5
5
|
|
6
6
|
def convert_boundary_action(data: Dict, ms: Dict) -> BoundaryAction:
|
@@ -24,6 +24,8 @@ def convert_boundary_action(data: Dict, ms: Dict) -> BoundaryAction:
|
|
24
24
|
data["name"]
|
25
25
|
)
|
26
26
|
|
27
|
+
check_domain_codomain_spaces(data, ms)
|
28
|
+
|
27
29
|
if len(data["codomain"]) == 0:
|
28
30
|
data["codomain"] = ("Empty Space",)
|
29
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from typing import Dict
|
2
2
|
from ..Classes import ControlAction, ControlActionOption
|
3
|
-
from .general import check_json_keys
|
3
|
+
from .general import check_json_keys, check_domain_codomain_spaces
|
4
4
|
|
5
5
|
|
6
6
|
def convert_control_action(data: Dict, ms: Dict) -> ControlAction:
|
@@ -25,6 +25,8 @@ def convert_control_action(data: Dict, ms: Dict) -> ControlAction:
|
|
25
25
|
data["name"]
|
26
26
|
)
|
27
27
|
|
28
|
+
check_domain_codomain_spaces(data, ms)
|
29
|
+
|
28
30
|
if len(data["codomain"]) == 0:
|
29
31
|
data["codomain"] = ("Empty Space",)
|
30
32
|
|
@@ -159,3 +159,12 @@ def check_json_keys(json: Dict, check_set_key: str) -> None:
|
|
159
159
|
|
160
160
|
def validate_json_schema(json):
|
161
161
|
validate(json, schema)
|
162
|
+
|
163
|
+
|
164
|
+
def check_domain_codomain_spaces(json: Dict, ms) -> None:
|
165
|
+
if "domain" in json:
|
166
|
+
for key in json["domain"]:
|
167
|
+
assert key in ms["Spaces"], "{} not in spaces".format(key)
|
168
|
+
if "codomain" in json:
|
169
|
+
for key in json["codomain"]:
|
170
|
+
assert key in ms["Spaces"], "{} not in spaces".format(key)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
from typing import Dict
|
2
2
|
from ..Classes import Mechanism
|
3
|
-
from .general import check_json_keys
|
3
|
+
from .general import check_json_keys, check_domain_codomain_spaces
|
4
4
|
|
5
5
|
|
6
6
|
def convert_mechanism(data: Dict, ms: Dict) -> Mechanism:
|
@@ -26,6 +26,8 @@ def convert_mechanism(data: Dict, ms: Dict) -> Mechanism:
|
|
26
26
|
if len(data["domain"]) == 0:
|
27
27
|
data["domain"] = ("Empty Space",)
|
28
28
|
|
29
|
+
check_domain_codomain_spaces(data, ms)
|
30
|
+
|
29
31
|
# Copy
|
30
32
|
data = data.copy()
|
31
33
|
|
math_spec_mapping/Load/policy.py
CHANGED
@@ -2,7 +2,7 @@ from typing import Dict
|
|
2
2
|
from ..Classes import Policy, PolicyOption
|
3
3
|
|
4
4
|
|
5
|
-
from .general import check_json_keys
|
5
|
+
from .general import check_json_keys, check_domain_codomain_spaces
|
6
6
|
|
7
7
|
|
8
8
|
def convert_policy_options(data: Dict, ms) -> PolicyOption:
|
@@ -58,6 +58,7 @@ def convert_policy(data: Dict, ms: Dict) -> Policy:
|
|
58
58
|
assert type(data["domain"]) == tuple, "{} domain is not a tuple".format(
|
59
59
|
data["name"]
|
60
60
|
)
|
61
|
+
check_domain_codomain_spaces(data, ms)
|
61
62
|
|
62
63
|
if len(data["codomain"]) == 0:
|
63
64
|
data["codomain"] = ("Empty Space",)
|
math_spec_mapping/Load/spaces.py
CHANGED
@@ -2,6 +2,18 @@ import ast
|
|
2
2
|
import os
|
3
3
|
|
4
4
|
|
5
|
+
def index_to_line_and_column(lines, index):
|
6
|
+
cumulative_length = 0
|
7
|
+
for line_number, line in enumerate(lines):
|
8
|
+
line_length = len(line) + 1 # +1 for the newline character
|
9
|
+
if cumulative_length + line_length > index:
|
10
|
+
column = index - cumulative_length
|
11
|
+
return line_number, column
|
12
|
+
cumulative_length += line_length
|
13
|
+
|
14
|
+
raise ValueError("Index out of range")
|
15
|
+
|
16
|
+
|
5
17
|
def load_spec_tree(path, ms):
|
6
18
|
tree = {}
|
7
19
|
for folder in [
|
@@ -61,11 +73,20 @@ def load_spec_tree(path, ms):
|
|
61
73
|
assert False, "Not implemented for imports that are not import from"
|
62
74
|
elif isinstance(node, ast.ImportFrom):
|
63
75
|
if node.module:
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
76
|
+
file_path = "{}/{}/{}.py".format(path, folder, node.module)
|
77
|
+
|
78
|
+
with open(file_path, "r") as file2:
|
79
|
+
contents = file2.read()
|
80
|
+
split = contents.split("\n")
|
81
|
+
for key in keys:
|
82
|
+
if key in contents:
|
83
|
+
line_number = (
|
84
|
+
index_to_line_and_column(
|
85
|
+
split, contents.index(key)
|
86
|
+
)[0]
|
87
|
+
+ 1
|
88
|
+
)
|
89
|
+
tree[folder][key] = os.path.abspath(
|
90
|
+
file_path
|
91
|
+
) + "#L{}".format(line_number)
|
71
92
|
return tree
|
@@ -40,6 +40,12 @@ def convert_stateful_metric(ms, data: Dict) -> StatefulMetricSet:
|
|
40
40
|
x[1]
|
41
41
|
)
|
42
42
|
|
43
|
+
assert (
|
44
|
+
var["type"] in ms["Types"] or var["type"] in ms["Spaces"]
|
45
|
+
), "{} type/space referenced by {} is not present in math spec".format(
|
46
|
+
var["type"], var["name"]
|
47
|
+
)
|
48
|
+
|
43
49
|
var["implementations"] = {}
|
44
50
|
if "python" in ms["Implementations"]:
|
45
51
|
if "stateful_metrics" in ms["Implementations"]["python"]:
|
@@ -169,6 +169,13 @@ cssclasses:
|
|
169
169
|
else:
|
170
170
|
out += symbol3 + "{}".format(var.name) + "\n"
|
171
171
|
|
172
|
+
out += symbol1 + "**Metrics**\n"
|
173
|
+
for name in ms.metrics.keys():
|
174
|
+
if linking:
|
175
|
+
out += symbol2 + "[[{}]]".format(name) + "\n"
|
176
|
+
else:
|
177
|
+
out += symbol2 + "{}".format(name) + "\n"
|
178
|
+
|
172
179
|
out += symbol1 + "**Types**\n"
|
173
180
|
for name in ms.types.keys():
|
174
181
|
if linking:
|
@@ -221,6 +228,12 @@ cssclasses:
|
|
221
228
|
out += symbol2 + "[[{}]]".format(name) + "\n"
|
222
229
|
else:
|
223
230
|
out += symbol2 + name + "\n"
|
231
|
+
out += symbol1 + "**Wirings**\n"
|
232
|
+
for name in ms.wiring.keys():
|
233
|
+
if linking:
|
234
|
+
out += symbol2 + "[[{}]]".format(name) + "\n"
|
235
|
+
else:
|
236
|
+
out += symbol2 + name + "\n"
|
224
237
|
|
225
238
|
if add_tabbing:
|
226
239
|
out = out.split("\n")
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import os
|
2
2
|
from .state import write_state_section
|
3
|
-
from inspect import signature, getsource, getfile
|
3
|
+
from inspect import signature, getsource, getfile, getsourcelines
|
4
4
|
|
5
5
|
|
6
6
|
def get_source_code(
|
@@ -16,7 +16,7 @@ def get_source_code(
|
|
16
16
|
{}```""".format(
|
17
17
|
getsource(code)
|
18
18
|
)
|
19
|
-
file_path = getfile(code)
|
19
|
+
file_path = getfile(code) + "#L{}".format(getsourcelines(code)[1])
|
20
20
|
return source_code, file_path
|
21
21
|
|
22
22
|
|
@@ -67,7 +67,10 @@ def write_entity_markdown_report(ms, path, entity, add_metadata=True):
|
|
67
67
|
|
68
68
|
|
69
69
|
def write_source_code_block(component, text, path):
|
70
|
-
|
70
|
+
if hasattr(component, "source_code_location"):
|
71
|
+
file_path = component.source_code_location
|
72
|
+
else:
|
73
|
+
file_path = component["Source Code Location"]
|
71
74
|
if file_path:
|
72
75
|
file_path = os.path.relpath(file_path, path)
|
73
76
|
text += "## Spec Source Code Location\n\n"
|
@@ -434,6 +437,13 @@ def write_space_markdown_report(ms, path, space, add_metadata=True):
|
|
434
437
|
"\n".join(["{}: {}".format(x, metadata[x]) for x in metadata])
|
435
438
|
)
|
436
439
|
|
440
|
+
if space.description:
|
441
|
+
out += "## Description"
|
442
|
+
out += "\n"
|
443
|
+
out += space.description
|
444
|
+
out += "\n"
|
445
|
+
out += "\n"
|
446
|
+
|
437
447
|
out += "## Schema"
|
438
448
|
out += "\n"
|
439
449
|
out += "\n"
|
@@ -855,6 +865,8 @@ def write_state_variables_markdown_reports(ms, path, state, add_metadata=True):
|
|
855
865
|
out += "Description: "
|
856
866
|
out += variable.description
|
857
867
|
out += "\n\n"
|
868
|
+
out += "Underlying state: [[{}]]".format(state.name)
|
869
|
+
out += "\n\n"
|
858
870
|
out += "Type: [["
|
859
871
|
out += variable.type.name
|
860
872
|
out += "]]\n\n"
|
@@ -939,7 +951,10 @@ def write_wiring_display_markdown_report(ms, path, wiring, add_metadata=True):
|
|
939
951
|
out += "\n"
|
940
952
|
out += "\n"
|
941
953
|
|
942
|
-
|
954
|
+
path = "{}/Displays/Wiring/{}.md".format(path, wiring["name"])
|
955
|
+
out = write_source_code_block(wiring, out, path)
|
956
|
+
|
957
|
+
with open(path, "w") as f:
|
943
958
|
f.write(out)
|
944
959
|
|
945
960
|
|
@@ -1,43 +1,43 @@
|
|
1
1
|
math_spec_mapping/__init__.py,sha256=7fGuxoSDYl61z0PZ_PzS6x5P8l174gOzobI9u0aoLVw,1260
|
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=NyzUy899YR_5Y956ID5HQtgnRBrNTAN6QjrqCyBasRA,31005
|
4
4
|
math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
|
5
|
-
math_spec_mapping/Classes/Block.py,sha256=
|
5
|
+
math_spec_mapping/Classes/Block.py,sha256=KHdGILGW7G29nXXsrjeRkKsilqEqYl31ZV1u9gm4xio,20147
|
6
6
|
math_spec_mapping/Classes/BoundaryAction.py,sha256=_rFvEZ4LNxmlM59js4SuQ9n5CgVmITw4YWKs0-q0r-4,560
|
7
7
|
math_spec_mapping/Classes/ControlAction.py,sha256=4AzMSA8fbnUf-fGlvMJXHJFbz32G1h1QVWf2yzrXrLA,493
|
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=nQTesARmLrYagoW2T3G6gbidTsFM-NFC9yl3Li01ey8,55970
|
10
10
|
math_spec_mapping/Classes/Mechanism.py,sha256=2sLm3wYBIeTQaMBcsJ9btqIWsbS895Ra8NY6Y9_G_Dg,379
|
11
11
|
math_spec_mapping/Classes/Metric.py,sha256=iQhH4g8Z60QlM22nPX9ytGmidOsZSiSs0KjqwmsScwU,636
|
12
12
|
math_spec_mapping/Classes/Parameter.py,sha256=ZuJ_w0sChvRElJ4sOnXZ2EV4Ell2xXFulKLjVOpgz2E,1237
|
13
13
|
math_spec_mapping/Classes/Policy.py,sha256=Nso8QJMBDeyN66VkZ29nnZ1WjaMnReMn7SxKt_bRngU,481
|
14
|
-
math_spec_mapping/Classes/Space.py,sha256=
|
14
|
+
math_spec_mapping/Classes/Space.py,sha256=tdxah3TtixvT0wCqljC_pXFRvO92TY6lomGu2WS8Jtw,806
|
15
15
|
math_spec_mapping/Classes/State.py,sha256=U40DoF2qlx_k9gvqQiP1S3C9ZLk3cW_-jmJn71TiCxg,1599
|
16
16
|
math_spec_mapping/Classes/StateUpdateTransmissionChannel.py,sha256=3hBLvD1lE64PkwqksBXAfFWv7foOZzGQLAFQWy42tOA,257
|
17
17
|
math_spec_mapping/Classes/StatefulMetric.py,sha256=plMFMAFEk1y2t4DR5lA2SRC9UrYArsx_W33l3mZSdgE,804
|
18
|
-
math_spec_mapping/Classes/Type.py,sha256=
|
18
|
+
math_spec_mapping/Classes/Type.py,sha256=cA5-5nOfjX6aHzTHM8M6mP5lsS7foumckRu7WDX610M,339
|
19
19
|
math_spec_mapping/Classes/__init__.py,sha256=0zxgOqns_9JybD74HKMVh6aw8ij8WVbfQ4Q_1uWzof0,761
|
20
20
|
math_spec_mapping/Convenience/__init__.py,sha256=BEZr1rXohKAknOa3wjNVx3EvSVxDcfftJsvtSw5mvmQ,264
|
21
21
|
math_spec_mapping/Convenience/documentation.py,sha256=1ziWVJznbCUxeAAt03nAdEYtMlXNo5TeedHfgs0vSBU,1625
|
22
22
|
math_spec_mapping/Convenience/github.py,sha256=Wddr1FCxcIxaFeiKyvx3mvVDbzjcgTxs4rU8ulc4qXk,3539
|
23
23
|
math_spec_mapping/Convenience/starter.py,sha256=dD1R9wcVFZV-BCTflxNkR6Ay6NF1TlVBdIaWmbJwMGE,17379
|
24
24
|
math_spec_mapping/Load/__init__.py,sha256=QfHMLatZAKqj4up-LkDL_r42tO7Mo_-qdqPQYLYY5l0,49
|
25
|
-
math_spec_mapping/Load/action_transmission_channel.py,sha256=
|
26
|
-
math_spec_mapping/Load/boundary_actions.py,sha256=
|
27
|
-
math_spec_mapping/Load/control_actions.py,sha256=
|
25
|
+
math_spec_mapping/Load/action_transmission_channel.py,sha256=oTYCi7as4LWKZLxfRckuWpfLsAPZXjp-VBYmyLBN3yk,2781
|
26
|
+
math_spec_mapping/Load/boundary_actions.py,sha256=sR1JWzWD-9jegIQ8Api_NNUp11RgYM-6sAi1Pq-vkss,3007
|
27
|
+
math_spec_mapping/Load/control_actions.py,sha256=gL4HVn81e1UwBjUKEVtNEJop7E8KQGuq4F43oMaoyvA,2445
|
28
28
|
math_spec_mapping/Load/displays.py,sha256=uQvs0Jhp8-9SXGex8SG3ibxHJu7ahAV3xLeBFbT8QEE,480
|
29
29
|
math_spec_mapping/Load/entities.py,sha256=Ds7VQY_govWEn1vSHYVrLa8IadSNyOQzaCK18JPYPKk,1289
|
30
|
-
math_spec_mapping/Load/general.py,sha256=
|
30
|
+
math_spec_mapping/Load/general.py,sha256=Wjg0ESB80j9UwvoRB_-J8SBKq3KqCFZAKsuKNJFqkE4,4789
|
31
31
|
math_spec_mapping/Load/implementations.py,sha256=a8YvumnyQvrnCo-o52Rv4yU8D7nmkMrV1iIA15fr6Bw,490
|
32
32
|
math_spec_mapping/Load/load.py,sha256=Cm1IP_jIzWNGFVPcb1OOfQQYSNgyIfUdT--v1D1dkKE,2797
|
33
|
-
math_spec_mapping/Load/mechanism.py,sha256=
|
33
|
+
math_spec_mapping/Load/mechanism.py,sha256=6tgISsxc-SXCYS5yxuIqnl0nX__t1k0uj9z0O0E1uC4,2367
|
34
34
|
math_spec_mapping/Load/metrics.py,sha256=CcVM0_aN-aPnH5_AyEKzFCJGPbgMb0brw5nECsdNVeU,3936
|
35
35
|
math_spec_mapping/Load/parameters.py,sha256=W4utm7to3s2fo4z3XgLH0TM1agaIad1qfM2I-lLMua4,1393
|
36
|
-
math_spec_mapping/Load/policy.py,sha256=
|
37
|
-
math_spec_mapping/Load/spaces.py,sha256=
|
38
|
-
math_spec_mapping/Load/spec_tree.py,sha256=
|
36
|
+
math_spec_mapping/Load/policy.py,sha256=61F7sobAwaXrT1g_pXqBmQS0O-jekdQ1nB9C658LJyg,2770
|
37
|
+
math_spec_mapping/Load/spaces.py,sha256=PcAQ8QnsCZQarPaymUhESqbRMXH-uVRumXTh-E256A4,1256
|
38
|
+
math_spec_mapping/Load/spec_tree.py,sha256=cRSvb3vHPJIJ7pS6KKH3yJLJXPQXMMPt-ciX9NccQhM,3264
|
39
39
|
math_spec_mapping/Load/state_update_transmission_channels.py,sha256=FJWp5n4HdtHAfof5BUQ6BnRakljatL2h8dWCapaVSc0,2238
|
40
|
-
math_spec_mapping/Load/stateful_metrics.py,sha256=
|
40
|
+
math_spec_mapping/Load/stateful_metrics.py,sha256=eNXIsNmezVN75L3zMXUl8_JORShm_ovJuM7vkiODs7s,2599
|
41
41
|
math_spec_mapping/Load/states.py,sha256=3YurI7eTNkN6nrXRFVrc58wH0VfM22XOuWE07HVpR7Y,1365
|
42
42
|
math_spec_mapping/Load/type.py,sha256=FbViE3wV1o1JTx7mUYyUpAvgIxDKDQYc6Iw50FrZ4nY,4808
|
43
43
|
math_spec_mapping/Load/wiring.py,sha256=l1FhHNFRMKorn1oiRhsuMDsExcXnUmTjqQt5ElE-Bbk,3258
|
@@ -45,8 +45,8 @@ math_spec_mapping/Reports/__init__.py,sha256=P3IuE1wiM1EO_yCSD73D4O0O6j7aVWmiwpK
|
|
45
45
|
math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-YdcI2ZZ19_Qv_K7Qk,1410
|
46
46
|
math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
|
47
47
|
math_spec_mapping/Reports/general.py,sha256=WOOn6Wlb8M4fsdN49FlKLwOka6vJPQ9aCUy88TL2ki0,1610
|
48
|
-
math_spec_mapping/Reports/html.py,sha256=
|
49
|
-
math_spec_mapping/Reports/markdown.py,sha256=
|
48
|
+
math_spec_mapping/Reports/html.py,sha256=MCVp_D1LuRoZrHtwzFOJGQviztGeahqsWf3Zue1Yz64,10134
|
49
|
+
math_spec_mapping/Reports/markdown.py,sha256=q4dCzH6dDE0TLJ3XS7olUpDfPk8323IEPbT9ki7GEgE,30595
|
50
50
|
math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
|
51
51
|
math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
|
52
52
|
math_spec_mapping/Reports/parameters.py,sha256=-ucL71lolqU0xvV7yb0sXl4pFMRl5tXNWdoBfUjLOaQ,1944
|
@@ -55,8 +55,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
|
|
55
55
|
math_spec_mapping/Reports/state.py,sha256=QYeCvX5cHeZBrbvMeDsTqJcUDTuDFJSLvPbasjLspk8,3643
|
56
56
|
math_spec_mapping/Reports/tables.py,sha256=O0CNuqh3LMECq5uLjBOoxMUk5hUvkUK660FNnwWUxDY,1505
|
57
57
|
math_spec_mapping/Reports/wiring.py,sha256=u9SvKWy6T-WJUEgFI6-zgZanoOaTTs_2YwmEceDLsV8,1618
|
58
|
-
math_spec_mapping-0.3.
|
59
|
-
math_spec_mapping-0.3.
|
60
|
-
math_spec_mapping-0.3.
|
61
|
-
math_spec_mapping-0.3.
|
62
|
-
math_spec_mapping-0.3.
|
58
|
+
math_spec_mapping-0.3.20.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
|
59
|
+
math_spec_mapping-0.3.20.dist-info/METADATA,sha256=NXnBv92-ZzX5ESZFyq6bzbKWGa5Jq1y0cPddW7o4ndc,6498
|
60
|
+
math_spec_mapping-0.3.20.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
61
|
+
math_spec_mapping-0.3.20.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
|
62
|
+
math_spec_mapping-0.3.20.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|