math-spec-mapping 0.3.9.1__py3-none-any.whl → 0.3.11__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.
@@ -8,6 +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
11
12
 
12
13
 
13
14
  class MathSpec:
@@ -47,6 +48,7 @@ class MathSpec:
47
48
  self._build_functional_parameters()
48
49
  self._build_parameter_types()
49
50
  self._crawl_spaces()
51
+ self._set_source_code()
50
52
 
51
53
  def _check_dictionary_names(self):
52
54
  for key in self.boundary_actions:
@@ -765,6 +767,15 @@ using .Spaces: generate_space_type
765
767
  def build_implementation(self, params):
766
768
  return MathSpecImplementation(self, params)
767
769
 
770
+ def _set_source_code(self):
771
+ if "python" not in self.implementations:
772
+ self.source_code = None
773
+ return
774
+ self.source_code = deepcopy(self.implementations["python"])
775
+ for x in self.source_code:
776
+ for y in self.source_code[x]:
777
+ self.source_code[x][y] = getsource(self.source_code[x][y])
778
+
768
779
 
769
780
  class MathSpecImplementation:
770
781
  def __init__(self, ms: MathSpec, params):
@@ -775,8 +786,10 @@ class MathSpecImplementation:
775
786
  self.policies = self.load_policies()
776
787
  self.mechanisms = self.load_mechanisms()
777
788
  self.stateful_metrics = self.load_stateful_metrics()
789
+ self.metrics = self.load_metrics()
778
790
  self.load_wiring()
779
791
  self.load_components()
792
+ self.load_source_files()
780
793
 
781
794
  def load_control_actions(self):
782
795
  control_actions = {}
@@ -951,6 +964,22 @@ class MathSpecImplementation:
951
964
 
952
965
  return stateful_metrics
953
966
 
967
+ def load_metrics(self):
968
+ metrics = {}
969
+
970
+ for m in self.ms.metrics:
971
+ m = self.ms.metrics[m]
972
+ if "python" not in m.implementations:
973
+ print(
974
+ "No python implementation for {}. To fix this, go to Implementations/Python/Metrics and add {}".format(
975
+ m.name, m.name
976
+ )
977
+ )
978
+ else:
979
+ metrics[m.name] = m.implementations["python"]
980
+
981
+ return metrics
982
+
954
983
  def load_wiring(
955
984
  self,
956
985
  ):
@@ -1026,15 +1055,30 @@ class MathSpecImplementation:
1026
1055
  state = deepcopy(state)
1027
1056
  params = deepcopy(params)
1028
1057
  state["Stateful Metrics"] = self.stateful_metrics
1058
+ state["Metrics"] = self.metrics
1029
1059
  if state_preperation_functions:
1030
1060
  for f in state_preperation_functions:
1031
- state = f(state)
1061
+ if len(signature(f).parameters) == 1:
1062
+ state = f(state)
1063
+ elif len(signature(f).parameters) == 2:
1064
+ state = f(state, params)
1065
+ else:
1066
+ assert (
1067
+ False
1068
+ ), "Incorrect number of parameters for the state preperation function"
1032
1069
  assert (
1033
1070
  state is not None
1034
1071
  ), "A state must be returned from the state preperation functions"
1035
1072
  if parameter_preperation_functions:
1036
1073
  for f in parameter_preperation_functions:
1037
- params = f(params)
1074
+ if len(signature(f).parameters) == 1:
1075
+ params = f(params)
1076
+ elif len(signature(f).parameters) == 2:
1077
+ params = f(params, state)
1078
+ else:
1079
+ assert (
1080
+ False
1081
+ ), "Incorrect number of parameters for the state preperation function"
1038
1082
  assert (
1039
1083
  params is not None
1040
1084
  ), "A parameter set must be returned from the parameter preperation functions"
@@ -1052,3 +1096,16 @@ class MathSpecImplementation:
1052
1096
  for block in blocks:
1053
1097
  self.components[block](state, params, [])
1054
1098
  return state
1099
+
1100
+ def load_source_files(self):
1101
+ self.source_files = {}
1102
+ for key in self.components:
1103
+ self.source_files[key] = getsource(self.components[key])
1104
+
1105
+ def print_source_code_files(self, keys=None):
1106
+ if not keys:
1107
+ keys = list(self.source_files.keys())
1108
+ for key in keys:
1109
+ print("-" * 20 + key + "-" * 20)
1110
+ print(self.source_files[key])
1111
+ print("\n\n\n")
@@ -15,3 +15,4 @@ class Metric:
15
15
  else:
16
16
  self.label = self.name
17
17
  self.metadata = data["metadata"]
18
+ self.implementations = data["implementations"]
@@ -50,6 +50,14 @@ def convert_metric(ms, data: Dict, stateful_metrics_map) -> Metric:
50
50
  for x in data["metrics_used"]
51
51
  )
52
52
 
53
+ data["implementations"] = {}
54
+ if "python" in ms["Implementations"]:
55
+ if "metrics" in ms["Implementations"]["python"]:
56
+ if data["name"] in ms["Implementations"]["python"]["metrics"]:
57
+ data["implementations"]["python"] = ms["Implementations"]["python"][
58
+ "metrics"
59
+ ][data["name"]]
60
+
53
61
  # Build the metric object
54
62
  return Metric(data)
55
63
 
@@ -91,7 +99,9 @@ def load_metrics(ms: Dict, json: Dict, stateful_metrics_map) -> None:
91
99
  for z in y["metrics_used"]:
92
100
  assert (
93
101
  z in ms["Metrics"] or z in names or z in stateful_metrics_map
94
- ), "{} is not defined in the spec".format(z)
102
+ ), "{} is not defined in the spec, but it is referenced in {}".format(
103
+ z, y["name"]
104
+ )
95
105
  assert len(metrics) == 0, "There are circular references"
96
106
 
97
107
  # Load the metrics into the policies
@@ -13,8 +13,10 @@ def convert_space(ms, data: Dict) -> Space:
13
13
  data = data.copy()
14
14
 
15
15
  for x in data["schema"]:
16
- assert data["schema"][x] in ms["Types"], "Type {} not in ms".format(
17
- data["schema"][x]
16
+ assert (
17
+ data["schema"][x] in ms["Types"]
18
+ ), "Type {} not in ms for space {} at attribute {}".format(
19
+ data["schema"][x], data["name"], x
18
20
  )
19
21
  data["schema"][x] = ms["Types"][data["schema"][x]]
20
22
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.3.9.1
3
+ Version: 0.3.11
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
@@ -6,9 +6,9 @@ math_spec_mapping/Classes/Block.py,sha256=cGtIhNgRfoDZ0O3SxeXcNzNlHcdXIB89sT2uaZ
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=6cBpp9OHmfU-XTqPI4Qjnj91cXRxfGtcAQnczOKxt-4,39892
9
+ math_spec_mapping/Classes/MathSpec.py,sha256=MnQQQMAk8VojjTzao56MBN3rvO_fexQrkh5SAGmWpP8,42033
10
10
  math_spec_mapping/Classes/Mechanism.py,sha256=2sLm3wYBIeTQaMBcsJ9btqIWsbS895Ra8NY6Y9_G_Dg,379
11
- math_spec_mapping/Classes/Metric.py,sha256=AhPgYppOP6q49xvR8S9STxQsXUKJlTWx7wI1LfZEtww,581
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=fzV85tB3QScjiYGfhw_dyQt9L1BYYfTyTIQQcxeT8ac,530
14
14
  math_spec_mapping/Classes/Space.py,sha256=QsahxoUfRsDWQLBL683KnGx72MAmRxv7CDE7TMgCG-E,472
@@ -30,10 +30,10 @@ 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=EyCFEgHpyffBPKaqISdIeTyqUtPtu2xoS0gZjh-6i3U,3434
33
+ math_spec_mapping/Load/metrics.py,sha256=0XL-E7PUZg5PX_ZensoDpT2Z2xq893JncBEYbPzxeGo,3866
34
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
- math_spec_mapping/Load/spaces.py,sha256=7zgGA57Te7T4hfuCCDElffiidWgn1lKm5E14e1yjt8M,1116
36
+ math_spec_mapping/Load/spaces.py,sha256=5nJto38BVMED5KuMXOqavYj8gcSTKiNSTdMOOp5ThTA,1186
37
37
  math_spec_mapping/Load/state_update_transmission_channels.py,sha256=FJWp5n4HdtHAfof5BUQ6BnRakljatL2h8dWCapaVSc0,2238
38
38
  math_spec_mapping/Load/stateful_metrics.py,sha256=3Lq1ZGMaDd5OcGeqR2p5c_znkYw7ETTNPFjUVdZAHKk,2384
39
39
  math_spec_mapping/Load/states.py,sha256=3YurI7eTNkN6nrXRFVrc58wH0VfM22XOuWE07HVpR7Y,1365
@@ -53,8 +53,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
53
53
  math_spec_mapping/Reports/state.py,sha256=EPiHz3cDCEPHnVjuFruVKaGJ2SclUfGUFvvOukiHPNg,3110
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.9.1.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
- math_spec_mapping-0.3.9.1.dist-info/METADATA,sha256=VV9OF55yc5n0xe5_JnFBq2hDAOQ0Eu1WMahCTjQqWRg,6502
58
- math_spec_mapping-0.3.9.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
59
- math_spec_mapping-0.3.9.1.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
- math_spec_mapping-0.3.9.1.dist-info/RECORD,,
56
+ math_spec_mapping-0.3.11.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
+ math_spec_mapping-0.3.11.dist-info/METADATA,sha256=5mt9yY0Os1Ve_d-ilf7LL-lmiZ_K3vyo39JjKtKDdbM,6501
58
+ math_spec_mapping-0.3.11.dist-info/WHEEL,sha256=UvcQYKBHoFqaQd6LKyqHw9fxEolWLQnlzP0h_LgJAfI,91
59
+ math_spec_mapping-0.3.11.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
+ math_spec_mapping-0.3.11.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (74.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5