codac 2.0.0.dev23__cp314-cp314-win32.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.
Files changed (76) hide show
  1. codac/__init__.py +4 -0
  2. codac/_core.cp314-win32.pyd +0 -0
  3. codac/_graphics.cp314-win32.pyd +0 -0
  4. codac/_unsupported.cp314-win32.pyd +0 -0
  5. codac/core/__init__.py +588 -0
  6. codac/graphics/__init__.py +1 -0
  7. codac/tests/__init__.py +1 -0
  8. codac/tests/codac2_tests_predefined_tubes.py +193 -0
  9. codac/tests/test_AnalyticFunction.py +442 -0
  10. codac/tests/test_AnalyticTraj.py +62 -0
  11. codac/tests/test_Approx.py +27 -0
  12. codac/tests/test_BoolInterval.py +96 -0
  13. codac/tests/test_Color.py +77 -0
  14. codac/tests/test_ConvexPolygon.py +300 -0
  15. codac/tests/test_CtcAction.py +30 -0
  16. codac/tests/test_CtcCartProd.py +39 -0
  17. codac/tests/test_CtcCtcBoundary.py +48 -0
  18. codac/tests/test_CtcDeriv.py +434 -0
  19. codac/tests/test_CtcEval.py +214 -0
  20. codac/tests/test_CtcFixpoint.py +65 -0
  21. codac/tests/test_CtcInter.py +39 -0
  22. codac/tests/test_CtcInverse.py +213 -0
  23. codac/tests/test_CtcInverseNotIn.py +129 -0
  24. codac/tests/test_CtcLazy.py +50 -0
  25. codac/tests/test_CtcPolygon.py +91 -0
  26. codac/tests/test_CtcSegment.py +104 -0
  27. codac/tests/test_Ellipsoid.py +20 -0
  28. codac/tests/test_GaussJordan.py +34 -0
  29. codac/tests/test_IntFullPivLU.py +84 -0
  30. codac/tests/test_Interval.py +254 -0
  31. codac/tests/test_IntervalMatrix.py +664 -0
  32. codac/tests/test_IntervalVector.py +657 -0
  33. codac/tests/test_Interval_operations.py +293 -0
  34. codac/tests/test_Matrix.py +81 -0
  35. codac/tests/test_OctaSym.py +41 -0
  36. codac/tests/test_Parallelepiped.py +34 -0
  37. codac/tests/test_Parallelepiped_eval.py +62 -0
  38. codac/tests/test_Polygon.py +120 -0
  39. codac/tests/test_SampledTraj.py +135 -0
  40. codac/tests/test_Segment.py +138 -0
  41. codac/tests/test_SepCartProd.py +34 -0
  42. codac/tests/test_SepCtcBoundary.py +52 -0
  43. codac/tests/test_SepInverse.py +104 -0
  44. codac/tests/test_SepPolygon.py +102 -0
  45. codac/tests/test_SepProj.py +39 -0
  46. codac/tests/test_SepTransform.py +41 -0
  47. codac/tests/test_Slice.py +78 -0
  48. codac/tests/test_Slice_polygon.py +208 -0
  49. codac/tests/test_SlicedTube.py +562 -0
  50. codac/tests/test_SlicedTube_integral.py +380 -0
  51. codac/tests/test_TDomain.py +115 -0
  52. codac/tests/test_Vector.py +41 -0
  53. codac/tests/test_arithmetic_add.py +54 -0
  54. codac/tests/test_arithmetic_div.py +46 -0
  55. codac/tests/test_arithmetic_mul.py +114 -0
  56. codac/tests/test_arithmetic_sub.py +54 -0
  57. codac/tests/test_capd.py +19 -0
  58. codac/tests/test_cart_prod.py +37 -0
  59. codac/tests/test_eigen.py +19 -0
  60. codac/tests/test_geometry.py +136 -0
  61. codac/tests/test_hull.py +35 -0
  62. codac/tests/test_ibex.py +19 -0
  63. codac/tests/test_inversion.py +57 -0
  64. codac/tests/test_linear_ctc.py +77 -0
  65. codac/tests/test_operators.py +377 -0
  66. codac/tests/test_peibos.py +83 -0
  67. codac/tests/test_predefined_tubes.py +193 -0
  68. codac/tests/test_serialization.py +30 -0
  69. codac/tests/test_transformations.py +61 -0
  70. codac/tests/test_trunc.py +95 -0
  71. codac/unsupported/__init__.py +1 -0
  72. codac/version.py +1 -0
  73. codac-2.0.0.dev23.dist-info/METADATA +23 -0
  74. codac-2.0.0.dev23.dist-info/RECORD +76 -0
  75. codac-2.0.0.dev23.dist-info/WHEEL +5 -0
  76. codac-2.0.0.dev23.dist-info/top_level.txt +1 -0
@@ -0,0 +1,193 @@
1
+ from codac import *
2
+
3
+ def tube_test_1():
4
+
5
+ x = SlicedTube(create_tdomain([0.,46.], 1., False), Interval())
6
+ x.set_ith_slice([4,8], 0)
7
+ x.set_ith_slice([2,7], 1)
8
+ x.set_ith_slice([1,6], 2)
9
+ x.set_ith_slice([-4,4], 3)
10
+ x.set_ith_slice([-7,-1], 4)
11
+ x.set_ith_slice([-9,-5], 5)
12
+ x.set_ith_slice([-10,-6], 6)
13
+ x.set_ith_slice([-11,-7], 7)
14
+ x.set_ith_slice([-10,-6], 8)
15
+ x.set_ith_slice([-9,-4], 9)
16
+ x.set_ith_slice([-8,-5], 10)
17
+ x.set_ith_slice([-7,-4], 11)
18
+ x.set_ith_slice([-6,-2], 12)
19
+ x.set_ith_slice([-5,-1], 13)
20
+ x.set_ith_slice([-5,3], 14) # to be updated
21
+ x.set_ith_slice([-2,4], 15)
22
+ x.set_ith_slice([0,6], 16)
23
+ x.set_ith_slice([2,7], 17)
24
+ x.set_ith_slice([4,8], 18)
25
+ x.set_ith_slice([6,9], 19)
26
+ x.set_ith_slice([7,10], 20)
27
+ x.set_ith_slice([8,11], 21)
28
+ x.set_ith_slice([9,12], 22)
29
+ x.set_ith_slice([8,13], 23)
30
+ x.set_ith_slice([7,12], 24)
31
+ x.set_ith_slice([5,11], 25)
32
+ x.set_ith_slice([3,10], 26)
33
+ x.set_ith_slice([4,9], 27)
34
+ x.set_ith_slice([5,8], 28)
35
+ x.set_ith_slice([4,7], 29)
36
+ x.set_ith_slice([3,6], 30)
37
+ x.set_ith_slice([3,5], 31)
38
+ x.set_ith_slice([2,5], 32)
39
+ x.set_ith_slice([2,5], 33)
40
+ x.set_ith_slice([1,5], 34)
41
+ x.set_ith_slice([2,4], 35)
42
+ x.set_ith_slice([1,4], 36)
43
+ x.set_ith_slice([0,4], 37)
44
+ x.set_ith_slice([-1,3], 38)
45
+ x.set_ith_slice([-1,3], 39)
46
+ x.set_ith_slice([-1,4], 40)
47
+ x.set_ith_slice([0,5], 41)
48
+ x.set_ith_slice([1,6], 42)
49
+ x.set_ith_slice([0,5], 43)
50
+ x.set_ith_slice([-1,4], 44)
51
+ x.set_ith_slice([-1,3], 45)
52
+ return x
53
+
54
+ def tube_test_1_01():
55
+
56
+ x = SlicedTube(create_tdomain([0.,46.], 0.5, False), Interval())
57
+
58
+ x.set([4,8], [0,1])
59
+ x.set([2,7], [1,2])
60
+ x.set([1,6], [2,3])
61
+ x.set([-4,4], [3,4])
62
+ x.set([-7,-1], [4,5])
63
+ x.set([-9,-5], [5,6])
64
+ x.set([-10,-6], [6,7])
65
+ x.set([-11,-7], [7,8])
66
+ x.set([-10,-6], [8,9])
67
+ x.set([-9,-4], [9,10])
68
+ x.set([-8,-5], [10,11])
69
+ x.set([-7,-4], [11,12])
70
+ x.set([-6,-2], [12,13])
71
+ x.set([-5,-1], [13,14])
72
+ x.set([-4,2], [14,15])
73
+ x.set([-2,4], [15,16])
74
+ x.set([0,6], [16,17])
75
+ x.set([2,7], [17,18])
76
+ x.set([4,8], [18,19])
77
+ x.set([6,9], [19,20])
78
+ x.set([7,10], [20,21])
79
+ x.set([8,11], [21,22])
80
+ x.set([9,12], [22,23])
81
+ x.set([8,13], [23,24])
82
+ x.set([7,12], [24,25])
83
+ x.set([5,11], [25,26])
84
+ x.set([3,10], [26,27])
85
+ x.set([4,9], [27,28])
86
+ x.set([5,8], [28,29])
87
+ x.set([4,7], [29,30])
88
+ x.set([3,6], [30,31])
89
+ x.set([3,5], [31,32])
90
+ x.set([2,5], [32,33])
91
+ x.set([2,5], [33,34])
92
+ x.set([1,5], [34,35])
93
+ x.set([2,4], [35,36])
94
+ x.set([1,4], [36,37])
95
+ x.set([0,4], [37,38])
96
+ x.set([-1,3], [38,39])
97
+ x.set([-1,3], [39,40])
98
+ x.set([-1,4], [40,41])
99
+ x.set([0,5], [41,42])
100
+ x.set([1,6], [42,43])
101
+ x.set([0,5], [43,44])
102
+ x.set([-1,4], [44,45])
103
+ x.set([-1,3], [45,46])
104
+ return x
105
+
106
+ def tube_test2():
107
+
108
+ x = SlicedTube(create_tdomain([0.,46.], 1., False), Interval())
109
+
110
+ x.set_ith_slice([-2,0], 0)
111
+ x.set_ith_slice([-3,1], 1)
112
+ x.set_ith_slice([-1,3], 2)
113
+ x.set_ith_slice([2,4], 3)
114
+ x.set_ith_slice([3,5], 4)
115
+ x.set_ith_slice([2,6], 5)
116
+ x.set_ith_slice([2,5], 6)
117
+ x.set_ith_slice([1,4], 7)
118
+ x.set_ith_slice([1,3], 8)
119
+ x.set_ith_slice([2,3], 9)
120
+ x.set_ith_slice([2,4], 10)
121
+ x.set_ith_slice([1,3], 11)
122
+ x.set_ith_slice([0,2], 12)
123
+ x.set_ith_slice([-1,2], 13)
124
+ x.set_ith_slice([-2,1], 14)
125
+ x.set_ith_slice([-3,0], 15)
126
+ x.set_ith_slice([-2,0], 16)
127
+ x.set_ith_slice([-1,1], 17)
128
+ x.set_ith_slice([0,2], 18)
129
+ x.set_ith_slice([1,3], 19)
130
+ x.set_ith_slice([1,4], 20)
131
+ x.set_ith_slice([2,5], 21)
132
+ x.set_ith_slice([2,4], 22)
133
+ x.set_ith_slice([1,3], 23)
134
+ x.set_ith_slice([0,2], 24)
135
+ x.set_ith_slice([0,2], 25)
136
+ x.set_ith_slice([0,2], 26)
137
+ x.set_ith_slice([1,2], 27)
138
+ x.set_ith_slice([1,3], 28)
139
+ x.set_ith_slice([0,3], 29)
140
+ x.set_ith_slice([-1,2], 30)
141
+ x.set_ith_slice([-2,1], 31)
142
+ x.set_ith_slice([-3,0], 32)
143
+ x.set_ith_slice([-4,-1], 33)
144
+ x.set_ith_slice([-4,-2], 34)
145
+ x.set_ith_slice([-3,-1], 35)
146
+ x.set_ith_slice([-4,-2], 36)
147
+ x.set_ith_slice([-4,-2], 37)
148
+ x.set_ith_slice([-4,-2], 38)
149
+ x.set_ith_slice([-3,-1], 39)
150
+ x.set_ith_slice([-3,-1], 40)
151
+ x.set_ith_slice([-2,-1], 41)
152
+ x.set_ith_slice([-1,1], 42)
153
+ x.set_ith_slice([-1,1], 43)
154
+ x.set_ith_slice([0,2], 44)
155
+ x.set_ith_slice([1,3], 45)
156
+ return x
157
+
158
+ def tube_test3():
159
+
160
+ x = SlicedTube(create_tdomain([0.,5.], 1., False), Interval())
161
+
162
+ x.set_ith_slice([1,3], 0)
163
+ x.set_ith_slice([0,2], 1)
164
+ x.set_ith_slice([-1,1], 2)
165
+ x.set_ith_slice([-2,0], 3)
166
+ x.set_ith_slice([-3,-1], 4)
167
+ return x
168
+
169
+ def tube_test4():
170
+
171
+ x = SlicedTube(create_tdomain([0.,21.], 1., False), Interval())
172
+
173
+ x.set([1,2], [0,9])
174
+ x.set([0.5,1.5], [9,11])
175
+ x.set([-1,1], [10.2]) # degenerate time interval
176
+ x.set([-1.5,-0.5], [11,12])
177
+ x.set([-1,1], [12,13])
178
+ x.set([0.5,1.5], [13,14])
179
+ x.set([1,2], [14,21])
180
+ return x
181
+
182
+ def tube_test4_05():
183
+
184
+ x = SlicedTube(create_tdomain([0.,21.], 0.5, False), Interval())
185
+
186
+ x.set([1,2], [0,9])
187
+ x.set([0.5,1.5], [9,10])
188
+ x.set([-1,1], [10,11])
189
+ x.set([-1.5,-0.5], [11,12])
190
+ x.set([-1,1], [12,13])
191
+ x.set([0.5,1.5], [13,14])
192
+ x.set([1,2], [14,21])
193
+ return x
@@ -0,0 +1,442 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Codac tests
4
+ # ----------------------------------------------------------------------------
5
+ # \date 2024
6
+ # \author Simon Rohou, Damien Massé
7
+ # \copyright Copyright 2024 Codac Team
8
+ # \license GNU Lesser General Public License (LGPL)
9
+
10
+ import sys, os
11
+ import unittest
12
+ import math
13
+ from codac import *
14
+
15
+ def create_f():
16
+ x = ScalarVar()
17
+ return AnalyticFunction([x], x*cos(x))
18
+
19
+ class TestAnalyticFunction(unittest.TestCase):
20
+
21
+ def test_AnalyticFunction(self):
22
+
23
+ def invalid_function():
24
+ x = ScalarVar()
25
+ f = AnalyticFunction([3], cos(x))
26
+
27
+ self.assertRaises(ValueError, invalid_function)
28
+
29
+ x = ScalarVar()
30
+ self.assertTrue(x.size() == 1)
31
+
32
+ y = VectorVar(3)
33
+ self.assertTrue(y.size() == 3)
34
+ self.assertTrue(type(y[0]) == ScalarExpr)
35
+ self.assertTrue(type(y[2]) == ScalarExpr)
36
+
37
+ for i in range(0,2):
38
+
39
+ def test_eval(i,f,*args):
40
+
41
+ if(i == 0): # natural
42
+ return f.eval(EvalMode.NATURAL,*args)
43
+
44
+ elif(i == 1): # centered
45
+ return f.eval(EvalMode.CENTERED,*args)
46
+
47
+ else: # centered and natural
48
+ return f.eval(*args)
49
+
50
+ f = AnalyticFunction([x], x)
51
+ self.assertTrue(Approx(test_eval(i,f,Interval(0))) == 0)
52
+ f = AnalyticFunction([x], x+Interval(2))
53
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 5)
54
+ f = AnalyticFunction([x], x+x)
55
+ self.assertTrue(Approx(test_eval(i,f,Interval(2))) == 4)
56
+ f = AnalyticFunction([x], x+x+2)
57
+ self.assertTrue(Approx(test_eval(i,f,Interval(2))) == 6)
58
+ f = AnalyticFunction([x], pow(x,2))
59
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 9)
60
+ f = AnalyticFunction([x], x^2)
61
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 9)
62
+ f = AnalyticFunction([x], (0.+x)^(1.*x))
63
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 27)
64
+ f = AnalyticFunction([x], x**2)
65
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 9)
66
+ f = AnalyticFunction([x], (0.+x)**(1.*x))
67
+ self.assertTrue(Approx(test_eval(i,f,Interval(3))) == 27)
68
+ f = AnalyticFunction([x], cos(x))
69
+ self.assertTrue(Approx(test_eval(i,f,Interval(0))) == 1)
70
+
71
+ f = AnalyticFunction([x], [x,x])
72
+
73
+ fvec = AnalyticFunction([x], [x,x])
74
+ self.assertTrue(Approx(test_eval(i,f,1)) == IntervalVector([[1],[1]]))
75
+
76
+ self.assertTrue(test_eval(i,AnalyticFunction([], +4)) == 4)
77
+ self.assertTrue(test_eval(i,AnalyticFunction([], +4.)) == 4.)
78
+ self.assertTrue(test_eval(i,AnalyticFunction([], +Interval(4,5))) == Interval(4,5))
79
+ self.assertTrue(test_eval(i,AnalyticFunction([], Vector([2,9]))) == Vector([2,9]))
80
+ self.assertTrue(test_eval(i,AnalyticFunction([], IntervalVector(3))) == IntervalVector([[-oo,oo],[-oo,oo],[-oo,oo]]))
81
+
82
+ x1 = ScalarVar()
83
+ x2 = ScalarVar()
84
+ v1 = VectorVar(2)
85
+ v2 = VectorVar(2)
86
+
87
+ # ======> ScalarVar
88
+
89
+ # .def("__pos__", [](const ScalarVar& e1)
90
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], +x1), 5.) == 5.)
91
+ # .def("__add__", [](const ScalarVar& e1, const ScalarVar& e2)
92
+ self.assertTrue(test_eval(i,AnalyticFunction([x1,x2], x1+x2), 5.,6.) == 11.)
93
+ # .def("__add__", [](const ScalarVar& e1, const Interval& e2)
94
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], x1+Interval(3)), 5.) == 8.)
95
+ # .def("__radd__", [](const ScalarVar& e1, const Interval& e2)
96
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], Interval(3)+x1), 5.) == 8.)
97
+ # .def("__neg__", [](const ScalarVar& e1)
98
+ self.assertTrue(test_eval(i,AnalyticFunction([x2], -x2), 6.) == -6.)
99
+ # .def("__sub__", [](const ScalarVar& e1, const ScalarVar& e2)
100
+ self.assertTrue(test_eval(i,AnalyticFunction([x1,x2], x1-x2), 5.,6.) == -1.)
101
+ # .def("__sub__", [](const ScalarVar& e1, const Interval& e2)
102
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], x1-Interval(2.)), 5.) == 3.)
103
+ # .def("__rsub__", [](const ScalarVar& e1, const Interval& e2)
104
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], Interval(2.)-x1), 5.) == -3.)
105
+ # .def("__mul__", [](const ScalarVar& e1, const ScalarVar& e2)
106
+ self.assertTrue(test_eval(i,AnalyticFunction([x1,x2], x1*x2), 5.,6.) == 30.)
107
+ # .def("__mul__", [](const ScalarVar& e1, const Interval& e2)
108
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], x1*Interval(6.)), 5.) == 30.)
109
+ # .def("__rmul__", [](const ScalarVar& e1, const Interval& e2)
110
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], Interval(6.)*x1), 5.) == 30.)
111
+ # .def("__mul__", [](const ScalarVar& e1, const VectorVar& e2)
112
+ self.assertTrue(test_eval(i,AnalyticFunction([v1,v2], v1[0]*v2), Vector([5.,10.]),IntervalVector([[3],[3]])) == Vector([15,15]))
113
+ # .def("__mul__", [](const ScalarVar& e1, const IntervalVector& e2)
114
+ self.assertTrue(test_eval(i,AnalyticFunction([x1], x1*IntervalVector([[-2,3],[0,1]])), 5.) == IntervalVector([[-10,15],[0,5]]))
115
+ # .def("__truediv__", [](const ScalarVar& e1, const ScalarVar& e2)
116
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1,x2], x1/x2), 1.,10.)) == 0.1)
117
+ # .def("__truediv__", [](const ScalarVar& e1, const Interval& e2)
118
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1/Interval(10)), 1.)) == 0.1)
119
+ # .def("__rtruediv__", [](const ScalarVar& e1, const Interval& e2)
120
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], Interval(2.)/x1), 10.)) == 0.2)
121
+
122
+ # ======> VectorVar
123
+
124
+ #.def("__pos__", [](const VectorVar& e1)
125
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], +v1), Vector([5.,6.])) == Vector([5.,6.]))
126
+ #.def("__add__", [](const VectorVar& e1, const VectorVar& e2)
127
+ self.assertTrue(test_eval(i,AnalyticFunction([v1,v2], v1+v2), Vector([5.,6.]),Vector([2.,3.])) == Vector([7.,9.]))
128
+ #.def("__add__", [](const VectorVar& e1, const IntervalVector& e2)
129
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], v1+IntervalVector([[2],[3]])), Vector([5.,6.])) == IntervalVector([[7.],[9.]]))
130
+ #.def("__radd__", [](const VectorVar& e1, const IntervalVector& e2)
131
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], IntervalVector([[2],[3]])+v1), Vector([5.,6.])) == IntervalVector([[7.],[9.]]))
132
+ #.def("__neg__", [](const VectorVar& e1)
133
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], -v1), Vector([5.,6.])) == -Vector([5.,6.]))
134
+ #.def("__sub__", [](const VectorVar& e1, const VectorVar& e2)
135
+ self.assertTrue(test_eval(i,AnalyticFunction([v1,v2], v1-v2), Vector([5.,6.]),Vector([2.,3.])) == Vector([3.,3.]))
136
+ #.def("__sub__", [](const VectorVar& e1, const IntervalVector& e2)
137
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], v1-IntervalVector([[2],[3]])), Vector([5.,6.])) == IntervalVector([[3.],[3.]]))
138
+ #.def("__rsub__", [](const VectorVar& e1, const IntervalVector& e2)
139
+ self.assertTrue(test_eval(i,AnalyticFunction([v1], IntervalVector([[2],[3]])-v1), Vector([5.,6.])) == IntervalVector([[-3.],[-3.]]))
140
+
141
+ # ======> ScalarExpr
142
+
143
+ #.def("__pos__", [](const ScalarExpr& e1)
144
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], +cos(x1)), Interval(0.))) == Interval(1.))
145
+ #.def(py::self + py::self)
146
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)+cos(x1)), Interval(0.))) == Interval(2.))
147
+ #.def("__add__", [](const ScalarExpr& e1, const ScalarVar& e2)
148
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)+x1), math.pi)) == math.pi-1)
149
+ #.def("__radd__", [](const ScalarExpr& e1, const ScalarVar& e2)
150
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1+cos(x1)), math.pi)) == math.pi-1)
151
+ #.def("__add__", [](const ScalarExpr& e1, const Interval& e2)
152
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)+Interval(10.)), math.pi)) == Interval(9))
153
+ #.def("__radd__", [](const ScalarExpr& e1, const Interval& e2)
154
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], 10+cos(x1)), math.pi)) == Interval(9))
155
+ #.def(- py::self)
156
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], -cos(x1)), Interval(0.))) == Interval(-1.))
157
+ #.def(py::self - py::self)
158
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)-cos(x1)), Interval(0.))) == Interval(0.))
159
+ #.def("__sub__", [](const ScalarExpr& e1, const ScalarVar& e2)
160
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)-x1), math.pi)) == -math.pi-1)
161
+ #.def("__rsub__", [](const ScalarExpr& e1, const ScalarVar& e2)
162
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1-cos(x1)), math.pi)) == math.pi+1)
163
+ #.def("__sub__", [](const ScalarExpr& e1, const Interval& e2)
164
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)-Interval(10.)), math.pi)) == -Interval(11))
165
+ #.def("__rsub__", [](const ScalarExpr& e1, const Interval& e2)
166
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], 10-cos(x1)), math.pi)) == Interval(11))
167
+ #.def(py::self * py::self)
168
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)*cos(x1)), Interval(0.))) == Interval(1.))
169
+ #.def("__mul__", [](const ScalarExpr& e1, const ScalarVar& e2)
170
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)*x1), math.pi)) == -1*math.pi)
171
+ #.def("__rmul__", [](const ScalarExpr& e1, const ScalarVar& e2)
172
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1*cos(x1)), math.pi)) == -1*math.pi)
173
+ #.def("__mul__", [](const ScalarExpr& e1, const Interval& e2)
174
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)*Interval(10.)), math.pi),1e-9) == -Interval(10))
175
+ #.def("__rmul__", [](const ScalarExpr& e1, const Interval& e2)
176
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], Interval(10.)*cos(x1)), math.pi),1e-9) == -10)
177
+ #.def("__mul__", [](const ScalarExpr& e1, const VectorExpr& e2)
178
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], cos(v1[0])*(v2+v2)), Vector([math.pi,-1]),Vector([2,3])),1e-9) == IntervalVector([[-4],[-6]]))
179
+ #.def("__truediv__", [](const ScalarExpr& e1, const ScalarExpr& e2)
180
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)/cos(x1)), Interval(0.))) == Interval(1.))
181
+ #.def("__truediv__", [](const ScalarExpr& e1, const ScalarVar& e2)
182
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)/x1), math.pi)) == -1/math.pi)
183
+ #.def("__rtruediv__", [](const ScalarExpr& e1, const ScalarVar& e2)
184
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1/cos(x1)), math.pi)) == -math.pi)
185
+ #.def("__truediv__", [](const ScalarExpr& e1, const Interval& e2)
186
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], cos(x1)/Interval(4.)), math.pi)) == -1./4)
187
+ #.def("__rtruediv__", [](const ScalarExpr& e1, const Interval& e2)
188
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], 4./cos(x1)), math.pi)) == -4)
189
+
190
+ # ======> VectorExpr
191
+
192
+ #.def("__pos__", [](const VectorExpr& e1)
193
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1], +(v1+v1)), IntervalVector([[0.],[-oo,5]]))) ==
194
+ IntervalVector([[0.],[-oo,oo]]) if i==1 else IntervalVector([[0.],[-oo,10]]))
195
+ #.def(py::self + py::self)
196
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1], v1+v1), IntervalVector([[0.],[-oo,5]]))) ==
197
+ IntervalVector([[0.],[-oo,oo]]) if i==1 else IntervalVector([[0.],[-oo,10]]))
198
+ #.def("__radd__", [](const VectorExpr& e1, const VectorVar& e2)
199
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1], (v1+v1)+v1), IntervalVector([[0.],[-oo,5]]))) ==
200
+ IntervalVector([[0.],[-oo,oo]]) if i==1 else IntervalVector([[0.],[-oo,15]]))
201
+ #.def("__radd__", [](const VectorExpr& e1, const IntervalVector& e2)
202
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1], v1+(v1+v1)), IntervalVector([[0.],[-oo,5]]))) ==
203
+ IntervalVector([[0.],[-oo,oo]]) if i==1 else IntervalVector([[0.],[-oo,15]]))
204
+ #.def(- py::self)
205
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1], -(v1+v1)), IntervalVector([[0.],[-oo,5]]))) ==
206
+ -IntervalVector([[0.],[-oo,oo]]) if i==1 else -IntervalVector([[0.],[-oo,10]]))
207
+ #.def(py::self - py::self)
208
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], (v1-v2)), IntervalVector([[2],[3]]),Vector([1,5]))) == IntervalVector([[1],[-2]]))
209
+ #.def("__sub__", [](const VectorExpr& e1, const VectorVar& e2)
210
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], (v1-v2)-v1), IntervalVector([[2],[3]]),Vector([1,5]))) == IntervalVector([[-1],[-5]]))
211
+ #.def("__rsub__", [](const VectorExpr& e1, const VectorVar& e2)
212
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], v2-(v1-v2)), IntervalVector([[2],[3]]),Vector([1,5]))) == IntervalVector([[0],[7]]))
213
+ #.def("__sub__", [](const VectorExpr& e1, const IntervalVector& e2)
214
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], (v1-v2)-IntervalVector([[2],[3]])), IntervalVector([[2],[3]]),Vector([1,5]))) == IntervalVector([[-1],[-5]]))
215
+ #.def("__rsub__", [](const VectorExpr& e1, const IntervalVector& e2)
216
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], Vector([1,5])-(v1-v2)), IntervalVector([[2],[3]]),Vector([1,5]))) == IntervalVector([[0],[7]]))
217
+ #.def("__rmul__", [](const VectorExpr& e1, const ScalarExpr& e2)
218
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([v1,v2], cos(v1[0])*(v2+v2)), Vector([math.pi,-1]),Vector([2,3])),1e-9) == IntervalVector([[-4],[-6]]))
219
+ #.def("__rmul__", [](const VectorExpr& e1, const ScalarVar& e2)
220
+ self.assertTrue(Approx(test_eval(i,AnalyticFunction([x1], x1*vec(3*x1,2*x1)), 3),1e-9) == IntervalVector([[27],[18]]))
221
+
222
+ x = VectorVar(2)
223
+ f = AnalyticFunction([x], x[0]*(x[0]+x[1])+sqr(x[1]))
224
+ self.assertTrue(f.diff(Vector([2,3]))(0,0) == 7)
225
+ self.assertTrue(f.diff(Vector([2,3]))(0,1) == 8)
226
+
227
+ # int values
228
+ x,y = ScalarVar(), ScalarVar()
229
+ f = AnalyticFunction([x,y], x*(x+y)+sqr(y))
230
+ self.assertTrue(f.diff(2,3)(0,0) == 7)
231
+ self.assertTrue(f.diff(2,3)(0,1) == 8)
232
+
233
+ # double values
234
+ x,y = ScalarVar(), ScalarVar()
235
+ f = AnalyticFunction([x,y], x*(x+y)+sqr(y))
236
+ self.assertTrue(f.diff(2.,3.)(0,0) == 7)
237
+ self.assertTrue(f.diff(2.,3.)(0,1) == 8)
238
+
239
+ # Interval values
240
+ x,y = ScalarVar(), ScalarVar()
241
+ f = AnalyticFunction([x,y], x*(x+y)+sqr(y))
242
+ self.assertTrue(f.diff(Interval(2.),Interval(3.))(0,0) == 7)
243
+ self.assertTrue(f.diff(Interval(2.),Interval(3.))(0,1) == 8)
244
+
245
+ # Evaluation modes
246
+ x = ScalarVar()
247
+ f = AnalyticFunction([x], x-x)
248
+ self.assertTrue(f.eval(EvalMode.NATURAL,Interval(-1,1)) == Interval(-2,2))
249
+ self.assertTrue(f.eval(EvalMode.CENTERED,Interval(-1,1)) == Interval(0))
250
+ self.assertTrue(f.eval(Interval(-1,1)) == Interval(0))
251
+
252
+ # Scalar outputs
253
+ f1 = AnalyticFunction([], 3)
254
+ self.assertTrue(f1.eval() == Interval(3))
255
+ f2 = AnalyticFunction([], 3.)
256
+ self.assertTrue(f2.eval() == Interval(3))
257
+ f3 = AnalyticFunction([], Interval(3.))
258
+ self.assertTrue(f3.eval() == Interval(3))
259
+ x = ScalarVar()
260
+ f4 = AnalyticFunction([x], x*x)
261
+ self.assertTrue(f4.eval(2.) == Interval(4))
262
+
263
+ # Vectorial outputs
264
+
265
+ f1 = AnalyticFunction([], [ 3 ])
266
+ self.assertTrue(f1.eval() == IntervalVector([3]))
267
+ f2 = AnalyticFunction([], [ 3. ])
268
+ self.assertTrue(f2.eval() == IntervalVector([3]))
269
+ f3 = AnalyticFunction([], [ Interval(3.) ])
270
+ self.assertTrue(f3.eval() == IntervalVector([3]))
271
+ x = ScalarVar()
272
+ f4 = AnalyticFunction([x], [ x*x ])
273
+ self.assertTrue(f4.eval(2.) == IntervalVector([4]))
274
+
275
+ f_2args = AnalyticFunction([x], [ x*x,x*x ])
276
+ self.assertTrue(f_2args.eval(1.) == IntervalVector.constant(2,[1]))
277
+ f_3args = AnalyticFunction([x], [ x,x*x,1 ])
278
+ self.assertTrue(f_3args.eval(1.) == IntervalVector.constant(3,[1]))
279
+ f_4args = AnalyticFunction([x], [ x,x*x,1,x ])
280
+ self.assertTrue(f_4args.eval(1.) == IntervalVector.constant(4,[1]))
281
+ f_5args = AnalyticFunction([x], [ x,x*x,1,x,x ])
282
+ self.assertTrue(f_5args.eval(1.) == IntervalVector.constant(5,[1]))
283
+ f_6args = AnalyticFunction([x], [ x,x*x,1,x,x,1*x ])
284
+ self.assertTrue(f_6args.eval(1.) == IntervalVector.constant(6,[1]))
285
+ f_7args = AnalyticFunction([x], [ x,x*x,1,x,x,1*x,x*x ])
286
+ self.assertTrue(f_7args.eval(1.) == IntervalVector.constant(7,[1]))
287
+ f_8args = AnalyticFunction([x], [ x,x*x,1,x,x,1*x,x*x,1 ])
288
+ self.assertTrue(f_8args.eval(1.) == IntervalVector.constant(8,[1]))
289
+ f_9args = AnalyticFunction([x], [ x,x*x,1,x,x,1*x,x*x,1,x ])
290
+ self.assertTrue(f_9args.eval(1.) == IntervalVector.constant(9,[1]))
291
+ f_10args = AnalyticFunction([x], [ x,x*x,1,x,x,1*x,x*x,1,x,1*x ])
292
+ self.assertTrue(f_10args.eval(1.) == IntervalVector.constant(10,[1]))
293
+
294
+ # Subvector on variables
295
+ p = VectorVar(2)
296
+ x = VectorVar(4)
297
+ f = AnalyticFunction([p], p[0]*p[1])
298
+ g = AnalyticFunction([x], f(x.subvector(0,1)) + f(x.subvector(2,3)))
299
+
300
+ a = IntervalVector(4)
301
+
302
+ a = IntervalVector([[1],[2],[3],[4]])
303
+ self.assertTrue(g.eval(EvalMode.NATURAL,a) == 14)
304
+ self.assertTrue(g.eval(EvalMode.CENTERED,a) == 14)
305
+ self.assertTrue(g.eval(a) == 14)
306
+
307
+ a = IntervalVector([[0],[2],[5],[4]])
308
+ self.assertTrue(g.eval(EvalMode.NATURAL,a) == 20)
309
+ self.assertTrue(g.eval(EvalMode.CENTERED,a) == 20)
310
+ self.assertTrue(g.eval(a) == 20)
311
+
312
+
313
+ # Sign, floor, ceil, min, max
314
+ x1 = ScalarVar()
315
+ x2 = ScalarVar()
316
+
317
+ f = AnalyticFunction([x1,x2], 2*max(x1,x2+1))
318
+ self.assertTrue(f.eval(0.,1.) == 4.)
319
+ self.assertTrue(f.eval(2.,1.) == 4.)
320
+ self.assertTrue(f.eval(3.,1.) == 6.)
321
+
322
+ f = AnalyticFunction([x1,x2], 2*min(x1,x2+1))
323
+ self.assertTrue(f.eval(0.,1.) == 0.)
324
+ self.assertTrue(f.eval(2.,1.) == 4.)
325
+ self.assertTrue(f.eval(3.,1.) == 4.)
326
+
327
+ f = AnalyticFunction([x1], 2*sign(x1+1))
328
+ self.assertTrue(f.eval(0.) == 2.)
329
+ self.assertTrue(sign(Interval.zero()) == Interval(-1,1))
330
+ self.assertTrue(sign(Interval(-0,0)) == Interval(-1,1))
331
+ self.assertTrue(f.eval(-1.) == Interval(-2,2))
332
+ self.assertTrue(f.eval(-2.) == -2.)
333
+
334
+ f = AnalyticFunction([x1], 2*floor(x1))
335
+ self.assertTrue(f.eval(0.) == 0.)
336
+ self.assertTrue(f.eval(1.5) == 2.)
337
+ self.assertTrue(f.eval(-1.5) == -4.)
338
+
339
+ f = AnalyticFunction([x1], 2*ceil(x1))
340
+ self.assertTrue(f.eval(0.) == 0.)
341
+ self.assertTrue(f.eval(1.5) == 4.)
342
+ self.assertTrue(f.eval(-1.5) == -2.)
343
+
344
+
345
+ # Issue #201
346
+ # Input argument is a py::list instead of a Vector
347
+ x1 = VectorVar(2)
348
+ f = AnalyticFunction([x1], 2.*x1)
349
+ self.assertTrue(f.eval([2,3]) == IntervalVector([[4],[6]]))
350
+ self.assertTrue(f.eval([[2,3],[4,5]]) == IntervalVector([[4,6],[8,10]]))
351
+
352
+
353
+ I = Matrix([[0,2],[-1,0]])
354
+ x = VectorVar(2)
355
+ f = AnalyticFunction([x], I*x)
356
+ self.assertTrue(f.eval(IntervalVector([[0,1],[2,3]])) == IntervalVector([[4,6],[-1,0]]))
357
+
358
+ I = Matrix([[1,0],[0,1]])
359
+ x = VectorVar(2)
360
+ f = AnalyticFunction([x], I*I*x)
361
+ self.assertTrue(f.eval(IntervalVector([[-1,1],[2,3]])) == IntervalVector([[-1,1],[2,3]]))
362
+
363
+ A = MatrixVar(2,2)
364
+ x = VectorVar(2)
365
+ h = AnalyticFunction([A], A*A)
366
+ f = AnalyticFunction([x,A], h(A)*x)
367
+ g = AnalyticFunction([x], f(x,Matrix([[0,2],[-1,0]])))
368
+ self.assertTrue(g.eval(IntervalVector([[-1,1],[2,3]])) == IntervalVector([[-2,2],[-6,-4]]))
369
+
370
+ A = MatrixVar(2,2)
371
+ f_det = AnalyticFunction([A], A(0,0)*A(1,1)-A(1,0)*A(0,1))
372
+ self.assertTrue(f_det.eval(Matrix([[1,2],[3,4]])) == -2)
373
+ self.assertTrue(f_det.eval(IntervalMatrix([[[0,1],[1,2]],[[2,3],[3,4]]])) == Interval(-6,2))
374
+
375
+ f = create_f()
376
+ self.assertTrue(Approx(f.eval(PI)) == -PI)
377
+
378
+ x = ScalarVar()
379
+ f = AnalyticFunction([x],sqrt(x))
380
+ self.assertTrue(Interval(0.).is_subset([0,oo]))
381
+ self.assertTrue(Interval(0.,10.).is_subset([0,oo]))
382
+ self.assertTrue(Approx(f.eval(EvalMode.NATURAL, 0.)) == 0.)
383
+ self.assertTrue(Approx(f.eval(EvalMode.NATURAL, 1e-10),1e-3) == 0.)
384
+ # Cannot compute in pure centered form due to the
385
+ # definition domain of the derivative of sqrt:
386
+ self.assertTrue(f.eval(EvalMode.CENTERED, 0.).is_empty())
387
+ self.assertTrue(Approx(f.eval(EvalMode.CENTERED, 1e-10),1e-3) == 0.)
388
+ self.assertTrue(Approx(f.eval(0.)) == 0.)
389
+ self.assertTrue(Approx(f.eval(1e-10),1e-3) == 0.)
390
+
391
+ x1,x2,x3 = VectorVar(2),VectorVar(2),VectorVar(2)
392
+ f = AnalyticFunction([x1,x2,x3], mat(+x1,-x2,2*x3))
393
+ self.assertTrue(f.eval(EvalMode.NATURAL, Vector([1,2]),Vector([-1,8]),IntervalVector([[-1,1],[2,oo]]))
394
+ == IntervalMatrix([[1,1,[-2,2]],[2,-8,[4,oo]]]))
395
+
396
+ x1 = VectorVar(2)
397
+ f = AnalyticFunction([x1],det(mat(+x1,2*x1)))
398
+ self.assertTrue(Approx(f.eval(EvalMode.NATURAL, IntervalVector([[0.9,1.1],[0.4,0.5]])),1e-9) == Interval(-0.38,0.38))
399
+ self.assertTrue(Approx(f.eval(EvalMode.CENTERED, IntervalVector([[0.9,1.1],[0.4,0.5]])),1e-9) == Interval(-0.04,0.04))
400
+
401
+ M1 = MatrixVar(2,3)
402
+ M2 = MatrixVar(3,2)
403
+ f = AnalyticFunction([M1,M2], M1*M2-M1*M2)
404
+ self.assertTrue(Approx(f.eval(EvalMode.NATURAL,
405
+ Matrix([[1,0,1],[0,1,0]]),
406
+ IntervalMatrix([[[-0.2,0.2],[-0.1,0.1]],
407
+ [[0.2,0.4],[-0.4,-0.1]],
408
+ [[1.0,2.0],[-0.2,-0.1]]])),1e-9)
409
+ == IntervalMatrix([[[-1.4,1.4],[-0.3,0.3]],
410
+ [[-0.2,0.2],[-0.3,0.3]]]))
411
+ self.assertTrue(Approx(f.eval(EvalMode.CENTERED,
412
+ Matrix([[1,0,1],[0,1,0]]),
413
+ IntervalMatrix([[[-0.2,0.2],[-0.1,0.1]],
414
+ [[0.2,0.4],[-0.4,-0.1]],
415
+ [[1.0,2.0],[-0.2,-0.1]]])),1e-9)
416
+ == Matrix([[0,0],[0,0]]))
417
+
418
+ m = MatrixVar(2,2)
419
+ f = AnalyticFunction([m], m*transpose(m))
420
+ theta = ScalarVar()
421
+ g = AnalyticFunction([theta], flatten(f(mat(vec(cos(theta),sin(theta)),
422
+ vec(-sin(theta),cos(theta))))))
423
+ a = Interval(0.3,0.4)
424
+ v1 = cos(a)*cos(a)+sin(a)*sin(a)
425
+ v2 = cos(a)*sin(a)-cos(a)*sin(a)
426
+ self.assertTrue(Approx(g.eval(EvalMode.NATURAL,a),1e-9)==
427
+ IntervalVector([v1,v2,v2,v1]))
428
+ v3 = 1.0 + Interval(-2,2)*(cos(a)*sin(a)-cos(a)*sin(a))*a.rad()
429
+ v4 = (cos(a)*cos(a)-cos(a)*cos(a)+sin(a)*sin(a)-sin(a)*sin(a))*a.rad()
430
+ self.assertTrue(Approx(g.eval(EvalMode.CENTERED,a),1e-9)==
431
+ IntervalVector([v3,v4,v4,v3]))
432
+
433
+ x = ScalarVar()
434
+ f = AnalyticFunction ([x], extend(x*(1-sqrt(x)),x));
435
+ self.assertTrue(f.eval(Interval(1.0,4.0))==Interval(-4.0,0.0))
436
+ self.assertTrue(f.eval(Interval(-4.0,-1.0))==Interval(-4.0,-1.0))
437
+ self.assertTrue(f.eval(Interval(0.0,4.0))==Interval(-4.0,4.0))
438
+ self.assertTrue(f.eval(Interval(0.0))==Interval(0.0))
439
+
440
+
441
+ if __name__ == '__main__':
442
+ unittest.main()