math-spec-mapping 0.3.0__tar.gz → 0.3.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. {math-spec-mapping-0.3.0/src/math_spec_mapping.egg-info → math_spec_mapping-0.3.2}/PKG-INFO +1 -1
  2. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/pyproject.toml +1 -1
  3. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/MathSpec.py +40 -0
  4. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/State.py +1 -0
  5. math_spec_mapping-0.3.2/src/math_spec_mapping/Convenience/__init__.py +2 -0
  6. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Convenience/documentation.py +1 -1
  7. math_spec_mapping-0.3.2/src/math_spec_mapping/Convenience/starter.py +271 -0
  8. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/metrics.py +6 -2
  9. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/parameters.py +3 -1
  10. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/states.py +2 -0
  11. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/type.py +5 -1
  12. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/html.py +4 -1
  13. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/markdown.py +55 -5
  14. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/state.py +2 -0
  15. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/__init__.py +1 -0
  16. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/schema.schema.json +8 -4
  17. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2/src/math_spec_mapping.egg-info}/PKG-INFO +1 -1
  18. math-spec-mapping-0.3.0/src/math_spec_mapping/Convenience/__init__.py +0 -1
  19. math-spec-mapping-0.3.0/src/math_spec_mapping/Convenience/starter.py +0 -0
  20. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/LICENSE +0 -0
  21. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/README.md +0 -0
  22. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/setup.cfg +0 -0
  23. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/ActionTransmissionChannel.py +0 -0
  24. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Block.py +0 -0
  25. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/BoundaryAction.py +0 -0
  26. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/ControlAction.py +0 -0
  27. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Entity.py +0 -0
  28. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Mechanism.py +0 -0
  29. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Metric.py +0 -0
  30. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Parameter.py +0 -0
  31. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Policy.py +0 -0
  32. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Space.py +0 -0
  33. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/StateUpdateTransmissionChannel.py +0 -0
  34. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/StatefulMetric.py +0 -0
  35. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/Type.py +0 -0
  36. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Classes/__init__.py +0 -0
  37. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/__init__.py +0 -0
  38. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/action_transmission_channel.py +0 -0
  39. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/boundary_actions.py +0 -0
  40. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/control_actions.py +0 -0
  41. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/displays.py +0 -0
  42. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/entities.py +0 -0
  43. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/general.py +0 -0
  44. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/implementations.py +0 -0
  45. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/load.py +0 -0
  46. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/mechanism.py +0 -0
  47. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/policy.py +0 -0
  48. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/spaces.py +0 -0
  49. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/state_update_transmission_channels.py +0 -0
  50. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/stateful_metrics.py +0 -0
  51. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Load/wiring.py +0 -0
  52. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/__init__.py +0 -0
  53. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/boundary_actions.py +0 -0
  54. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/control_actions.py +0 -0
  55. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/general.py +0 -0
  56. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/mechanisms.py +0 -0
  57. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/node_map.py +0 -0
  58. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/parameters.py +0 -0
  59. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/policies.py +0 -0
  60. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/spaces.py +0 -0
  61. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/tables.py +0 -0
  62. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/Reports/wiring.py +0 -0
  63. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping/schema.py +0 -0
  64. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping.egg-info/SOURCES.txt +0 -0
  65. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping.egg-info/dependency_links.txt +0 -0
  66. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping.egg-info/requires.txt +0 -0
  67. {math-spec-mapping-0.3.0 → math_spec_mapping-0.3.2}/src/math_spec_mapping.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.3.0
3
+ Version: 0.3.2
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
@@ -3,7 +3,7 @@ requires = ["setuptools>=61.0"]
3
3
  build-backend = "setuptools.build_meta"
4
4
  [project]
5
5
  name = "math-spec-mapping"
6
- version = "0.3.0"
6
+ version = "0.3.2"
7
7
  authors = [
8
8
  { name="Sean McOwen", email="Sean@Block.Science" },
9
9
  ]
@@ -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
 
@@ -45,6 +45,7 @@ class StateVariable:
45
45
  self.symbol = data["symbol"]
46
46
  self.domain = data["domain"]
47
47
  self.updated_by = []
48
+ self.metadata = data["metadata"]
48
49
 
49
50
  # Add check for type of List
50
51
  if hasattr(self.type, "_name"):
@@ -0,0 +1,2 @@
1
+ # from .documentation import write_top_level_json_description
2
+ from .starter import remove_dummy_repo_components
@@ -1,4 +1,4 @@
1
- from src import schema
1
+ from src.math_spec_mapping import schema
2
2
 
3
3
 
4
4
  def write_json_description(schema, key, name):
@@ -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 x in ms["Metrics"], "{} not a valid metric".format(x)
104
- policy.metrics_used.append(ms["Metrics"][x])
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
@@ -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
 
@@ -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
- type_definitions.append(hold.pop(0))
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
- out += symbol3 + var + "\n"
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
- out = ""
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(i + 1, x[0].name, x[1].name)
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(i + 1, x[0].name, x[1].name)
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 += "|"
@@ -26,5 +26,6 @@ from .Reports import (
26
26
  write_all_markdown_reports,
27
27
  )
28
28
  from .schema import schema
29
+ from .Convenience import remove_dummy_repo_components
29
30
 
30
31
  # from .Convenience import write_top_level_json_description
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.3.0
3
+ Version: 0.3.2
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
@@ -1 +0,0 @@
1
- from .documentation import write_top_level_json_description