1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
from ast import parse, Expression, Module
from pkg_resources import resource_stream
from public import public
from typing import List, Any
class Formula(object):
name: str
coordinate_model: Any
source: str
parameters: List[str]
assumptions: List[Expression]
code: List[Module]
_inputs: int
_outputs: int
# TODO: Separate into EFDFormula?
def __init__(self, path: str, name: str, coordinate_model: Any):
self.name = name
self.coordinate_model = coordinate_model
self.parameters = []
self.assumptions = []
self.code = []
self.__read_meta_file(path)
self.__read_op3_file(path + ".op3")
def __read_meta_file(self, path):
with resource_stream(__name__, path) as f:
line = f.readline().decode("ascii")
while line:
line = line[:-1]
if line.startswith("source"):
self.source = line[7:]
elif line.startswith("parameter"):
self.parameters.append(line[10:])
elif line.startswith("assume"):
self.assumptions.append(
parse(line[7:].replace("=", "==").replace("^", "**"), mode="eval"))
line = f.readline().decode("ascii")
def __read_op3_file(self, path):
with resource_stream(__name__, path) as f:
for line in f.readlines():
self.code.append(parse(line.decode("ascii").replace("^", "**"), path, mode="exec"))
@property
def num_inputs(self):
return self._inputs
@property
def num_outputs(self):
return self._outputs
def __repr__(self):
return f"{self.__class__.__name__}({self.name} for {self.coordinate_model})"
@public
class AdditionFormula(Formula):
_inputs = 2
_outputs = 1
@public
class DoublingFormula(Formula):
_inputs = 1
_outputs = 1
@public
class TriplingFormula(Formula):
_inputs = 1
_outputs = 1
@public
class NegationFormula(Formula):
_inputs = 1
_outputs = 1
@public
class ScalingFormula(Formula):
_inputs = 1
_outputs = 1
@public
class DifferentialAdditionFormula(Formula):
_inputs = 3
_outputs = 1
@public
class LadderFormula(Formula):
_inputs = 3
_outputs = 2
|