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/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.opt_conditions: dict[Function, list[Constraint]] = defaultdict(list)
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 add_opt_condition(self, function: Function, opt_condition: Constraint):
74
- self.opt_conditions[function].append(opt_condition)
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 scalar of given tag")
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.opt_conditions.clear()
89
+ self.stationary_triplets.clear()
90
90
 
91
91
  def tracked_point(self, func: Function) -> list[Point]:
92
92
  return natsort.natsorted(
@@ -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, scalar
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 test_scalar_tag():
127
- pep_builder = pep.PEPBuilder()
128
- with pep_builder.make_context("test"):
129
- s1 = scalar.Scalar(is_basis=True, eval_expression=None)
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 test_scalar_in_a_list():
155
- pep_builder = pep.PEPBuilder()
156
- with pep_builder.make_context("test"):
157
- s1 = scalar.Scalar(is_basis=True, eval_expression=None)
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
- np.testing.assert_allclose(pm.eval_point(p1).vector, np.array([1, 0]))
172
- np.testing.assert_allclose(pm.eval_point(p2).vector, np.array([0, 1]))
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
- p3 = point.Point(is_basis=True, eval_expression=None, tags=["p3"]) # noqa: F841
175
- pm = exm.ExpressionManager(ctx)
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 test_expression_manager_on_basis_scalar():
182
- pep_builder = pep.PEPBuilder()
183
- with pep_builder.make_context("test") as ctx:
184
- s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
185
- s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
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
- np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0, 0]))
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
- pep_builder = pep.PEPBuilder()
213
- with pep_builder.make_context("test") as ctx:
214
- all_basis = [point.Point(is_basis=True, tags=[f"p_{i}"]) for i in range(100)]
215
- p = all_basis[0]
216
- for i in range(len(all_basis)):
217
- for j in range(i + 1, len(all_basis)):
218
- p += all_basis[i] * 2 + all_basis[j]
219
- pm = exm.ExpressionManager(ctx)
220
- t = time.time()
221
- for pp in ctx.points:
222
- pm.eval_point(pp)
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 point, scalar, utils
27
+ from pepflow import pep_context as pc
28
+ from pepflow import point, scalar
26
29
 
27
30
 
28
- def test_scalar_add_tag():
29
- pep_builder = pep.PEPBuilder()
30
- with pep_builder.make_context("test"):
31
- s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
32
- s2 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s2"])
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
- s_add = s1 + 0.1
38
- assert s_add.tag == "s1+0.1"
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
- s_radd = 0.1 + s1
41
- assert s_radd.tag == "0.1+s1"
43
+ s_add = s1 + s2
44
+ assert s_add.tag == "s1+s2"
42
45
 
43
- s_sub = s1 - s2
44
- assert s_sub.tag == "s1-s2"
46
+ s_add = s1 + 0.1
47
+ assert s_add.tag == "s1+0.1"
45
48
 
46
- s_sub = s1 - (s2 + s1)
47
- assert s_sub.tag == "s1-(s2+s1)"
49
+ s_radd = 0.1 + s1
50
+ assert s_radd.tag == "0.1+s1"
48
51
 
49
- s_sub = s1 - (s2 - s1)
50
- assert s_sub.tag == "s1-(s2-s1)"
52
+ s_sub = s1 - s2
53
+ assert s_sub.tag == "s1-s2"
51
54
 
52
- s_sub = s1 - 0.1
53
- assert s_sub.tag == "s1-0.1"
55
+ s_sub = s1 - (s2 + s1)
56
+ assert s_sub.tag == "s1-(s2+s1)"
54
57
 
55
- s_rsub = 0.1 - s1
56
- assert s_rsub.tag == "0.1-s1"
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
- def test_scalar_mul_tag():
60
- pep_builder = pep.PEPBuilder()
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
- s_rmul = 0.1 * s
68
- assert s_rmul.tag == "0.1*s"
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
- s_neg = -s
71
- assert s_neg.tag == "-s"
71
+ s_mul = s * 0.1
72
+ assert s_mul.tag == "s*0.1"
72
73
 
73
- s_truediv = s / 0.1
74
- assert s_truediv.tag == "1/0.1*s"
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
- def test_scalar_add_and_mul_tag():
78
- pep_builder = pep.PEPBuilder()
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
- s_add_mul = s1 + s2 * 0.1
87
- assert s_add_mul.tag == "s1+s2*0.1"
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
- s_neg_add = -(s1 + s2)
90
- assert s_neg_add.tag == "-(s1+s2)"
88
+ s_add_mul = (s1 + s2) * 0.1
89
+ assert s_add_mul.tag == "(s1+s2)*0.1"
91
90
 
92
- s_rmul_add = 0.1 * (s1 + s2)
93
- assert s_rmul_add.tag == "0.1*(s1+s2)"
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
- def test_scalar_hash_different():
97
- pep_builder = pep.PEPBuilder()
98
- with pep_builder.make_context("test"):
99
- s1 = scalar.Scalar(is_basis=True, eval_expression=None)
100
- s2 = scalar.Scalar(is_basis=True, eval_expression=None)
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
- pep_builder = pep.PEPBuilder()
106
- with pep_builder.make_context("test"):
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
- pep_builder = pep.PEPBuilder()
115
- with pep_builder.make_context("test"):
116
- s1 = scalar.Scalar(is_basis=True, tags=["s1"])
117
- print(s1) # it should be fine without tag
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
- pep_builder = pep.PEPBuilder()
124
- with pep_builder.make_context("test"):
125
- s1 = scalar.Scalar(is_basis=True, eval_expression=None)
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
- pep_builder = pep.PEPBuilder()
134
- with pep_builder.make_context("test") as ctx:
135
- s1 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s1"])
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
- np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0]))
140
- np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1]))
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
- s3 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s3"]) # noqa: F841
143
- pm = exm.ExpressionManager(ctx)
137
+ s3 = scalar.Scalar(is_basis=True, eval_expression=None, tags=["s3"]) # noqa: F841
138
+ pm = exm.ExpressionManager(pep_context)
144
139
 
145
- np.testing.assert_allclose(pm.eval_scalar(s1).vector, np.array([1, 0, 0]))
146
- np.testing.assert_allclose(pm.eval_scalar(s2).vector, np.array([0, 1, 0]))
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
- pep_builder = pep.PEPBuilder()
151
- with pep_builder.make_context("test") as ctx:
152
- s1 = scalar.Scalar(is_basis=True, tags=["s1"])
153
- s2 = scalar.Scalar(is_basis=True, tags=["s2"])
154
- s3 = 2 * s1 + s2 / 4 + 5
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
- p1 = point.Point(is_basis=True, tags=["p1"])
159
- p2 = point.Point(is_basis=True, tags=["p2"])
160
- s6 = p1 * p2
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
- p3 = point.Point(is_basis=True, tags=["p3"])
163
- p4 = point.Point(is_basis=True, tags=["p4"])
164
- s7 = 5 * p3 * p4
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
- s8 = s6 + s7
159
+ s8 = s6 + s7
167
160
 
168
- pm = exm.ExpressionManager(ctx)
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