math-spec-mapping 0.2.7__py3-none-any.whl → 0.2.8__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.
@@ -5,6 +5,7 @@ from .Mechanism import Mechanism
5
5
  from .ControlAction import ControlAction
6
6
  from .BoundaryAction import BoundaryAction
7
7
  import os
8
+ from copy import deepcopy
8
9
 
9
10
 
10
11
  class MathSpec:
@@ -41,6 +42,8 @@ class MathSpec:
41
42
  self._crawl_parameters()
42
43
  self._crawl_parameters_exploded()
43
44
  self._check_dictionary_names()
45
+ self._build_functional_parameters()
46
+ self._build_parameter_types()
44
47
 
45
48
  def _check_dictionary_names(self):
46
49
  for key in self.boundary_actions:
@@ -352,6 +355,49 @@ class MathSpec:
352
355
  sm.extend([x.name for x in metrics.metrics])
353
356
  return sm
354
357
 
358
+ def _build_functional_parameters(self):
359
+ opts = [x for x in self.policies.values() if len(x.policy_options) > 1]
360
+ opts.extend(
361
+ [
362
+ x
363
+ for x in self.boundary_actions.values()
364
+ if len(x.boundary_action_options) > 1
365
+ ]
366
+ )
367
+ opts.extend(
368
+ [
369
+ x
370
+ for x in self.control_actions.values()
371
+ if len(x.control_action_options) > 1
372
+ ]
373
+ )
374
+ self.functional_parameters = {}
375
+ for x in opts:
376
+ self.functional_parameters["FP {}".format(x.name)] = x
377
+
378
+ def _build_parameter_types(self):
379
+ system_parameters_types = {}
380
+ behavioral_parameters_types = {}
381
+ functional_parameters_types = {}
382
+
383
+ for x in self.parameters.all_parameters:
384
+ pt = self.parameters.parameter_map[x].variable_type.original_type_name
385
+ pc = self.parameters.parameter_map[x].parameter_class
386
+ if pc == "Functional":
387
+ functional_parameters_types[x] = pt
388
+ elif pc == "System":
389
+ system_parameters_types[x] = pt
390
+ elif pc == "Behavioral":
391
+ behavioral_parameters_types[x] = pt
392
+ else:
393
+ assert False
394
+ for x in self.functional_parameters:
395
+ functional_parameters_types[x] = "str"
396
+
397
+ self.system_parameters_types = system_parameters_types
398
+ self.behavioral_parameters_types = behavioral_parameters_types
399
+ self.functional_parameters_types = functional_parameters_types
400
+
355
401
  def metaprogramming_python_types(self, model_directory, overwrite=False):
356
402
  path = model_directory + "/types.py"
357
403
  if not overwrite:
@@ -447,3 +493,110 @@ class MathSpec:
447
493
 
448
494
  with open(path, "w") as f:
449
495
  f.write(out)
496
+
497
+ def metaprogramming_python_parameters(
498
+ self, model_directory, overwrite=False, default_values=None
499
+ ):
500
+ path = model_directory + "/parameters.py"
501
+ if not overwrite:
502
+ assert "parameters.py" not in os.listdir(
503
+ model_directory
504
+ ), "The parameters file is already written, either delete it or switch to overwrite mode"
505
+ out = ""
506
+
507
+ unique_types = (
508
+ set(self.system_parameters_types.values())
509
+ .union(set(self.functional_parameters_types.values()))
510
+ .union(set(self.behavioral_parameters_types.values()))
511
+ )
512
+ unique_types = [x for x in unique_types if x != "str"]
513
+
514
+ out = ""
515
+ out += "from .types import {}".format(", ".join(unique_types))
516
+ out += "\n"
517
+ out += "from typing import TypedDict"
518
+ out += "\n"
519
+ out += "\n"
520
+
521
+ d = self.system_parameters_types
522
+ d = [(x, d[x]) for x in d]
523
+ d = ["'{}': {}".format(x[0], x[1]) for x in d]
524
+ d = ", ".join(d)
525
+ d = "{" + d + "}"
526
+
527
+ out += "SystemParameters = TypedDict('SystemParameters', {})".format(d)
528
+ out += "\n\n"
529
+
530
+ d = self.behavioral_parameters_types
531
+ d = [(x, d[x]) for x in d]
532
+ d = ["'{}': {}".format(x[0], x[1]) for x in d]
533
+ d = ", ".join(d)
534
+ d = "{" + d + "}"
535
+
536
+ out += "BehavioralParameters = TypedDict('BehavioralParameters', {})".format(d)
537
+ out += "\n\n"
538
+
539
+ d = self.functional_parameters_types
540
+ d = [(x, d[x]) for x in d]
541
+ d = ["'{}': {}".format(x[0], x[1]) for x in d]
542
+ d = ", ".join(d)
543
+ d = "{" + d + "}"
544
+
545
+ out += "FunctionalParameters = TypedDict('FunctionalParameters', {})".format(d)
546
+ out += "\n\n"
547
+ out += """Parameters = TypedDict("Parameters",{**BehavioralParameters.__annotations__,
548
+ **FunctionalParameters.__annotations__,
549
+ **SystemParameters.__annotations__})"""
550
+ out += "\n\n"
551
+
552
+ out += "functional_parameters: FunctionalParameters = "
553
+ out += "{"
554
+ for key in self.functional_parameters_types:
555
+ out += '"{}"'.format(key)
556
+ out += ": "
557
+ val = "None"
558
+ if default_values:
559
+ if key in default_values:
560
+ val = str(default_values[key])
561
+ out += val
562
+ out += ",\n"
563
+ out += "}"
564
+ out += "\n\n"
565
+
566
+ out += "behavioral_parameters: BehavioralParameters = "
567
+ out += "{"
568
+ for key in self.behavioral_parameters_types:
569
+ out += '"{}"'.format(key)
570
+ out += ": "
571
+ val = "None"
572
+ if default_values:
573
+ if key in default_values:
574
+ val = str(default_values[key])
575
+ out += val
576
+ out += ",\n"
577
+ out += "}"
578
+ out += "\n\n"
579
+
580
+ out += "system_parameters: SystemParameters = "
581
+ out += "{"
582
+ for key in self.system_parameters_types:
583
+ out += '"{}"'.format(key)
584
+ out += ": "
585
+ val = "None"
586
+ if default_values:
587
+ if key in default_values:
588
+ val = str(default_values[key])
589
+ out += val
590
+ out += ",\n"
591
+ out += "}"
592
+ out += "\n\n"
593
+
594
+ out += "parameters: Parameters = {**behavioral_parameters, **functional_parameters, **system_parameters}"
595
+
596
+ with open(path, "w") as f:
597
+ f.write(out)
598
+
599
+
600
+ class MathSpecImplementation:
601
+ def __init__(self, ms: MathSpec, params):
602
+ self.ms = deepcopy(ms)
@@ -1,4 +1,4 @@
1
- from .MathSpec import MathSpec
1
+ from .MathSpec import MathSpec, MathSpecImplementation
2
2
  from .State import State, StateVariable
3
3
  from .Entity import Entity
4
4
  from .BoundaryAction import BoundaryAction, BoundaryActionOption
@@ -675,7 +675,6 @@ def write_all_markdown_reports(ms, path, clear_folders=False):
675
675
  "Types",
676
676
  "Control Actions",
677
677
  "Spaces",
678
- ".obsidian",
679
678
  "Boundary Actions",
680
679
  "Policies",
681
680
  "Wiring",
@@ -116,28 +116,34 @@
116
116
  "additionalProperties": false,
117
117
  "properties": {
118
118
  "name": {
119
- "type": "string"
119
+ "type": "string",
120
+ "description": "The name of the control action"
120
121
  },
121
122
  "description": {
122
- "type": "string"
123
+ "type": "string",
124
+ "description": "The description of the control action"
123
125
  },
124
126
  "constraints": {
125
127
  "type": "array",
126
- "items": {}
128
+ "description": "Any constraints which the control action must respect",
129
+ "items": {"type": "string"}
127
130
  },
128
131
  "control_action_options": {
129
132
  "type": "array",
130
- "items": {}
133
+ "items": {},
134
+ "description": "Possible implementations of the control action"
131
135
  },
132
136
  "codomain": {
133
137
  "type": "array",
134
138
  "items": {
135
139
  "type": "string"
136
- }
140
+ },
141
+ "description": "The output spaces of the control action"
137
142
  },
138
143
  "parameters_used": {
139
144
  "type": "array",
140
- "items": {"type": "string"}
145
+ "items": {"type": "string"},
146
+ "description": "The parameters which the control action uses in its implenetations"
141
147
  }
142
148
  },
143
149
  "required": [
@@ -308,44 +314,52 @@
308
314
  "additionalProperties": false,
309
315
  "properties": {
310
316
  "name": {
311
- "type": "string"
317
+ "type": "string",
318
+ "description": "The name of the policy"
312
319
  },
313
320
  "description": {
314
- "type": "string"
321
+ "type": "string",
322
+ "description": "Description of the policy"
315
323
  },
316
324
  "constraints": {
317
325
  "type": "array",
318
- "items": {}
326
+ "description": "Any constraints which the policy must respect",
327
+ "items": {"type": "string"}
319
328
  },
320
329
  "policy_options": {
321
330
  "type": "array",
322
331
  "items": {
323
332
  "$ref": "./schema.schema.json/#/definitions/PolicyOption"
324
- }
333
+ },
334
+ "description": "Possible implementations of the policy"
325
335
  },
326
336
  "domain": {
327
337
  "type": "array",
328
338
  "items": {
329
339
  "type": "string"
330
- }
340
+ },
341
+ "description": "The spaces which are passed in as inputs to the policy"
331
342
  },
332
343
  "codomain": {
333
344
  "type": "array",
334
345
  "items": {
335
346
  "type": "string"
336
- }
347
+ },
348
+ "description": "The spaces which are returned as results of the policy"
337
349
  },
338
350
  "parameters_used": {
339
351
  "type": "array",
340
352
  "items": {
341
353
  "type": "string"
342
- }
354
+ },
355
+ "description": "All parameters used in the implementations of policies"
343
356
  },
344
357
  "metrics_used": {
345
358
  "type": "array",
346
359
  "items": {
347
360
  "type": "string"
348
- }
361
+ },
362
+ "description": "All metrics used in implementation of policies"
349
363
  }
350
364
  },
351
365
  "required": [
@@ -366,13 +380,16 @@
366
380
  "additionalProperties": false,
367
381
  "properties": {
368
382
  "name": {
369
- "type": "string"
383
+ "type": "string",
384
+ "description": "The name of the policy option"
370
385
  },
371
386
  "description": {
372
- "type": "string"
387
+ "type": "string",
388
+ "description": "A description of the implementation"
373
389
  },
374
390
  "logic": {
375
- "type": "string"
391
+ "type": "string",
392
+ "description": "Any logic associated with the implementation"
376
393
  }
377
394
  },
378
395
  "required": [
@@ -434,38 +451,45 @@
434
451
  "additionalProperties": true,
435
452
  "properties": {
436
453
  "name": {
437
- "type": "string"
454
+ "type": "string",
455
+ "description": "Name of the boundary action"
438
456
  },
439
457
  "description": {
440
- "type": "string"
458
+ "type": "string",
459
+ "description": "Quick description of the boundary action"
441
460
  },
442
461
  "constraints": {
443
462
  "type": "array",
444
463
  "items": {
445
464
  "type": "string"
446
- }
465
+ },
466
+ "description": "Any constraints which the boundary action must respect"
447
467
  },
448
468
  "boundary_action_options": {
449
469
  "type": "array",
450
- "items": {}
470
+ "items": {},
471
+ "description": "The options for implementation of the boundary action"
451
472
  },
452
473
  "called_by": {
453
474
  "type": "array",
454
475
  "items": {
455
476
  "type": "string"
456
- }
477
+ },
478
+ "description": "The entities which are allowed to call this boundary action"
457
479
  },
458
480
  "codomain": {
459
481
  "type": "array",
460
482
  "items": {
461
483
  "type": "string"
462
- }
484
+ },
485
+ "description": "List of outputs that come out of this block"
463
486
  },
464
487
  "parameters_used": {
465
488
  "type": "array",
466
489
  "items": {
467
490
  "type": "string"
468
- }
491
+ },
492
+ "description": "The string keys of parameters which have an effect on the boundary action"
469
493
  }
470
494
  },
471
495
  "required": [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.2.7
3
+ Version: 0.2.8
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,12 +1,12 @@
1
1
  math_spec_mapping/__init__.py,sha256=k5KVhqX1_iIkGjTBHAHezWUeh0b3ilWpJaSIVSbKMcg,907
2
2
  math_spec_mapping/schema.py,sha256=6mrRqzEnTTSXjb19xJ63MBp0KjKH0s7i6TfT4MkAY9k,233
3
- math_spec_mapping/schema.schema.json,sha256=E8-TQIiv7AjIMXnAIB84z_O4cMLfGuDmDCFCoIlwQz0,27174
3
+ math_spec_mapping/schema.schema.json,sha256=DTrPuYbA-n27jatLt2h76WgMm7pWVgkFwC3zGDnlptQ,29208
4
4
  math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
5
5
  math_spec_mapping/Classes/Block.py,sha256=hXQO221IP-TqZm_TwFKfURpEEjZm7L1TPZDCYlaOdho,17302
6
6
  math_spec_mapping/Classes/BoundaryAction.py,sha256=AOENCqCEfpjotnHhzUj_F2SOP0SGpkN1tNPr8Mtl6Tc,476
7
7
  math_spec_mapping/Classes/ControlAction.py,sha256=ysqpgANwdizVdwqtgZmnxXMpCqrzmVEF_6YT0M3l4Ho,526
8
8
  math_spec_mapping/Classes/Entity.py,sha256=fA0-b128_OHHxfCg4pzqyQV083EYev1HlVpy86S5igg,1226
9
- math_spec_mapping/Classes/MathSpec.py,sha256=eweFUB8iuEI5Y-9VOULbAWbIeHd18Iw-I_VPUjvnn0E,16999
9
+ math_spec_mapping/Classes/MathSpec.py,sha256=gzTi7QSsFEWPTfHaz8YU0R7X5g4rVDFFBlKdBj4B0Pk,22244
10
10
  math_spec_mapping/Classes/Mechanism.py,sha256=2sLm3wYBIeTQaMBcsJ9btqIWsbS895Ra8NY6Y9_G_Dg,379
11
11
  math_spec_mapping/Classes/Metric.py,sha256=AhPgYppOP6q49xvR8S9STxQsXUKJlTWx7wI1LfZEtww,581
12
12
  math_spec_mapping/Classes/Parameter.py,sha256=ZuJ_w0sChvRElJ4sOnXZ2EV4Ell2xXFulKLjVOpgz2E,1237
@@ -16,7 +16,7 @@ math_spec_mapping/Classes/State.py,sha256=0gJHHTNjTrz1fL2K-yPu-dJlaCsU_NMxClw6ne
16
16
  math_spec_mapping/Classes/StateUpdateTransmissionChannel.py,sha256=3hBLvD1lE64PkwqksBXAfFWv7foOZzGQLAFQWy42tOA,257
17
17
  math_spec_mapping/Classes/StatefulMetric.py,sha256=UCis1BJ7fsajHHxFF05ZiyDean2D4s4a95uYYW1Mjq4,749
18
18
  math_spec_mapping/Classes/Type.py,sha256=2KFY8d3cv1PzJJ7SSMHJf1zcfQ3ZbqxotK2KgTaLZdM,289
19
- math_spec_mapping/Classes/__init__.py,sha256=_hXyZMJanmIex_W6yCR2H7Jw8iU2JJIf3U7VcvBSOGU,737
19
+ math_spec_mapping/Classes/__init__.py,sha256=0zxgOqns_9JybD74HKMVh6aw8ij8WVbfQ4Q_1uWzof0,761
20
20
  math_spec_mapping/Convenience/__init__.py,sha256=-hNZVoaNSgTmZTiyZoMfWyg14xonC3ppz-diQk1VlUY,60
21
21
  math_spec_mapping/Convenience/documentation.py,sha256=Jf7-JJIk_vZkNBIGV4bs5LM3B0RVaCCtuwJ164thGfY,1607
22
22
  math_spec_mapping/Convenience/starter.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -44,7 +44,7 @@ math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-Y
44
44
  math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
45
45
  math_spec_mapping/Reports/general.py,sha256=WOOn6Wlb8M4fsdN49FlKLwOka6vJPQ9aCUy88TL2ki0,1610
46
46
  math_spec_mapping/Reports/html.py,sha256=xf5jk3DHWg4CfZHZuF2JK5iZ515ecjDShJJsahiqb4g,8882
47
- math_spec_mapping/Reports/markdown.py,sha256=pDGHYMdtZmeXHqvU9FB3BycyB4qflWXq0bf2m-wsXMU,21138
47
+ math_spec_mapping/Reports/markdown.py,sha256=eJidreiLmfUznoq_-C4IsFTZ__Bka-PWLKjKYn6bhmw,21113
48
48
  math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
49
49
  math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
50
50
  math_spec_mapping/Reports/parameters.py,sha256=yizNG4lNGrgrlzYYcHMGfXKDFlPw4PMDYshDqZ3YARs,535
@@ -53,8 +53,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
53
53
  math_spec_mapping/Reports/state.py,sha256=RSHDjzSiUj4ZjReWbkBW7k2njs3Ovp-q0rCC7GBfD-A,2203
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.2.7.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
- math_spec_mapping-0.2.7.dist-info/METADATA,sha256=H3plPQQrT7sss_57Z2341oAlBkMpW7_QHihqFoZcgUM,6012
58
- math_spec_mapping-0.2.7.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
- math_spec_mapping-0.2.7.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
- math_spec_mapping-0.2.7.dist-info/RECORD,,
56
+ math_spec_mapping-0.2.8.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
+ math_spec_mapping-0.2.8.dist-info/METADATA,sha256=hXBDv_nbuvouVAYXB0jpyKlzNmPFI9xyMjCHn8RvtiE,6012
58
+ math_spec_mapping-0.2.8.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
+ math_spec_mapping-0.2.8.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
+ math_spec_mapping-0.2.8.dist-info/RECORD,,