6
6
7
7
import pytest
8
8
9
+ EPS = 1e-7
10
+ ATOL = 2 * EPS ** 0.5
11
+
12
+
13
+ def finite_grad (costmodel , space , x , u , EPS = 1e-8 ):
14
+ ndx = space .ndx
15
+ nu = u .size
16
+ grad = np .zeros (ndx + nu )
17
+ dx = np .zeros (ndx )
18
+ du = np .zeros (nu )
19
+ data = costmodel .createData ()
20
+ costmodel .evaluate (x , u , data )
21
+ # distance to origin
22
+ _dx = space .difference (space .neutral (), x )
23
+ ex = EPS * max (1.0 , np .linalg .norm (_dx ))
24
+ vref = data .value
25
+ for i in range (ndx ):
26
+ dx [i ] = ex
27
+ x1 = space .integrate (x , dx )
28
+ costmodel .evaluate (x1 , u , data )
29
+ grad [i ] = (data .value - vref ) / ex
30
+ dx [i ] = 0.0
31
+
32
+ for i in range (ndx , ndx + nu ):
33
+ du [i - ndx ] = ex
34
+ u1 = u + du
35
+ costmodel .evaluate (x , u1 , data )
36
+ grad [i ] = (data .value - vref ) / ex
37
+ du [i - ndx ] = 0.0
38
+
39
+ return grad
40
+
41
+
42
+ def sample_gauss (space ):
43
+ x0 = space .neutral ()
44
+ d = np .random .randn (space .ndx ) * 0.1
45
+ x1 = space .integrate (x0 , d )
46
+ return x1
47
+
9
48
10
49
def test_cost_stack ():
11
50
nx = 2
@@ -107,6 +146,12 @@ def test_composite_cost():
107
146
print (data .value )
108
147
print (data .grad )
109
148
print (data .hess )
149
+ for i in range (100 ):
150
+ x0 = sample_gauss (space )
151
+ cost .evaluate (x0 , u0 , data )
152
+ cost .computeGradients (x0 , u0 , data )
153
+ fgrad = finite_grad (cost , space , x0 , u0 )
154
+ assert np .allclose (fgrad , data .grad )
110
155
print ("----" )
111
156
112
157
@@ -127,10 +172,9 @@ def test_log_barrier():
127
172
128
173
np .random .seed (40 )
129
174
130
- weight = np .random . rand ( )
175
+ weights = np .ones ( fun . nr )
131
176
thresh = np .random .rand ()
132
- cost = aligator .RelaxedLogBarrierCost (space , fun , weight , thresh )
133
- weights = np .array ([weight ] * fun .nr )
177
+ cost = aligator .RelaxedLogBarrierCost (space , fun , weights , thresh )
134
178
assert np .array_equal (weights , cost .weights )
135
179
136
180
data = cost .createData ()
@@ -145,6 +189,13 @@ def test_log_barrier():
145
189
print (data .value )
146
190
print (data .grad )
147
191
print (data .hess )
192
+
193
+ for i in range (100 ):
194
+ x0 = sample_gauss (space )
195
+ cost .evaluate (x0 , u0 , data )
196
+ cost .computeGradients (x0 , u0 , data )
197
+ fgrad = finite_grad (cost , space , x0 , u0 )
198
+ assert np .allclose (fgrad , data .grad )
148
199
print ("----" )
149
200
150
201
0 commit comments