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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. {math-spec-mapping-0.2.8/src/math_spec_mapping.egg-info → math-spec-mapping-0.3.0}/PKG-INFO +1 -1
  2. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/pyproject.toml +1 -1
  3. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/MathSpec.py +149 -4
  4. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0/src/math_spec_mapping.egg-info}/PKG-INFO +1 -1
  5. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/LICENSE +0 -0
  6. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/README.md +0 -0
  7. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/setup.cfg +0 -0
  8. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/ActionTransmissionChannel.py +0 -0
  9. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Block.py +0 -0
  10. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/BoundaryAction.py +0 -0
  11. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/ControlAction.py +0 -0
  12. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Entity.py +0 -0
  13. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Mechanism.py +0 -0
  14. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Metric.py +0 -0
  15. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Parameter.py +0 -0
  16. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Policy.py +0 -0
  17. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Space.py +0 -0
  18. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/State.py +0 -0
  19. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/StateUpdateTransmissionChannel.py +0 -0
  20. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/StatefulMetric.py +0 -0
  21. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/Type.py +0 -0
  22. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Classes/__init__.py +0 -0
  23. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Convenience/__init__.py +0 -0
  24. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Convenience/documentation.py +0 -0
  25. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Convenience/starter.py +0 -0
  26. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/__init__.py +0 -0
  27. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/action_transmission_channel.py +0 -0
  28. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/boundary_actions.py +0 -0
  29. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/control_actions.py +0 -0
  30. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/displays.py +0 -0
  31. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/entities.py +0 -0
  32. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/general.py +0 -0
  33. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/implementations.py +0 -0
  34. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/load.py +0 -0
  35. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/mechanism.py +0 -0
  36. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/metrics.py +0 -0
  37. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/parameters.py +0 -0
  38. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/policy.py +0 -0
  39. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/spaces.py +0 -0
  40. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/state_update_transmission_channels.py +0 -0
  41. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/stateful_metrics.py +0 -0
  42. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/states.py +0 -0
  43. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/type.py +0 -0
  44. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Load/wiring.py +0 -0
  45. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/__init__.py +0 -0
  46. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/boundary_actions.py +0 -0
  47. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/control_actions.py +0 -0
  48. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/general.py +0 -0
  49. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/html.py +0 -0
  50. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/markdown.py +0 -0
  51. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/mechanisms.py +0 -0
  52. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/node_map.py +0 -0
  53. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/parameters.py +0 -0
  54. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/policies.py +0 -0
  55. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/spaces.py +0 -0
  56. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/state.py +0 -0
  57. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/tables.py +0 -0
  58. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/Reports/wiring.py +0 -0
  59. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/__init__.py +0 -0
  60. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/schema.py +0 -0
  61. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping/schema.schema.json +0 -0
  62. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping.egg-info/SOURCES.txt +0 -0
  63. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping.egg-info/dependency_links.txt +0 -0
  64. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/src/math_spec_mapping.egg-info/requires.txt +0 -0
  65. {math-spec-mapping-0.2.8 → math-spec-mapping-0.3.0}/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.2.8
3
+ Version: 0.3.0
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.2.8"
6
+ version = "0.3.0"
7
7
  authors = [
8
8
  { name="Sean McOwen", email="Sean@Block.Science" },
9
9
  ]
@@ -356,24 +356,31 @@ class MathSpec:
356
356
  return sm
357
357
 
358
358
  def _build_functional_parameters(self):
359
- opts = [x for x in self.policies.values() if len(x.policy_options) > 1]
359
+ opts = [
360
+ (x, x.policy_options)
361
+ for x in self.policies.values()
362
+ if len(x.policy_options) > 1
363
+ ]
360
364
  opts.extend(
361
365
  [
362
- x
366
+ (x, x.boundary_actions)
363
367
  for x in self.boundary_actions.values()
364
368
  if len(x.boundary_action_options) > 1
365
369
  ]
366
370
  )
367
371
  opts.extend(
368
372
  [
369
- x
373
+ (x, x.control_actions)
370
374
  for x in self.control_actions.values()
371
375
  if len(x.control_action_options) > 1
372
376
  ]
373
377
  )
374
378
  self.functional_parameters = {}
375
379
  for x in opts:
376
- self.functional_parameters["FP {}".format(x.name)] = x
380
+ x, y = x
381
+ self.functional_parameters["FP {}".format(x.name)] = {}
382
+ for y1 in y:
383
+ self.functional_parameters["FP {}".format(x.name)][y1.name] = y1
377
384
 
378
385
  def _build_parameter_types(self):
379
386
  system_parameters_types = {}
@@ -596,7 +603,145 @@ class MathSpec:
596
603
  with open(path, "w") as f:
597
604
  f.write(out)
598
605
 
606
+ def build_implementation(self, params):
607
+ return MathSpecImplementation(self, params)
608
+
599
609
 
600
610
  class MathSpecImplementation:
601
611
  def __init__(self, ms: MathSpec, params):
602
612
  self.ms = deepcopy(ms)
613
+ self.params = params
614
+ self.control_actions = self.load_control_actions()
615
+ self.boundary_actions = {}
616
+ self.policies = self.load_policies()
617
+ self.mechanisms = self.load_mechanisms()
618
+ self.load_wiring()
619
+
620
+ def load_control_actions(self):
621
+ control_actions = {}
622
+ for ca in self.ms.control_actions:
623
+ ca = self.ms.control_actions[ca]
624
+ opts = ca.control_action_options
625
+ if len(opts) == 0:
626
+ print("{} has no control action options".format(ca.name))
627
+ else:
628
+ if len(opts) == 1:
629
+ opt = opts[0]
630
+ else:
631
+ assert (
632
+ "FP {}".format(ca.name) in self.params
633
+ ), "No functional parameterization for {}".format(ca.name)
634
+ opt = self.ms.functional_parameters["FP {}".format(ca.name)][
635
+ self.params["FP {}".format(ca.name)]
636
+ ]
637
+
638
+ assert (
639
+ "python" in opt.implementations
640
+ ), "No python implementation for {} / {}".format(ca.name, opt.name)
641
+
642
+ control_actions[ca.name] = opt.implementations["python"]
643
+ return control_actions
644
+
645
+ def load_mechanisms(self):
646
+ mechanisms = {}
647
+ for m in self.ms.mechanisms:
648
+ m = self.ms.mechanisms[m]
649
+ if "python" not in m.implementations:
650
+ print("No python implementation for {}".format(m.name))
651
+ else:
652
+ mechanisms[m.name] = m.implementations["python"]
653
+ return mechanisms
654
+
655
+ def load_single_wiring(self, wiring):
656
+ components = [x.name for x in wiring.components]
657
+ if wiring.block_type == "Stack Block":
658
+
659
+ def wiring(state, params, spaces):
660
+ for component in components:
661
+ spaces = self.blocks[component](state, params, spaces)
662
+ return spaces
663
+
664
+ elif wiring.block_type == "Parallel Block":
665
+
666
+ spaces_mapping = {}
667
+ for x in wiring.components:
668
+ spaces_mapping[x.name] = []
669
+
670
+ for i, x in enumerate([x.name for x in wiring.domain_blocks]):
671
+ spaces_mapping[x].append(i)
672
+
673
+ def wiring(state, params, spaces):
674
+ codomain = []
675
+ for component in components:
676
+ spaces_i = [spaces[i] for i in spaces_mapping[component]]
677
+ spaces_i = self.blocks[component](state, params, spaces_i)
678
+ if spaces_i:
679
+ codomain.extend(spaces_i)
680
+ return codomain
681
+
682
+ else:
683
+ assert False
684
+
685
+ return wiring
686
+
687
+ def load_policies(self):
688
+ policies = {}
689
+ for p in self.ms.policies:
690
+ p = self.ms.policies[p]
691
+ opts = p.policy_options
692
+ if len(opts) == 0:
693
+ print("{} has no policy options".format(p.name))
694
+ else:
695
+ if len(opts) == 1:
696
+ opt = opts[0]
697
+ else:
698
+ assert (
699
+ "FP {}".format(p.name) in self.params
700
+ ), "No functional parameterization for {}".format(p.name)
701
+ opt = self.ms.functional_parameters["FP {}".format(p.name)][
702
+ self.params["FP {}".format(p.name)]
703
+ ]
704
+
705
+ if "python" not in opt.implementations:
706
+ print(
707
+ "No python implementation for {} / {}".format(p.name, opt.name)
708
+ )
709
+ else:
710
+ policies[p.name] = opt.implementations["python"]
711
+ return policies
712
+
713
+ def load_wiring(
714
+ self,
715
+ ):
716
+ self.blocks = {}
717
+ self.blocks.update(self.boundary_actions)
718
+ self.blocks.update(self.control_actions)
719
+ self.blocks.update(self.policies)
720
+ self.blocks.update(self.mechanisms)
721
+
722
+ self.wiring = {}
723
+
724
+ wiring = [x for x in self.ms.wiring.values()]
725
+
726
+ i = 1
727
+ while i > 0:
728
+ i = 0
729
+ hold = []
730
+ for w in wiring:
731
+ components = [x.name for x in w.components]
732
+ if all([x in self.blocks for x in components]):
733
+ i += 1
734
+ w2 = self.load_single_wiring(w)
735
+ assert w.name not in self.blocks, "{} was a repeated block".format(
736
+ w.name
737
+ )
738
+ if w2:
739
+ self.blocks[w.name] = w2
740
+ self.wiring[w.name] = w2
741
+
742
+ else:
743
+ hold.append(w)
744
+ wiring = hold
745
+ if len(wiring) > 0:
746
+ wiring = [x.name for x in wiring]
747
+ print("The following wirings were not loading: {}".format(wiring))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.2.8
3
+ Version: 0.3.0
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