math-spec-mapping 0.3.14__py3-none-any.whl → 0.3.15__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.
@@ -11,6 +11,10 @@ class Block:
11
11
  self.codomain = data["codomain"]
12
12
  self.parameters_used = data["parameters_used"]
13
13
  self.metadata = data["metadata"]
14
+ if "metrics_used" in data:
15
+ self.metrics_used = data["metrics_used"]
16
+ else:
17
+ self.metrics_used = []
14
18
  if "label" in data:
15
19
  self.label = data["label"]
16
20
  else:
@@ -163,6 +167,10 @@ class ParallelBlock(Block):
163
167
  self.components = data["components"]
164
168
  self.description = data["description"]
165
169
  self.constraints = data["constraints"]
170
+ if "metrics_used" in data:
171
+ self.metrics_used = data["metrics_used"]
172
+ else:
173
+ self.metrics_used = []
166
174
  self.mermaid_show_name = data["mermaid_show_name"]
167
175
  self.domain = tuple(
168
176
  [
@@ -316,6 +324,10 @@ class StackBlock(Block):
316
324
  self.mermaid_show_name = data["mermaid_show_name"]
317
325
  self.optional_indices = data["optional_indices"]
318
326
  self.loop = data["loop"]
327
+ if "metrics_used" in data:
328
+ self.metrics_used = data["metrics_used"]
329
+ else:
330
+ self.metrics_used = []
319
331
  self._check_domain_mapping()
320
332
  self.domain = self.components[0].domain
321
333
  self.codomain = self.components[-1].codomain
@@ -470,6 +482,10 @@ class SplitBlock(Block):
470
482
  self.description = data["description"]
471
483
  self.constraints = data["constraints"]
472
484
  self.mermaid_show_name = data["mermaid_show_name"]
485
+ if "metrics_used" in data:
486
+ self.metrics_used = data["metrics_used"]
487
+ else:
488
+ self.metrics_used = []
473
489
  self.domain = tuple(
474
490
  [
475
491
  i
@@ -32,7 +32,9 @@ class MathSpec:
32
32
  ]
33
33
  self.stateful_metrics = ms_dict["Stateful Metrics"]
34
34
  self.wiring = ms_dict["Wiring"]
35
- self.blocks = ms_dict["Blocks"]
35
+ # self.blocks = ms_dict["Blocks"]
36
+ self._load_blocks()
37
+ self._load_components()
36
38
  self.types = ms_dict["Types"]
37
39
  self.metrics = ms_dict["Metrics"]
38
40
  self.displays = ms_dict["Displays"]
@@ -206,6 +208,21 @@ class MathSpec:
206
208
 
207
209
  return out
208
210
 
211
+ def _load_blocks(self):
212
+ self.blocks = {}
213
+ self.blocks.update(self.control_actions)
214
+ self.blocks.update(self.boundary_actions)
215
+ self.blocks.update(self.policies)
216
+ self.blocks.update(self.mechanisms)
217
+ self.blocks.update(self.wiring)
218
+
219
+ def _load_components(self):
220
+ self.components = {}
221
+ self.components.update(self.control_actions)
222
+ self.components.update(self.boundary_actions)
223
+ self.components.update(self.policies)
224
+ self.components.update(self.mechanisms)
225
+
209
226
  def crawl_action_chains(self, action_keys: List[str]) -> dict:
210
227
  """Crawl the graph of the actions to find all policies, entities, edges, etc.
211
228
 
@@ -15,4 +15,3 @@ class Policy(Block):
15
15
  super().__init__(data)
16
16
  self.policy_options: List[PolicyOption] = data["policy_options"]
17
17
  self.block_type = "Policy"
18
- self.metrics_used = data["metrics_used"]
@@ -7,6 +7,8 @@ class Space:
7
7
  self.schema = data["schema"]
8
8
  self.metadata = data["metadata"]
9
9
  self.name_variable = self.name.replace(" ", "").replace("-", "_")
10
+ self.domain_blocks = []
11
+ self.codomain_blocks = []
10
12
 
11
13
  def __repr__(self):
12
14
  return self.name
@@ -79,3 +79,9 @@ def load_boundary_actions(ms: Dict, json: Dict) -> None:
79
79
  ms["Boundary Actions"][key] = convert_boundary_action(ba, ms)
80
80
  for entity in ms["Boundary Actions"][key].called_by:
81
81
  entity.add_boundary_action(ms["Boundary Actions"][key])
82
+
83
+ for space in ms["Boundary Actions"][key].domain:
84
+ space.domain_blocks.append(ms["Boundary Actions"][key])
85
+
86
+ for space in ms["Boundary Actions"][key].codomain:
87
+ space.codomain_blocks.append(ms["Boundary Actions"][key])
@@ -66,3 +66,10 @@ def load_control_actions(ms: Dict, json: Dict) -> None:
66
66
  ms["Control Actions"] = {}
67
67
  for ca in json["Control Actions"]:
68
68
  ms["Control Actions"][ca["name"]] = convert_control_action(ca, ms)
69
+
70
+ key = ca["name"]
71
+ for space in ms["Control Actions"][key].domain:
72
+ space.domain_blocks.append(ms["Control Actions"][key])
73
+
74
+ for space in ms["Control Actions"][key].codomain:
75
+ space.codomain_blocks.append(ms["Control Actions"][key])
@@ -78,4 +78,7 @@ def load_from_json(json: Dict) -> MathSpec:
78
78
  check_json_keys(ms, "Math Spec")
79
79
 
80
80
  ms = MathSpec(ms, json)
81
+ for space in ms.spaces.values():
82
+ space.domain_blocks = list(set(space.domain_blocks))
83
+ space.codomain_blocks = list(set(space.codomain_blocks))
81
84
  return ms
@@ -68,4 +68,11 @@ def load_mechanisms(ms: Dict, json: Dict) -> None:
68
68
  for m in json["Mechanisms"]:
69
69
  ms["Mechanisms"][m["name"]], new_channels = convert_mechanism(m, ms)
70
70
  state_update_transmission_channels.extend(new_channels)
71
+
72
+ key = m["name"]
73
+ for space in ms["Mechanisms"][key].domain:
74
+ space.domain_blocks.append(ms["Mechanisms"][key])
75
+
76
+ for space in ms["Mechanisms"][key].codomain:
77
+ space.codomain_blocks.append(ms["Mechanisms"][key])
71
78
  return state_update_transmission_channels
@@ -105,14 +105,15 @@ def load_metrics(ms: Dict, json: Dict, stateful_metrics_map) -> None:
105
105
  assert len(metrics) == 0, "There are circular references"
106
106
 
107
107
  # Load the metrics into the policies
108
- for key in ms["Policies"]:
109
- policy = ms["Policies"][key]
110
- hold = policy.metrics_used[:]
111
- policy.metrics_used = []
108
+ for key in ms["Blocks"]:
109
+ block = ms["Blocks"][key]
110
+ hold = block.metrics_used[:]
111
+ block.metrics_used = []
112
112
  for x in hold:
113
113
  assert (
114
114
  x in ms["Metrics"] or x in stateful_metrics_map
115
115
  ), "{} not a valid metric or stateful metric".format(x)
116
- policy.metrics_used.append(
116
+ block.metrics_used.append(
117
117
  ms["Metrics"][x] if x in ms["Metrics"] else stateful_metrics_map[x]
118
118
  )
119
+ block.metrics_used = sorted(block.metrics_used, key=lambda x: x.name)
@@ -92,3 +92,10 @@ def load_policies(ms: Dict, json: Dict) -> None:
92
92
  ms["Policies"] = {}
93
93
  for policy in json["Policies"]:
94
94
  ms["Policies"][policy["name"]] = convert_policy(policy, ms)
95
+
96
+ key = policy["name"]
97
+ for space in ms["Policies"][key].domain:
98
+ space.domain_blocks.append(ms["Policies"][key])
99
+
100
+ for space in ms["Policies"][key].codomain:
101
+ space.codomain_blocks.append(ms["Policies"][key])
@@ -24,6 +24,11 @@ def load_single_wiring(data, ms):
24
24
  # Map components
25
25
  data["components"] = [ms["Blocks"][x] for x in data["components"]]
26
26
 
27
+ data["metrics_used"] = []
28
+ for x in data["components"]:
29
+ data["metrics_used"].extend(x.metrics_used)
30
+ data["metrics_used"] = list(set(data["metrics_used"]))
31
+
27
32
  # Map to the correct block
28
33
  if block_type == "Stack":
29
34
  block = StackBlock(data)
@@ -157,6 +157,18 @@ def write_boundary_action_markdown_report(ms, path, boundary_action, add_metadat
157
157
  out += "\n"
158
158
  out += "\n"
159
159
 
160
+ out += "## Metrics Used\n"
161
+ for i, x in enumerate(boundary_action.metrics_used):
162
+ out += "{}. [[{}]]".format(i + 1, x.name)
163
+ out += "\n"
164
+ out += "\n"
165
+
166
+ out += "## Parameters Used\n"
167
+ for i, x in enumerate(sorted(boundary_action.parameters_used, key=lambda x: x)):
168
+ out += "{}. [[{}]]".format(i + 1, x)
169
+ out += "\n"
170
+ out += "\n"
171
+
160
172
  if boundary_action.boundary_action_options:
161
173
  out += "## Boundary Action Options:\n"
162
174
  for i, x in enumerate(boundary_action.boundary_action_options):
@@ -288,6 +300,18 @@ def write_mechanism_markdown_report(ms, path, mechanism, add_metadata=True):
288
300
  out += "{}. {}".format(i + 1, x)
289
301
  out += "\n"
290
302
 
303
+ out += "## Metrics Used\n"
304
+ for i, x in enumerate(mechanism.metrics_used):
305
+ out += "{}. [[{}]]".format(i + 1, x.name)
306
+ out += "\n"
307
+ out += "\n"
308
+
309
+ out += "## Parameters Used\n"
310
+ for i, x in enumerate(sorted(mechanism.parameters_used, key=lambda x: x)):
311
+ out += "{}. [[{}]]".format(i + 1, x)
312
+ out += "\n"
313
+ out += "\n"
314
+
291
315
  out += "## Logic\n"
292
316
  out += mechanism.logic
293
317
 
@@ -329,6 +353,20 @@ def write_space_markdown_report(ms, path, space, add_metadata=True):
329
353
  )
330
354
  d = "{" + d + "}"
331
355
  out += d
356
+ out += "\n\n"
357
+
358
+ out += "## Blocks with Space in Domain"
359
+ out += "\n"
360
+ for i, x in enumerate(space.domain_blocks):
361
+ out += "{}. [[{}]]".format(i + 1, x.name)
362
+ out += "\n"
363
+ out += "\n"
364
+
365
+ out += "## Blocks with Space in Codomain"
366
+ out += "\n"
367
+ for i, x in enumerate(space.codomain_blocks):
368
+ out += "{}. [[{}]]".format(i + 1, x.name)
369
+ out += "\n"
332
370
  out += "\n"
333
371
 
334
372
  with open("{}/Spaces/{}.md".format(path, space.name), "w") as f:
@@ -374,6 +412,12 @@ def write_control_action_markdown_report(ms, path, control_action, add_metadata=
374
412
  out += "\n"
375
413
  out += "\n"
376
414
 
415
+ out += "## Metrics Used\n"
416
+ for i, x in enumerate(control_action.metrics_used):
417
+ out += "{}. [[{}]]".format(i + 1, x.name)
418
+ out += "\n"
419
+ out += "\n"
420
+
377
421
  out += "## Parameters Used\n"
378
422
  for i, x in enumerate(sorted(control_action.parameters_used, key=lambda x: x)):
379
423
  out += "{}. [[{}]]".format(i + 1, x)
@@ -463,6 +507,12 @@ def write_wiring_markdown_report(ms, path, wiring, add_metadata=True):
463
507
  out += "\n"
464
508
  out += "\n"
465
509
 
510
+ out += "## Metrics Used\n"
511
+ for i, x in enumerate(wiring.metrics_used):
512
+ out += "{}. [[{}]]".format(i + 1, x.name)
513
+ out += "\n"
514
+ out += "\n"
515
+
466
516
  out += "## Parameters Used\n"
467
517
  for i, x in enumerate(sorted(wiring.parameters_used, key=lambda x: x)):
468
518
  out += "{}. [[{}]]".format(i + 1, x)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.3.14
3
+ Version: 0.3.15
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
@@ -9,9 +9,9 @@ Classifier: Operating System :: OS Independent
9
9
  Requires-Python: >=3.7
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
- Requires-Dist: graphviz >=0.20.1
13
- Requires-Dist: ipython >=7.7.0
14
- Requires-Dist: pandas >=1.4
12
+ Requires-Dist: graphviz>=0.20.1
13
+ Requires-Dist: ipython>=7.7.0
14
+ Requires-Dist: pandas>=1.4
15
15
 
16
16
  # MSML
17
17
 
@@ -2,16 +2,16 @@ math_spec_mapping/__init__.py,sha256=LvuIbfILQf3UGyHympLJyncfnnpZpEyvN5UDOpi8bWw
2
2
  math_spec_mapping/schema.py,sha256=6mrRqzEnTTSXjb19xJ63MBp0KjKH0s7i6TfT4MkAY9k,233
3
3
  math_spec_mapping/schema.schema.json,sha256=hJP2TcV5WPFPmx4u_A5U1xtnpkE1LeYaTeYOXadTot0,30916
4
4
  math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
5
- math_spec_mapping/Classes/Block.py,sha256=cGtIhNgRfoDZ0O3SxeXcNzNlHcdXIB89sT2uaZct8LY,17667
5
+ math_spec_mapping/Classes/Block.py,sha256=geaH3cNPJ-BOSj1pqccexFl6FqmolAFbrb7wpQQqaUE,18215
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=MnQQQMAk8VojjTzao56MBN3rvO_fexQrkh5SAGmWpP8,42033
9
+ math_spec_mapping/Classes/MathSpec.py,sha256=94cJsKpdcBj_jzlQhNYnNBJQyBVOI-RrNHuWHdbieUs,42637
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
- math_spec_mapping/Classes/Policy.py,sha256=fzV85tB3QScjiYGfhw_dyQt9L1BYYfTyTIQQcxeT8ac,530
14
- math_spec_mapping/Classes/Space.py,sha256=QsahxoUfRsDWQLBL683KnGx72MAmRxv7CDE7TMgCG-E,472
13
+ math_spec_mapping/Classes/Policy.py,sha256=Nso8QJMBDeyN66VkZ29nnZ1WjaMnReMn7SxKt_bRngU,481
14
+ math_spec_mapping/Classes/Space.py,sha256=TpZ5m28xRzPIDZ98IYtdemgyAm34JuWkgBPNyHpEglg,538
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
@@ -23,29 +23,29 @@ math_spec_mapping/Convenience/github.py,sha256=mMOhIH3Nvh_91fNTOPjz1oQq1iDq2m5hN
23
23
  math_spec_mapping/Convenience/starter.py,sha256=9dBKU3EHscut2wA6Nx1XUmehrFIdr4dCjP9V1BbTF6s,12567
24
24
  math_spec_mapping/Load/__init__.py,sha256=_ga5nHi7U5rY5lCF36_XI9Qmybq4P8R4m5I5mmjLBk8,33
25
25
  math_spec_mapping/Load/action_transmission_channel.py,sha256=9Wer7g2s5SSOcUYuZ0PqSKUVVnW3EvGQJZNXJTwW__0,2561
26
- math_spec_mapping/Load/boundary_actions.py,sha256=ms3Oh09Dgur9sZrxOE5FrzNO4zN41cWPNOW563R0A5U,2677
27
- math_spec_mapping/Load/control_actions.py,sha256=W7kKLcA0UQ40m1ZExmvu0ujdxvJ8wH-uQ9PG8hbaYCo,2094
26
+ math_spec_mapping/Load/boundary_actions.py,sha256=cDN0pjkkWfYY3HHmgSrD__-weGD4DXElnG8w1pRc5Lc,2933
27
+ math_spec_mapping/Load/control_actions.py,sha256=Y9LeEJuVj2OwxdTfnHZ57UV48j6PYCfyQWux4uXp1Mo,2371
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
30
  math_spec_mapping/Load/general.py,sha256=2q6aGKxXhebiHHTZhtACvM4nWIkTben0o5rXuvfv2Vw,4463
31
31
  math_spec_mapping/Load/implementations.py,sha256=a8YvumnyQvrnCo-o52Rv4yU8D7nmkMrV1iIA15fr6Bw,490
32
- math_spec_mapping/Load/load.py,sha256=CLprDhJpbwm9RAzKM2Ghwr8eqBu0a-wvGDOCMmc01YE,2484
33
- math_spec_mapping/Load/mechanism.py,sha256=JBy-QpB4W0Z2OcNiakONjD4_RtEgxlFKtLXfDqfhR-0,2037
34
- math_spec_mapping/Load/metrics.py,sha256=0XL-E7PUZg5PX_ZensoDpT2Z2xq893JncBEYbPzxeGo,3866
32
+ math_spec_mapping/Load/load.py,sha256=oC-CuqbVqqhWw0kK7iiNKexAB_djgVNbjXSQfTsj2FA,2647
33
+ math_spec_mapping/Load/mechanism.py,sha256=VRjkR2McsSJh2oq8n9JkeewirdlVjPRA-T5SRSKWPPQ,2293
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=HvlhGHGJTweVs7DOI2HSL_2_diECr8ukDUmzoFLQELo,2444
36
+ math_spec_mapping/Load/policy.py,sha256=QTIcslHKgdYjjG69cqkJbW20CPvEL-B8R5u51rd2Puo,2697
37
37
  math_spec_mapping/Load/spaces.py,sha256=5nJto38BVMED5KuMXOqavYj8gcSTKiNSTdMOOp5ThTA,1186
38
38
  math_spec_mapping/Load/state_update_transmission_channels.py,sha256=FJWp5n4HdtHAfof5BUQ6BnRakljatL2h8dWCapaVSc0,2238
39
39
  math_spec_mapping/Load/stateful_metrics.py,sha256=3Lq1ZGMaDd5OcGeqR2p5c_znkYw7ETTNPFjUVdZAHKk,2384
40
40
  math_spec_mapping/Load/states.py,sha256=3YurI7eTNkN6nrXRFVrc58wH0VfM22XOuWE07HVpR7Y,1365
41
41
  math_spec_mapping/Load/type.py,sha256=FbViE3wV1o1JTx7mUYyUpAvgIxDKDQYc6Iw50FrZ4nY,4808
42
- math_spec_mapping/Load/wiring.py,sha256=1dR94U5N1W_WI5rL6lYBltH25ZvApB2pIpq9r5Opkug,3083
42
+ math_spec_mapping/Load/wiring.py,sha256=l1FhHNFRMKorn1oiRhsuMDsExcXnUmTjqQt5ElE-Bbk,3258
43
43
  math_spec_mapping/Reports/__init__.py,sha256=P3IuE1wiM1EO_yCSD73D4O0O6j7aVWmiwpKJM58ISEs,1121
44
44
  math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-YdcI2ZZ19_Qv_K7Qk,1410
45
45
  math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
46
46
  math_spec_mapping/Reports/general.py,sha256=WOOn6Wlb8M4fsdN49FlKLwOka6vJPQ9aCUy88TL2ki0,1610
47
47
  math_spec_mapping/Reports/html.py,sha256=RpyQQON8pDnMmfcyxOsm8UAD5Ad8VKnnW-OyOarTmzA,9711
48
- math_spec_mapping/Reports/markdown.py,sha256=ZELi-p51k_sehFDHzDalOJstIi6nD2845DTqHp46hKU,23129
48
+ math_spec_mapping/Reports/markdown.py,sha256=oLammMJMkWhZXmODKzCuZDdJpiJIs5P-84gVsYhs0Rw,24605
49
49
  math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
50
50
  math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
51
51
  math_spec_mapping/Reports/parameters.py,sha256=-ucL71lolqU0xvV7yb0sXl4pFMRl5tXNWdoBfUjLOaQ,1944
@@ -54,8 +54,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
54
54
  math_spec_mapping/Reports/state.py,sha256=QYeCvX5cHeZBrbvMeDsTqJcUDTuDFJSLvPbasjLspk8,3643
55
55
  math_spec_mapping/Reports/tables.py,sha256=O0CNuqh3LMECq5uLjBOoxMUk5hUvkUK660FNnwWUxDY,1505
56
56
  math_spec_mapping/Reports/wiring.py,sha256=u9SvKWy6T-WJUEgFI6-zgZanoOaTTs_2YwmEceDLsV8,1618
57
- math_spec_mapping-0.3.14.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
58
- math_spec_mapping-0.3.14.dist-info/METADATA,sha256=pgCgjXjeObVD7rjGT4MWcg04e8CCvB6ThIqB9TGAVr0,6501
59
- math_spec_mapping-0.3.14.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
60
- math_spec_mapping-0.3.14.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
61
- math_spec_mapping-0.3.14.dist-info/RECORD,,
57
+ math_spec_mapping-0.3.15.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
58
+ math_spec_mapping-0.3.15.dist-info/METADATA,sha256=H3FF0wDPZ2BUneG-JTOGfaGh8Z24tr2tgLlfOqe67Y4,6498
59
+ math_spec_mapping-0.3.15.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
60
+ math_spec_mapping-0.3.15.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
61
+ math_spec_mapping-0.3.15.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.4.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5