pepflow 0.1.4__py3-none-any.whl → 0.1.4a1__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.
- pepflow/__init__.py +1 -0
- pepflow/constraint_test.py +71 -0
- pepflow/e2e_test.py +37 -2
- pepflow/expression_manager.py +72 -2
- pepflow/expression_manager_test.py +116 -0
- pepflow/function.py +115 -43
- pepflow/function_test.py +180 -114
- pepflow/interactive_constraint.py +165 -75
- pepflow/pep.py +9 -2
- pepflow/pep_context.py +6 -6
- pepflow/pep_context_test.py +4 -0
- pepflow/pep_test.py +8 -0
- pepflow/point_test.py +31 -191
- pepflow/scalar_test.py +91 -134
- {pepflow-0.1.4.dist-info → pepflow-0.1.4a1.dist-info}/METADATA +19 -1
- pepflow-0.1.4a1.dist-info/RECORD +26 -0
- pepflow-0.1.4.dist-info/RECORD +0 -24
- {pepflow-0.1.4.dist-info → pepflow-0.1.4a1.dist-info}/WHEEL +0 -0
- {pepflow-0.1.4.dist-info → pepflow-0.1.4a1.dist-info}/licenses/LICENSE +0 -0
- {pepflow-0.1.4.dist-info → pepflow-0.1.4a1.dist-info}/top_level.txt +0 -0
pepflow/pep.py
CHANGED
@@ -138,11 +138,19 @@ class PEPBuilder:
|
|
138
138
|
def set_relaxed_constraints(self, relaxed_constraints: list[str]):
|
139
139
|
self.relaxed_constraints.extend(relaxed_constraints)
|
140
140
|
|
141
|
-
def declare_func(self, function_class, **kwargs):
|
141
|
+
def declare_func(self, function_class: type[Function], tag: str, **kwargs):
|
142
142
|
func = function_class(is_basis=True, composition=None, **kwargs)
|
143
|
+
func.add_tag(tag)
|
143
144
|
self.functions.append(func)
|
144
145
|
return func
|
145
146
|
|
147
|
+
def get_func_by_tag(self, tag: str):
|
148
|
+
# TODO: Add support to return composite functions as well. Right now we can only return base functions
|
149
|
+
for f in self.functions:
|
150
|
+
if tag in f.tags:
|
151
|
+
return f
|
152
|
+
raise ValueError("Cannot find the function of given tag.")
|
153
|
+
|
146
154
|
def solve(self, context: pc.PEPContext | None = None, **kwargs):
|
147
155
|
if context is None:
|
148
156
|
context = pc.get_current_context()
|
@@ -152,7 +160,6 @@ class PEPBuilder:
|
|
152
160
|
all_constraints: list[Constraint] = [*self.init_conditions]
|
153
161
|
for f in self.functions:
|
154
162
|
all_constraints.extend(f.get_interpolation_constraints())
|
155
|
-
all_constraints.extend(context.opt_conditions[f])
|
156
163
|
|
157
164
|
# for now, we heavily rely on the CVX. We can make a wrapper class to avoid
|
158
165
|
# direct dependency in the future.
|
pepflow/pep_context.py
CHANGED
@@ -26,7 +26,6 @@ import natsort
|
|
26
26
|
import pandas as pd
|
27
27
|
|
28
28
|
if TYPE_CHECKING:
|
29
|
-
from pepflow.constraint import Constraint
|
30
29
|
from pepflow.function import Function, Triplet
|
31
30
|
from pepflow.point import Point
|
32
31
|
from pepflow.scalar import Scalar
|
@@ -53,7 +52,8 @@ class PEPContext:
|
|
53
52
|
self.points: list[Point] = []
|
54
53
|
self.scalars: list[Scalar] = []
|
55
54
|
self.triplets: dict[Function, list[Triplet]] = defaultdict(list)
|
56
|
-
self.
|
55
|
+
# self.triplets will contain all stationary_triplets. They are not mutually exclusive.
|
56
|
+
self.stationary_triplets: dict[Function, list[Triplet]] = defaultdict(list)
|
57
57
|
|
58
58
|
GLOBAL_CONTEXT_DICT[name] = self
|
59
59
|
|
@@ -70,8 +70,8 @@ class PEPContext:
|
|
70
70
|
def add_triplet(self, function: Function, triplet: Triplet):
|
71
71
|
self.triplets[function].append(triplet)
|
72
72
|
|
73
|
-
def
|
74
|
-
self.
|
73
|
+
def add_stationary_triplet(self, function: Function, stationary_triplet: Triplet):
|
74
|
+
self.stationary_triplets[function].append(stationary_triplet)
|
75
75
|
|
76
76
|
def get_by_tag(self, tag: str) -> Point | Scalar:
|
77
77
|
for p in self.points:
|
@@ -80,13 +80,13 @@ class PEPContext:
|
|
80
80
|
for s in self.scalars:
|
81
81
|
if tag in s.tags:
|
82
82
|
return s
|
83
|
-
raise ValueError("Cannot find the point or
|
83
|
+
raise ValueError("Cannot find the point, scalar, or function of given tag.")
|
84
84
|
|
85
85
|
def clear(self):
|
86
86
|
self.points.clear()
|
87
87
|
self.scalars.clear()
|
88
88
|
self.triplets.clear()
|
89
|
-
self.
|
89
|
+
self.stationary_triplets.clear()
|
90
90
|
|
91
91
|
def tracked_point(self, func: Function) -> list[Point]:
|
92
92
|
return natsort.natsorted(
|
pepflow/pep_context_test.py
CHANGED
@@ -91,10 +91,14 @@ def test_get_by_tag(pep_context: pc.PEPContext):
|
|
91
91
|
f = SmoothConvexFunction(L=1, is_basis=True)
|
92
92
|
f.add_tag("f")
|
93
93
|
p1 = Point(is_basis=True, tags=["x1"])
|
94
|
+
p2 = Point(is_basis=True, tags=["x2"])
|
95
|
+
p3 = p1 + p2
|
94
96
|
|
95
97
|
triplet = f.generate_triplet(p1)
|
98
|
+
_ = f.generate_triplet(p2)
|
96
99
|
|
97
100
|
assert pep_context.get_by_tag("x1") == p1
|
98
101
|
assert pep_context.get_by_tag("f(x1)") == triplet.function_value
|
99
102
|
assert pep_context.get_by_tag("gradient_f(x1)") == triplet.gradient
|
103
|
+
assert pep_context.get_by_tag("x1+x2") == p3
|
100
104
|
pc.set_current_context(None)
|
pepflow/pep_test.py
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
import pytest
|
21
21
|
|
22
|
+
from pepflow import function as fc
|
22
23
|
from pepflow import pep
|
23
24
|
from pepflow import pep_context as pc
|
24
25
|
|
@@ -75,3 +76,10 @@ class TestPEPBuilder:
|
|
75
76
|
|
76
77
|
with builder.make_context("test", override=True):
|
77
78
|
pass
|
79
|
+
|
80
|
+
def test_get_func_by_tag(self) -> None:
|
81
|
+
builder = pep.PEPBuilder()
|
82
|
+
with builder.make_context("test"):
|
83
|
+
f = builder.declare_func(fc.SmoothConvexFunction, "f", L=1)
|
84
|
+
|
85
|
+
assert builder.get_func_by_tag("f") == f
|
pepflow/point_test.py
CHANGED
@@ -24,10 +24,9 @@ import numpy as np
|
|
24
24
|
import pytest
|
25
25
|
|
26
26
|
from pepflow import expression_manager as exm
|
27
|
-
from pepflow import function as fc
|
28
27
|
from pepflow import pep as pep
|
29
28
|
from pepflow import pep_context as pc
|
30
|
-
from pepflow import point
|
29
|
+
from pepflow import point
|
31
30
|
|
32
31
|
|
33
32
|
@pytest.fixture
|
@@ -103,12 +102,6 @@ def test_point_hash_different(pep_context: pc.PEPContext) -> None:
|
|
103
102
|
assert p1.uid != p2.uid
|
104
103
|
|
105
104
|
|
106
|
-
def test_scalar_hash_different(pep_context: pc.PEPContext) -> None:
|
107
|
-
s1 = scalar.Scalar(is_basis=True, eval_expression=None)
|
108
|
-
s2 = scalar.Scalar(is_basis=True, eval_expression=None)
|
109
|
-
assert s1.uid != s2.uid
|
110
|
-
|
111
|
-
|
112
105
|
def test_point_tag(pep_context: pc.PEPContext) -> None:
|
113
106
|
p1 = point.Point(is_basis=True, eval_expression=None)
|
114
107
|
p1.add_tag(tag="my_tag")
|
@@ -123,202 +116,49 @@ def test_point_repr(pep_context: pc.PEPContext) -> None:
|
|
123
116
|
assert str(p1) == "my_tag"
|
124
117
|
|
125
118
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
s1.add_tag(tag="my_tag")
|
131
|
-
assert s1.tags == ["my_tag"]
|
132
|
-
assert s1.tag == "my_tag"
|
133
|
-
|
134
|
-
|
135
|
-
def test_scalar_repr():
|
136
|
-
pep_builder = pep.PEPBuilder()
|
137
|
-
with pep_builder.make_context("test"):
|
138
|
-
s1 = scalar.Scalar(is_basis=True, tags=["s1"])
|
139
|
-
print(s1) # it should be fine without tag
|
140
|
-
s1.add_tag("my_tag")
|
141
|
-
assert str(s1) == "my_tag"
|
142
|
-
|
143
|
-
|
144
|
-
def test_point_in_a_list():
|
145
|
-
pep_builder = pep.PEPBuilder()
|
146
|
-
with pep_builder.make_context("test"):
|
147
|
-
p1 = point.Point(is_basis=True, eval_expression=None)
|
148
|
-
p2 = point.Point(is_basis=True, eval_expression=None)
|
149
|
-
p3 = point.Point(is_basis=True, eval_expression=None)
|
119
|
+
def test_point_in_a_list(pep_context: pc.PEPContext):
|
120
|
+
p1 = point.Point(is_basis=True, eval_expression=None)
|
121
|
+
p2 = point.Point(is_basis=True, eval_expression=None)
|
122
|
+
p3 = point.Point(is_basis=True, eval_expression=None)
|
150
123
|
assert p1 in [p1, p2]
|
151
124
|
assert p3 not in [p1, p2]
|
152
125
|
|
153
126
|
|
154
|
-
def
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
s2 = scalar.Scalar(is_basis=True, eval_expression=None)
|
159
|
-
s3 = scalar.Scalar(is_basis=True, eval_expression=None)
|
160
|
-
assert s1 in [s1, s2]
|
161
|
-
assert s3 not in [s1, s2]
|
162
|
-
|
163
|
-
|
164
|
-
def test_expression_manager_on_basis_point():
|
165
|
-
pep_builder = pep.PEPBuilder()
|
166
|
-
with pep_builder.make_context("test") as ctx:
|
167
|
-
p1 = point.Point(is_basis=True, eval_expression=None, tags=["p1"])
|
168
|
-
p2 = point.Point(is_basis=True, eval_expression=None, tags=["p2"])
|
169
|
-
pm = exm.ExpressionManager(ctx)
|
127
|
+
def test_expression_manager_on_basis_point(pep_context: pc.PEPContext):
|
128
|
+
p1 = point.Point(is_basis=True, eval_expression=None, tags=["p1"])
|
129
|
+
p2 = point.Point(is_basis=True, eval_expression=None, tags=["p2"])
|
130
|
+
pm = exm.ExpressionManager(pep_context)
|
170
131
|
|
171
|
-
|
172
|
-
|
132
|
+
np.testing.assert_allclose(pm.eval_point(p1).vector, np.array([1, 0]))
|
133
|
+
np.testing.assert_allclose(pm.eval_point(p2).vector, np.array([0, 1]))
|
173
134
|
|
174
|
-
|
175
|
-
|
135
|
+
p3 = point.Point(is_basis=True, eval_expression=None, tags=["p3"]) # noqa: F841
|
136
|
+
pm = exm.ExpressionManager(pep_context)
|
176
137
|
|
177
138
|
np.testing.assert_allclose(pm.eval_point(p1).vector, np.array([1, 0, 0]))
|
178
139
|
np.testing.assert_allclose(pm.eval_point(p2).vector, np.array([0, 1, 0]))
|
179
140
|
|
180
141
|
|
181
|
-
def
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
pm = exm.ExpressionManager(ctx)
|
187
|
-
|
188
|
-
np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0]))
|
189
|
-
np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1]))
|
190
|
-
|
191
|
-
s3 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s3"]) # noqa: F841
|
192
|
-
pm = exm.ExpressionManager(ctx)
|
142
|
+
def test_expression_manager_eval_point(pep_context: pc.PEPContext):
|
143
|
+
p1 = point.Point(is_basis=True, tags=["p1"])
|
144
|
+
p2 = point.Point(is_basis=True, tags=["p2"])
|
145
|
+
p3 = 2 * p1 + p2 / 4
|
146
|
+
p4 = p3 + p1
|
193
147
|
|
194
|
-
|
195
|
-
np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1, 0]))
|
196
|
-
|
197
|
-
|
198
|
-
def test_expression_manager_eval_point():
|
199
|
-
pep_builder = pep.PEPBuilder()
|
200
|
-
with pep_builder.make_context("test") as ctx:
|
201
|
-
p1 = point.Point(is_basis=True, tags=["p1"])
|
202
|
-
p2 = point.Point(is_basis=True, tags=["p2"])
|
203
|
-
p3 = 2 * p1 + p2 / 4
|
204
|
-
p4 = p3 + p1
|
205
|
-
|
206
|
-
pm = exm.ExpressionManager(ctx)
|
148
|
+
pm = exm.ExpressionManager(pep_context)
|
207
149
|
np.testing.assert_allclose(pm.eval_point(p3).vector, np.array([2, 0.25]))
|
208
150
|
np.testing.assert_allclose(pm.eval_point(p4).vector, np.array([3, 0.25]))
|
209
151
|
|
210
152
|
|
211
|
-
def test_expression_manager_eval_point_large_scale():
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
assert (time.time() - t) < 0.5
|
225
|
-
|
226
|
-
|
227
|
-
def test_function_generate_triplet():
|
228
|
-
pep_builder = pep.PEPBuilder()
|
229
|
-
with pep_builder.make_context("test") as ctx:
|
230
|
-
f = fc.Function(is_basis=True, reuse_gradient=True)
|
231
|
-
f.add_tag("f")
|
232
|
-
g = fc.Function(is_basis=True, reuse_gradient=True)
|
233
|
-
g.add_tag("g")
|
234
|
-
h = 5 * f + 5 * g
|
235
|
-
h.add_tag("h")
|
236
|
-
|
237
|
-
f1 = fc.Function(is_basis=True, reuse_gradient=False)
|
238
|
-
f1.add_tag("f1")
|
239
|
-
g1 = fc.Function(is_basis=True, reuse_gradient=False)
|
240
|
-
g1.add_tag("g1")
|
241
|
-
h1 = 5 * f1 + 5 * g1
|
242
|
-
h1.add_tag("h1")
|
243
|
-
|
244
|
-
p1 = point.Point(is_basis=True)
|
245
|
-
p1.add_tag("p1")
|
246
|
-
p1_triplet = h.generate_triplet(p1)
|
247
|
-
p1_triplet_1 = h.generate_triplet(p1)
|
248
|
-
|
249
|
-
p1_triplet_2 = h1.generate_triplet(p1)
|
250
|
-
p1_triplet_3 = h1.generate_triplet(p1)
|
251
|
-
|
252
|
-
pm = exm.ExpressionManager(ctx)
|
253
|
-
|
254
|
-
np.testing.assert_allclose(
|
255
|
-
pm.eval_point(p1).vector, np.array([1, 0, 0, 0, 0, 0, 0])
|
256
|
-
)
|
257
|
-
|
258
|
-
np.testing.assert_allclose(
|
259
|
-
pm.eval_point(p1_triplet.gradient).vector, np.array([0, 5, 5, 0, 0, 0, 0])
|
260
|
-
)
|
261
|
-
np.testing.assert_allclose(
|
262
|
-
pm.eval_scalar(p1_triplet.function_value).vector, np.array([5, 5, 0, 0])
|
263
|
-
)
|
264
|
-
|
265
|
-
np.testing.assert_allclose(
|
266
|
-
pm.eval_point(p1_triplet_1.gradient).vector, np.array([0, 5, 5, 0, 0, 0, 0])
|
267
|
-
)
|
268
|
-
np.testing.assert_allclose(
|
269
|
-
pm.eval_scalar(p1_triplet_1.function_value).vector, np.array([5, 5, 0, 0])
|
270
|
-
)
|
271
|
-
|
272
|
-
np.testing.assert_allclose(
|
273
|
-
pm.eval_point(p1_triplet_2.gradient).vector, np.array([0, 0, 0, 5, 5, 0, 0])
|
274
|
-
)
|
275
|
-
np.testing.assert_allclose(
|
276
|
-
pm.eval_scalar(p1_triplet_2.function_value).vector, np.array([0, 0, 5, 5])
|
277
|
-
)
|
278
|
-
|
279
|
-
np.testing.assert_allclose(
|
280
|
-
pm.eval_point(p1_triplet_3.gradient).vector, np.array([0, 0, 0, 0, 0, 5, 5])
|
281
|
-
)
|
282
|
-
np.testing.assert_allclose(
|
283
|
-
pm.eval_scalar(p1_triplet_3.function_value).vector, np.array([0, 0, 5, 5])
|
284
|
-
)
|
285
|
-
|
286
|
-
|
287
|
-
def test_function_add_stationary_point():
|
288
|
-
pep_builder = pep.PEPBuilder()
|
289
|
-
with pep_builder.make_context("test") as ctx:
|
290
|
-
f = fc.Function(is_basis=True, reuse_gradient=True)
|
291
|
-
f.add_tag("f")
|
292
|
-
x_opt = f.add_stationary_point("x_opt")
|
293
|
-
|
294
|
-
pm = exm.ExpressionManager(ctx)
|
295
|
-
|
296
|
-
np.testing.assert_allclose(pm.eval_point(x_opt).vector, np.array([1]))
|
297
|
-
|
298
|
-
|
299
|
-
def test_smooth_interpolability_constraints():
|
300
|
-
pep_builder = pep.PEPBuilder()
|
301
|
-
with pep_builder.make_context("test") as ctx:
|
302
|
-
f = fc.SmoothConvexFunction(L=1)
|
303
|
-
f.add_tag("f")
|
304
|
-
_ = f.add_stationary_point("x_opt")
|
305
|
-
|
306
|
-
x_0 = point.Point(is_basis=True)
|
307
|
-
x_0.add_tag("x_0")
|
308
|
-
_ = f.generate_triplet(x_0)
|
309
|
-
|
310
|
-
all_interpolation_constraints = f.get_interpolation_constraints()
|
311
|
-
|
312
|
-
pm = exm.ExpressionManager(ctx)
|
313
|
-
|
314
|
-
np.testing.assert_allclose(
|
315
|
-
pm.eval_scalar(all_interpolation_constraints[1].scalar).vector, [1, -1]
|
316
|
-
)
|
317
|
-
np.testing.assert_allclose(
|
318
|
-
pm.eval_scalar(all_interpolation_constraints[1].scalar).matrix,
|
319
|
-
[[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.5]],
|
320
|
-
)
|
321
|
-
|
322
|
-
np.testing.assert_allclose(
|
323
|
-
pm.eval_scalar(all_interpolation_constraints[1].scalar).constant, 0
|
324
|
-
)
|
153
|
+
def test_expression_manager_eval_point_large_scale(pep_context):
|
154
|
+
all_basis = [point.Point(is_basis=True, tags=[f"p_{i}"]) for i in range(100)]
|
155
|
+
p = all_basis[0]
|
156
|
+
for i in range(len(all_basis)):
|
157
|
+
for j in range(i + 1, len(all_basis)):
|
158
|
+
p += all_basis[i] * 2 + all_basis[j]
|
159
|
+
pm = exm.ExpressionManager(pep_context)
|
160
|
+
t = time.time()
|
161
|
+
for pp in pep_context.points:
|
162
|
+
pm.eval_point(pp)
|
163
|
+
|
164
|
+
assert (time.time() - t) < 0.5
|
pepflow/scalar_test.py
CHANGED
@@ -17,155 +17,148 @@
|
|
17
17
|
# specific language governing permissions and limitations
|
18
18
|
# under the License.
|
19
19
|
|
20
|
+
from typing import Iterator
|
20
21
|
|
21
22
|
import numpy as np
|
23
|
+
import pytest
|
22
24
|
|
23
25
|
from pepflow import expression_manager as exm
|
24
26
|
from pepflow import pep as pep
|
25
|
-
from pepflow import
|
27
|
+
from pepflow import pep_context as pc
|
28
|
+
from pepflow import point, scalar
|
26
29
|
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
@pytest.fixture
|
32
|
+
def pep_context() -> Iterator[pc.PEPContext]:
|
33
|
+
"""Prepare the pep context and reset the context to None at the end."""
|
34
|
+
ctx = pc.PEPContext("test").set_as_current()
|
35
|
+
yield ctx
|
36
|
+
pc.set_current_context(None)
|
33
37
|
|
34
|
-
s_add = s1 + s2
|
35
|
-
assert s_add.tag == "s1+s2"
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
+
def test_scalar_add_tag(pep_context: pc.PEPContext):
|
40
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
|
41
|
+
s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
|
39
42
|
|
40
|
-
|
41
|
-
|
43
|
+
s_add = s1 + s2
|
44
|
+
assert s_add.tag == "s1+s2"
|
42
45
|
|
43
|
-
|
44
|
-
|
46
|
+
s_add = s1 + 0.1
|
47
|
+
assert s_add.tag == "s1+0.1"
|
45
48
|
|
46
|
-
|
47
|
-
|
49
|
+
s_radd = 0.1 + s1
|
50
|
+
assert s_radd.tag == "0.1+s1"
|
48
51
|
|
49
|
-
|
50
|
-
|
52
|
+
s_sub = s1 - s2
|
53
|
+
assert s_sub.tag == "s1-s2"
|
51
54
|
|
52
|
-
|
53
|
-
|
55
|
+
s_sub = s1 - (s2 + s1)
|
56
|
+
assert s_sub.tag == "s1-(s2+s1)"
|
54
57
|
|
55
|
-
|
56
|
-
|
58
|
+
s_sub = s1 - (s2 - s1)
|
59
|
+
assert s_sub.tag == "s1-(s2-s1)"
|
57
60
|
|
61
|
+
s_sub = s1 - 0.1
|
62
|
+
assert s_sub.tag == "s1-0.1"
|
58
63
|
|
59
|
-
|
60
|
-
|
61
|
-
with pep_builder.make_context("test"):
|
62
|
-
s = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s"])
|
64
|
+
s_rsub = 0.1 - s1
|
65
|
+
assert s_rsub.tag == "0.1-s1"
|
63
66
|
|
64
|
-
s_mul = s * 0.1
|
65
|
-
assert s_mul.tag == "s*0.1"
|
66
67
|
|
67
|
-
|
68
|
-
|
68
|
+
def test_scalar_mul_tag(pep_context: pc.PEPContext):
|
69
|
+
s = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s"])
|
69
70
|
|
70
|
-
|
71
|
-
|
71
|
+
s_mul = s * 0.1
|
72
|
+
assert s_mul.tag == "s*0.1"
|
72
73
|
|
73
|
-
|
74
|
-
|
74
|
+
s_rmul = 0.1 * s
|
75
|
+
assert s_rmul.tag == "0.1*s"
|
75
76
|
|
77
|
+
s_neg = -s
|
78
|
+
assert s_neg.tag == "-s"
|
76
79
|
|
77
|
-
|
78
|
-
|
79
|
-
with pep_builder.make_context("test"):
|
80
|
-
s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
|
81
|
-
s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
|
80
|
+
s_truediv = s / 0.1
|
81
|
+
assert s_truediv.tag == "1/0.1*s"
|
82
82
|
|
83
|
-
s_add_mul = (s1 + s2) * 0.1
|
84
|
-
assert s_add_mul.tag == "(s1+s2)*0.1"
|
85
83
|
|
86
|
-
|
87
|
-
|
84
|
+
def test_scalar_add_and_mul_tag(pep_context: pc.PEPContext):
|
85
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
|
86
|
+
s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
|
88
87
|
|
89
|
-
|
90
|
-
|
88
|
+
s_add_mul = (s1 + s2) * 0.1
|
89
|
+
assert s_add_mul.tag == "(s1+s2)*0.1"
|
91
90
|
|
92
|
-
|
93
|
-
|
91
|
+
s_add_mul = s1 + s2 * 0.1
|
92
|
+
assert s_add_mul.tag == "s1+s2*0.1"
|
94
93
|
|
94
|
+
s_neg_add = -(s1 + s2)
|
95
|
+
assert s_neg_add.tag == "-(s1+s2)"
|
95
96
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
97
|
+
s_rmul_add = 0.1 * (s1 + s2)
|
98
|
+
assert s_rmul_add.tag == "0.1*(s1+s2)"
|
99
|
+
|
100
|
+
|
101
|
+
def test_scalar_hash_different(pep_context: pc.PEPContext):
|
102
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None)
|
103
|
+
s2 = scalar.Scalar(is_basis=True, eval_expression=None)
|
101
104
|
assert s1.uid != s2.uid
|
102
105
|
|
103
106
|
|
104
|
-
def test_scalar_tag():
|
105
|
-
|
106
|
-
|
107
|
-
s1 = scalar.Scalar(is_basis=True, eval_expression=None)
|
108
|
-
s1.add_tag(tag="my_tag")
|
107
|
+
def test_scalar_tag(pep_context: pc.PEPContext):
|
108
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None)
|
109
|
+
s1.add_tag(tag="my_tag")
|
109
110
|
assert s1.tags == ["my_tag"]
|
110
111
|
assert s1.tag == "my_tag"
|
111
112
|
|
112
113
|
|
113
|
-
def test_scalar_repr():
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
s1.add_tag("my_tag")
|
119
|
-
assert str(s1) == "my_tag"
|
114
|
+
def test_scalar_repr(pep_context: pc.PEPContext):
|
115
|
+
s1 = scalar.Scalar(is_basis=True, tags=["s1"])
|
116
|
+
print(s1) # it should be fine without tag
|
117
|
+
s1.add_tag("my_tag")
|
118
|
+
assert str(s1) == "my_tag"
|
120
119
|
|
121
120
|
|
122
|
-
def test_scalar_in_a_list():
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
s2 = scalar.Scalar(is_basis=True, eval_expression=None)
|
127
|
-
s3 = scalar.Scalar(is_basis=True, eval_expression=None)
|
121
|
+
def test_scalar_in_a_list(pep_context: pc.PEPContext):
|
122
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None)
|
123
|
+
s2 = scalar.Scalar(is_basis=True, eval_expression=None)
|
124
|
+
s3 = scalar.Scalar(is_basis=True, eval_expression=None)
|
128
125
|
assert s1 in [s1, s2]
|
129
126
|
assert s3 not in [s1, s2]
|
130
127
|
|
131
128
|
|
132
|
-
def test_expression_manager_on_basis_scalar():
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
|
137
|
-
pm = exm.ExpressionManager(ctx)
|
129
|
+
def test_expression_manager_on_basis_scalar(pep_context: pc.PEPContext):
|
130
|
+
s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
|
131
|
+
s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
|
132
|
+
pm = exm.ExpressionManager(pep_context)
|
138
133
|
|
139
|
-
|
140
|
-
|
134
|
+
np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0]))
|
135
|
+
np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1]))
|
141
136
|
|
142
|
-
|
143
|
-
|
137
|
+
s3 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s3"]) # noqa: F841
|
138
|
+
pm = exm.ExpressionManager(pep_context)
|
144
139
|
|
145
|
-
|
146
|
-
|
140
|
+
np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0, 0]))
|
141
|
+
np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1, 0]))
|
147
142
|
|
148
143
|
|
149
|
-
def test_expression_manager_eval_scalar():
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
s4 = s3 + s1
|
156
|
-
s5 = s4 + 5
|
144
|
+
def test_expression_manager_eval_scalar(pep_context: pc.PEPContext):
|
145
|
+
s1 = scalar.Scalar(is_basis=True, tags=["s1"])
|
146
|
+
s2 = scalar.Scalar(is_basis=True, tags=["s2"])
|
147
|
+
s3 = 2 * s1 + s2 / 4 + 5
|
148
|
+
s4 = s3 + s1
|
149
|
+
s5 = s4 + 5
|
157
150
|
|
158
|
-
|
159
|
-
|
160
|
-
|
151
|
+
p1 = point.Point(is_basis=True, tags=["p1"])
|
152
|
+
p2 = point.Point(is_basis=True, tags=["p2"])
|
153
|
+
s6 = p1 * p2
|
161
154
|
|
162
|
-
|
163
|
-
|
164
|
-
|
155
|
+
p3 = point.Point(is_basis=True, tags=["p3"])
|
156
|
+
p4 = point.Point(is_basis=True, tags=["p4"])
|
157
|
+
s7 = 5 * p3 * p4
|
165
158
|
|
166
|
-
|
159
|
+
s8 = s6 + s7
|
167
160
|
|
168
|
-
|
161
|
+
pm = exm.ExpressionManager(pep_context)
|
169
162
|
|
170
163
|
np.testing.assert_allclose(pm.eval_scalar(s3).vector, np.array([2, 0.25]))
|
171
164
|
np.testing.assert_allclose(pm.eval_scalar(s3).constant, 5)
|
@@ -212,39 +205,3 @@ def test_expression_manager_eval_scalar():
|
|
212
205
|
]
|
213
206
|
),
|
214
207
|
)
|
215
|
-
|
216
|
-
|
217
|
-
def test_constraint():
|
218
|
-
pep_builder = pep.PEPBuilder()
|
219
|
-
with pep_builder.make_context("test") as ctx:
|
220
|
-
s1 = scalar.Scalar(is_basis=True, tags=["s1"])
|
221
|
-
s2 = scalar.Scalar(is_basis=True, tags=["s2"])
|
222
|
-
s3 = 2 * s1 + s2 / 4 + 5
|
223
|
-
|
224
|
-
c1 = s3.le(5, name="c1")
|
225
|
-
c2 = s3.lt(5, name="c2")
|
226
|
-
c3 = s3.ge(5, name="c3")
|
227
|
-
c4 = s3.gt(5, name="c4")
|
228
|
-
c5 = s3.eq(5, name="c5")
|
229
|
-
|
230
|
-
pm = exm.ExpressionManager(ctx)
|
231
|
-
|
232
|
-
np.testing.assert_allclose(pm.eval_scalar(c1.scalar).vector, np.array([2, 0.25]))
|
233
|
-
np.testing.assert_allclose(pm.eval_scalar(c1.scalar).constant, 0)
|
234
|
-
assert c1.comparator == utils.Comparator.LT
|
235
|
-
|
236
|
-
np.testing.assert_allclose(pm.eval_scalar(c2.scalar).vector, np.array([2, 0.25]))
|
237
|
-
np.testing.assert_allclose(pm.eval_scalar(c2.scalar).constant, 0)
|
238
|
-
assert c2.comparator == utils.Comparator.LT
|
239
|
-
|
240
|
-
np.testing.assert_allclose(pm.eval_scalar(c3.scalar).vector, np.array([2, 0.25]))
|
241
|
-
np.testing.assert_allclose(pm.eval_scalar(c3.scalar).constant, 0)
|
242
|
-
assert c3.comparator == utils.Comparator.GT
|
243
|
-
|
244
|
-
np.testing.assert_allclose(pm.eval_scalar(c4.scalar).vector, np.array([2, 0.25]))
|
245
|
-
np.testing.assert_allclose(pm.eval_scalar(c4.scalar).constant, 0)
|
246
|
-
assert c4.comparator == utils.Comparator.GT
|
247
|
-
|
248
|
-
np.testing.assert_allclose(pm.eval_scalar(c5.scalar).vector, np.array([2, 0.25]))
|
249
|
-
np.testing.assert_allclose(pm.eval_scalar(c5.scalar).constant, 0)
|
250
|
-
assert c5.comparator == utils.Comparator.EQ
|