math-spec-mapping 0.4.1.2__py3-none-any.whl → 0.4.3__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 +29 -2
- math_spec_mapping/Convenience/__init__.py +1 -0
- math_spec_mapping/Convenience/cadCAD.py +21 -0
- math_spec_mapping/Load/load.py +4 -0
- math_spec_mapping/Reports/__init__.py +2 -1
- math_spec_mapping/Reports/advanced.py +57 -0
- math_spec_mapping/Reports/general.py +20 -2
- math_spec_mapping/Reports/markdown.py +4 -1
- math_spec_mapping/__init__.py +3 -0
- {math_spec_mapping-0.4.1.2.dist-info → math_spec_mapping-0.4.3.dist-info}/METADATA +3 -2
- {math_spec_mapping-0.4.1.2.dist-info → math_spec_mapping-0.4.3.dist-info}/RECORD +14 -12
- {math_spec_mapping-0.4.1.2.dist-info → math_spec_mapping-0.4.3.dist-info}/LICENSE +0 -0
- {math_spec_mapping-0.4.1.2.dist-info → math_spec_mapping-0.4.3.dist-info}/WHEEL +0 -0
- {math_spec_mapping-0.4.1.2.dist-info → math_spec_mapping-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1041,10 +1041,25 @@ using .Spaces: generate_space_type
|
|
1041
1041
|
blocks,
|
1042
1042
|
state_preperation_functions=[],
|
1043
1043
|
parameter_preperation_functions=[],
|
1044
|
+
fixed_parameters=None,
|
1045
|
+
fixed_state=None,
|
1044
1046
|
):
|
1045
1047
|
out = {}
|
1046
1048
|
out["StateSpace"] = self._build_state_space()
|
1049
|
+
if fixed_state:
|
1050
|
+
for key in fixed_state:
|
1051
|
+
assert (
|
1052
|
+
key in out["StateSpace"]
|
1053
|
+
), "The fixed parameter {} is not in the state space".format(key)
|
1054
|
+
out["StateSpace"].pop(key)
|
1055
|
+
|
1047
1056
|
out["ParameterSpace"] = self._build_parameter_space()
|
1057
|
+
if fixed_parameters:
|
1058
|
+
for key in fixed_parameters:
|
1059
|
+
assert (
|
1060
|
+
key in out["ParameterSpace"]
|
1061
|
+
), "The fixed parameter {} is not in the parameter space".format(key)
|
1062
|
+
out["ParameterSpace"].pop(key)
|
1048
1063
|
out["Model"] = cadCADModel(
|
1049
1064
|
self,
|
1050
1065
|
out["StateSpace"],
|
@@ -1052,6 +1067,8 @@ using .Spaces: generate_space_type
|
|
1052
1067
|
blocks,
|
1053
1068
|
state_preperation_functions=state_preperation_functions,
|
1054
1069
|
parameter_preperation_functions=parameter_preperation_functions,
|
1070
|
+
fixed_parameters=fixed_parameters,
|
1071
|
+
fixed_state=fixed_state,
|
1055
1072
|
)
|
1056
1073
|
return out
|
1057
1074
|
|
@@ -1079,6 +1096,8 @@ class cadCADModel:
|
|
1079
1096
|
blocks,
|
1080
1097
|
state_preperation_functions=[],
|
1081
1098
|
parameter_preperation_functions=[],
|
1099
|
+
fixed_parameters=None,
|
1100
|
+
fixed_state=None,
|
1082
1101
|
):
|
1083
1102
|
self.ms = ms
|
1084
1103
|
self.state_space = state_space
|
@@ -1086,10 +1105,18 @@ class cadCADModel:
|
|
1086
1105
|
self.blocks = blocks
|
1087
1106
|
self.state_preperation_functions = state_preperation_functions
|
1088
1107
|
self.parameter_preperation_functions = parameter_preperation_functions
|
1108
|
+
self.fixed_parameters = fixed_parameters
|
1109
|
+
self.fixed_state = fixed_state
|
1089
1110
|
|
1090
1111
|
def create_experiment(
|
1091
1112
|
self, state, params, record_trajectory=False, use_deepcopy=True
|
1092
1113
|
):
|
1114
|
+
if self.fixed_state:
|
1115
|
+
for x in self.fixed_state:
|
1116
|
+
state[x] = self.fixed_state[x]
|
1117
|
+
if self.fixed_parameters:
|
1118
|
+
for x in self.fixed_parameters:
|
1119
|
+
params[x] = self.fixed_parameters[x]
|
1093
1120
|
return Experiment(
|
1094
1121
|
self,
|
1095
1122
|
state,
|
@@ -1180,11 +1207,11 @@ class BatchExperiments:
|
|
1180
1207
|
def step(self):
|
1181
1208
|
for experiment in self.experiments:
|
1182
1209
|
experiment.step()
|
1183
|
-
|
1210
|
+
|
1184
1211
|
def run(self, t):
|
1185
1212
|
for experiment in self.experiments:
|
1186
1213
|
experiment.run(t)
|
1187
|
-
|
1214
|
+
|
1188
1215
|
@property
|
1189
1216
|
def trajectories(self):
|
1190
1217
|
return [experiment.trajectories for experiment in self.experiments]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from copy import deepcopy
|
2
|
+
from typing import _TypedDictMeta, _GenericAlias
|
3
|
+
|
4
|
+
|
5
|
+
def get_underlying_type(data):
|
6
|
+
if type(data) == _GenericAlias:
|
7
|
+
data = [get_underlying_type(x) for x in data.__args__]
|
8
|
+
elif type(data) == _TypedDictMeta:
|
9
|
+
data = get_nested_types(data.__annotations__)
|
10
|
+
return data
|
11
|
+
|
12
|
+
|
13
|
+
def get_nested_types(data):
|
14
|
+
data = deepcopy(data)
|
15
|
+
for key in data:
|
16
|
+
if type(data[key]) == _TypedDictMeta:
|
17
|
+
data[key] = get_nested_types(data[key].__annotations__)
|
18
|
+
elif type(data[key]) == _GenericAlias:
|
19
|
+
data[key] = get_underlying_type(data[key])
|
20
|
+
|
21
|
+
return data
|
math_spec_mapping/Load/load.py
CHANGED
@@ -86,4 +86,8 @@ def load_from_json(json: Dict, spec_path=None) -> MathSpec:
|
|
86
86
|
if spec_path:
|
87
87
|
tree = load_spec_tree(spec_path, ms)
|
88
88
|
ms._add_spec_tree(tree)
|
89
|
+
else:
|
90
|
+
print(
|
91
|
+
"Add spec path to load_from_json to load spec tree and allow linking to the code in Obsidian"
|
92
|
+
)
|
89
93
|
return ms
|
@@ -2,7 +2,7 @@ from .node_map import create_action_chains_graph
|
|
2
2
|
from .boundary_actions import write_out_boundary_actions
|
3
3
|
from .policies import write_out_policies
|
4
4
|
from .mechanisms import write_out_mechanisms
|
5
|
-
from .general import load_svg_graphviz
|
5
|
+
from .general import load_svg_graphviz, convert_markdown_to_pdf
|
6
6
|
from .html import (
|
7
7
|
write_basic_report_full,
|
8
8
|
write_action_chain_reports,
|
@@ -32,3 +32,4 @@ from .state import (
|
|
32
32
|
write_initial_state_variables_tables,
|
33
33
|
)
|
34
34
|
from .parameters import write_parameter_table_markdown
|
35
|
+
from .advanced import write_glossary_report
|
@@ -0,0 +1,57 @@
|
|
1
|
+
from ..Classes import MathSpec
|
2
|
+
from .state import write_state_section
|
3
|
+
|
4
|
+
|
5
|
+
def write_glossary_report(ms: MathSpec, directory: str) -> None:
|
6
|
+
"""Function to write a report of each component and its description in MSML
|
7
|
+
|
8
|
+
Args:
|
9
|
+
ms (MathSpec): The mathematical specification object
|
10
|
+
directory (str): Directory to put reports into
|
11
|
+
"""
|
12
|
+
out = "# Glossary\n\n"
|
13
|
+
|
14
|
+
out += "## Entities\n\n"
|
15
|
+
for entity in ms.entities:
|
16
|
+
if entity == "Global":
|
17
|
+
continue
|
18
|
+
entity = ms.entities[entity]
|
19
|
+
out += "**{}**: {}".format(entity.name, entity.notes)
|
20
|
+
out += "\n\n"
|
21
|
+
out += "\n"
|
22
|
+
|
23
|
+
out += "## State\n\n"
|
24
|
+
states = list(ms.state.keys())
|
25
|
+
states.remove("Global State")
|
26
|
+
states = ["Global State"] + states
|
27
|
+
for state in states:
|
28
|
+
out += "### {}\n\n".format(state)
|
29
|
+
out += write_state_section(ms.state[state])
|
30
|
+
out += "\n\n"
|
31
|
+
out += "\n\n"
|
32
|
+
|
33
|
+
for name, component in [
|
34
|
+
["Types", ms.types],
|
35
|
+
["Spaces", ms.spaces],
|
36
|
+
["Boundary Actions", ms.boundary_actions],
|
37
|
+
["Control Actions", ms.control_actions],
|
38
|
+
["Policies", ms.policies],
|
39
|
+
["Mechanisms", ms.mechanisms],
|
40
|
+
["Wiring", ms.wiring],
|
41
|
+
["Parameters", ms.parameters.parameter_map],
|
42
|
+
["Stateful Metrics", ms.stateful_metrics],
|
43
|
+
["Metrics", ms.metrics],
|
44
|
+
]:
|
45
|
+
out += "## {}\n\n".format(name)
|
46
|
+
for key in component:
|
47
|
+
if hasattr(component[key], "description"):
|
48
|
+
desc = component[key].description
|
49
|
+
else:
|
50
|
+
desc = component[key].notes
|
51
|
+
|
52
|
+
out += "**{}**: {}\n\n".format(key, desc)
|
53
|
+
out += "\n\n"
|
54
|
+
|
55
|
+
path = directory + "/Glossary.md"
|
56
|
+
with open(path, "w") as f:
|
57
|
+
f.write(out)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from graphviz import Digraph
|
2
2
|
import os
|
3
|
+
import pypandoc
|
3
4
|
|
4
5
|
|
5
6
|
def load_svg_graphviz(graph: Digraph, overwrite: bool = False) -> str:
|
@@ -23,7 +24,7 @@ def load_svg_graphviz(graph: Digraph, overwrite: bool = False) -> str:
|
|
23
24
|
assert "{}.gv".format(graph.name) not in os.listdir(".")
|
24
25
|
|
25
26
|
# Render the graph
|
26
|
-
graph.render(directory=".", format=
|
27
|
+
graph.render(directory=".", format="svg")
|
27
28
|
|
28
29
|
# Read the svg
|
29
30
|
with open("./{}.gv.svg".format(graph.name), "r") as f:
|
@@ -35,6 +36,7 @@ def load_svg_graphviz(graph: Digraph, overwrite: bool = False) -> str:
|
|
35
36
|
|
36
37
|
return svg
|
37
38
|
|
39
|
+
|
38
40
|
def write_header() -> str:
|
39
41
|
out = '<p>For explanations of generalized dynamical systems as well as how the mathematical specification library works in detail, please consult the documentation <a href="https://github.com/BlockScience/MSML/tree/main/docs">here</a></p>'
|
40
42
|
out += "Graph Legend:<br/>"
|
@@ -43,4 +45,20 @@ def write_header() -> str:
|
|
43
45
|
out += "Red Square: Policy<br/>"
|
44
46
|
out += "Blue Circle: Mechanism<br/>"
|
45
47
|
out += "Transparent Circle: State Variable"
|
46
|
-
return out
|
48
|
+
return out
|
49
|
+
|
50
|
+
|
51
|
+
def convert_markdown_to_pdf(md_path, pdf_path, pdflatex_path=None):
|
52
|
+
if pdflatex_path:
|
53
|
+
pypandoc.convert_file(
|
54
|
+
md_path,
|
55
|
+
"pdf",
|
56
|
+
outputfile=pdf_path,
|
57
|
+
extra_args=["--pdf-engine={}".format(pdflatex_path)],
|
58
|
+
)
|
59
|
+
else:
|
60
|
+
pypandoc.convert_file(
|
61
|
+
md_path,
|
62
|
+
"pdf",
|
63
|
+
outputfile=pdf_path,
|
64
|
+
)
|
@@ -70,7 +70,10 @@ def write_source_code_block(component, text, path):
|
|
70
70
|
if hasattr(component, "source_code_location"):
|
71
71
|
file_path = component.source_code_location
|
72
72
|
else:
|
73
|
-
|
73
|
+
try:
|
74
|
+
file_path = component["Source Code Location"]
|
75
|
+
except:
|
76
|
+
file_path = None
|
74
77
|
if file_path:
|
75
78
|
file_path = os.path.relpath(file_path, path)
|
76
79
|
text += "## Spec Source Code Location\n\n"
|
math_spec_mapping/__init__.py
CHANGED
@@ -28,6 +28,8 @@ from .Reports import (
|
|
28
28
|
write_state_variable_table_markdown,
|
29
29
|
write_initial_state_variables_tables,
|
30
30
|
write_parameter_table_markdown,
|
31
|
+
write_glossary_report,
|
32
|
+
convert_markdown_to_pdf,
|
31
33
|
)
|
32
34
|
from .schema import schema
|
33
35
|
from .Convenience import (
|
@@ -36,6 +38,7 @@ from .Convenience import (
|
|
36
38
|
find_open_issues,
|
37
39
|
create_priority_label_matrix,
|
38
40
|
create_milestone_label_matrix,
|
41
|
+
get_nested_types,
|
39
42
|
)
|
40
43
|
|
41
44
|
# from .Convenience import write_top_level_json_description
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: math-spec-mapping
|
3
|
-
Version: 0.4.
|
3
|
+
Version: 0.4.3
|
4
4
|
Summary: A library for easy mapping of mathematical specifications.
|
5
5
|
Author-email: Sean McOwen <Sean@Block.Science>
|
6
6
|
Classifier: Programming Language :: Python :: 3
|
@@ -15,6 +15,7 @@ Requires-Dist: pandas>=1.4
|
|
15
15
|
Requires-Dist: jsonschema>=4.21.1
|
16
16
|
Requires-Dist: PyGithub==2.5.0
|
17
17
|
Requires-Dist: python-dotenv>=1.0.0
|
18
|
+
Requires-Dist: pypandoc>=1.15
|
18
19
|
|
19
20
|
# Mathematical Specification Mapping Library (MSML)
|
20
21
|
|
@@ -30,7 +31,7 @@ One good example is the [wiring report](https://github.com/BlockScience/Predator
|
|
30
31
|
|
31
32
|
## Installing the library
|
32
33
|
|
33
|
-
To install the library, simply pip install by running "pip install
|
34
|
+
To install the library, simply pip install by running "pip install math-spec-mapping". The pypi package can be found [here](https://pypi.org/project/math-spec-mapping/).
|
34
35
|
|
35
36
|
## Why MSML?
|
36
37
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
math_spec_mapping/__init__.py,sha256=
|
1
|
+
math_spec_mapping/__init__.py,sha256=8MbUccubjXcwkTrwi3AD8uFhokRYPwLXURNTLCnSbRM,1338
|
2
2
|
math_spec_mapping/schema.py,sha256=6mrRqzEnTTSXjb19xJ63MBp0KjKH0s7i6TfT4MkAY9k,233
|
3
3
|
math_spec_mapping/schema.schema.json,sha256=NyzUy899YR_5Y956ID5HQtgnRBrNTAN6QjrqCyBasRA,31005
|
4
4
|
math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
|
@@ -6,7 +6,7 @@ math_spec_mapping/Classes/Block.py,sha256=2VOBTPRafmtaLY847tEw3OJTrWNp2d0aSStC_u
|
|
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=i6-iWj7SnGWjqwWxiwZ0ysiiNPGHGsidCEgK1KMgumc,65605
|
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
|
@@ -17,7 +17,8 @@ math_spec_mapping/Classes/StateUpdateTransmissionChannel.py,sha256=3hBLvD1lE64Pk
|
|
17
17
|
math_spec_mapping/Classes/StatefulMetric.py,sha256=plMFMAFEk1y2t4DR5lA2SRC9UrYArsx_W33l3mZSdgE,804
|
18
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
|
-
math_spec_mapping/Convenience/__init__.py,sha256=
|
20
|
+
math_spec_mapping/Convenience/__init__.py,sha256=shG4kNPw3z9sSqHmRTLmqvUKMkK1Rq_9XNer2HIWZ9A,301
|
21
|
+
math_spec_mapping/Convenience/cadCAD.py,sha256=t-d9FEvfcnjX326eMoCxV6eyE3qVqB0HldDNrrcYquQ,626
|
21
22
|
math_spec_mapping/Convenience/documentation.py,sha256=1ziWVJznbCUxeAAt03nAdEYtMlXNo5TeedHfgs0vSBU,1625
|
22
23
|
math_spec_mapping/Convenience/github.py,sha256=JMFJWyA3nRIMNYGvn9831BolnBthoa48HhgeZuENZm8,3772
|
23
24
|
math_spec_mapping/Convenience/starter.py,sha256=dD1R9wcVFZV-BCTflxNkR6Ay6NF1TlVBdIaWmbJwMGE,17379
|
@@ -29,7 +30,7 @@ math_spec_mapping/Load/displays.py,sha256=uQvs0Jhp8-9SXGex8SG3ibxHJu7ahAV3xLeBFb
|
|
29
30
|
math_spec_mapping/Load/entities.py,sha256=Ds7VQY_govWEn1vSHYVrLa8IadSNyOQzaCK18JPYPKk,1289
|
30
31
|
math_spec_mapping/Load/general.py,sha256=Wjg0ESB80j9UwvoRB_-J8SBKq3KqCFZAKsuKNJFqkE4,4789
|
31
32
|
math_spec_mapping/Load/implementations.py,sha256=a8YvumnyQvrnCo-o52Rv4yU8D7nmkMrV1iIA15fr6Bw,490
|
32
|
-
math_spec_mapping/Load/load.py,sha256=
|
33
|
+
math_spec_mapping/Load/load.py,sha256=65O8FlLbze5b8WDhbAMHF3B48IfcNijeX4k-WeEy864,2938
|
33
34
|
math_spec_mapping/Load/mechanism.py,sha256=6tgISsxc-SXCYS5yxuIqnl0nX__t1k0uj9z0O0E1uC4,2367
|
34
35
|
math_spec_mapping/Load/metrics.py,sha256=CcVM0_aN-aPnH5_AyEKzFCJGPbgMb0brw5nECsdNVeU,3936
|
35
36
|
math_spec_mapping/Load/parameters.py,sha256=W4utm7to3s2fo4z3XgLH0TM1agaIad1qfM2I-lLMua4,1393
|
@@ -41,12 +42,13 @@ math_spec_mapping/Load/stateful_metrics.py,sha256=eNXIsNmezVN75L3zMXUl8_JORShm_o
|
|
41
42
|
math_spec_mapping/Load/states.py,sha256=3YurI7eTNkN6nrXRFVrc58wH0VfM22XOuWE07HVpR7Y,1365
|
42
43
|
math_spec_mapping/Load/type.py,sha256=pIo3lYAP6sxukvbFTDvaun1lslgShksZy2froNnwAfA,4973
|
43
44
|
math_spec_mapping/Load/wiring.py,sha256=l1FhHNFRMKorn1oiRhsuMDsExcXnUmTjqQt5ElE-Bbk,3258
|
44
|
-
math_spec_mapping/Reports/__init__.py,sha256=
|
45
|
+
math_spec_mapping/Reports/__init__.py,sha256=OqmAKio9if1OknLoiTWTpaVq3PzfUCZdIEmZj3wS0z8,1190
|
46
|
+
math_spec_mapping/Reports/advanced.py,sha256=Y75ZYPBpr_HOJ64BrsjA5Rc0vmqiiTcEQWx8orOT74Q,1767
|
45
47
|
math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-YdcI2ZZ19_Qv_K7Qk,1410
|
46
48
|
math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
|
47
|
-
math_spec_mapping/Reports/general.py,sha256=
|
49
|
+
math_spec_mapping/Reports/general.py,sha256=CSF5DZgZerUZ6Bdnt0mfzM-2QEUwnvC_JeveE7ngtTs,2024
|
48
50
|
math_spec_mapping/Reports/html.py,sha256=MCVp_D1LuRoZrHtwzFOJGQviztGeahqsWf3Zue1Yz64,10134
|
49
|
-
math_spec_mapping/Reports/markdown.py,sha256=
|
51
|
+
math_spec_mapping/Reports/markdown.py,sha256=2WYZYzIubtNb-OyZCOK5nS_O9jPOsdwAtMMJJOt-ZDk,30657
|
50
52
|
math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
|
51
53
|
math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
|
52
54
|
math_spec_mapping/Reports/parameters.py,sha256=-ucL71lolqU0xvV7yb0sXl4pFMRl5tXNWdoBfUjLOaQ,1944
|
@@ -55,8 +57,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
|
|
55
57
|
math_spec_mapping/Reports/state.py,sha256=QYeCvX5cHeZBrbvMeDsTqJcUDTuDFJSLvPbasjLspk8,3643
|
56
58
|
math_spec_mapping/Reports/tables.py,sha256=O0CNuqh3LMECq5uLjBOoxMUk5hUvkUK660FNnwWUxDY,1505
|
57
59
|
math_spec_mapping/Reports/wiring.py,sha256=u9SvKWy6T-WJUEgFI6-zgZanoOaTTs_2YwmEceDLsV8,1618
|
58
|
-
math_spec_mapping-0.4.
|
59
|
-
math_spec_mapping-0.4.
|
60
|
-
math_spec_mapping-0.4.
|
61
|
-
math_spec_mapping-0.4.
|
62
|
-
math_spec_mapping-0.4.
|
60
|
+
math_spec_mapping-0.4.3.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
|
61
|
+
math_spec_mapping-0.4.3.dist-info/METADATA,sha256=6NFRaAlIrw6h_8802HicQ2P-8KUUrIDAOkWhY6Ys72w,7064
|
62
|
+
math_spec_mapping-0.4.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
63
|
+
math_spec_mapping-0.4.3.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
|
64
|
+
math_spec_mapping-0.4.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|