@@ -151,41 +151,52 @@ def test_nonunit_stride_from_python():
151
151
np .testing .assert_array_equal (counting_mat , [[0. , 2 , 2 ], [6 , 16 , 10 ], [6 , 14 , 8 ]])
152
152
153
153
154
- def conv_double_to_adscalar (arr , vice_versa = False ):
155
- flat_arr = arr .flatten ()
156
- new_arr = np .zeros (flat_arr .shape , dtype = object )
154
+ def float_to_adscalar (arr , deriv ):
155
+ arr = np .asarray (arr )
156
+ assert arr .dtype == float
157
+ new_arr = [m .AutoDiffXd (x , deriv ) for x in arr .flat ]
158
+ return np .array (new_arr ).reshape (arr .shape )
157
159
158
- for i in range (0 , flat_arr .shape [0 ]):
159
- if vice_versa :
160
- new_arr [i ] = flat_arr [i ].value ()
161
- else :
162
- new_arr [i ] = m .AutoDiffXd (flat_arr [i ], np .ones (1 ))
163
160
164
- return new_arr .reshape (arr .shape )
161
+ def adscalar_to_float (arr ):
162
+ arr = np .asarray (arr )
163
+ assert arr .dtype == object
164
+ new_arr = [x .value () for x in arr .flat ]
165
+ return np .array (new_arr ).reshape (arr .shape )
166
+
167
+
168
+ def check_array (a , b ):
169
+ a , b = (np .asarray (x ) for x in (a , b ))
170
+ assert a .shape == b .shape and a .dtype == b .dtype
171
+ for index , (ai , bi ) in enumerate (zip (a .flat , b .flat )):
172
+ assert m .equal_to (ai , bi ), index
165
173
166
174
167
175
def test_eigen_passing_adscalar ():
168
- adscalar_mat = conv_double_to_adscalar (ref )
176
+ assert m .equal_to (1. , 1. )
177
+ assert not m .equal_to (1. , 1.1 )
178
+ assert m .equal_to (m .AutoDiffXd (0 , [1. ]), m .AutoDiffXd (0 , [1. ]))
179
+ assert not m .equal_to (m .AutoDiffXd (0 , [1. ]), m .AutoDiffXd (0 , [1.1 ]))
180
+
181
+ adscalar_mat = float_to_adscalar (ref , deriv = [1. ])
169
182
adscalar_vec_col = adscalar_mat [:, 0 ]
170
183
adscalar_vec_row = adscalar_mat [0 , :]
171
184
172
- # Checking if a Python vector is getting doubled, when passed into a dynamic
185
+ # Checking if a Python vector is getting doubled, when passed into a dynamic or fixed
173
186
# row or col vector in Eigen.
174
- adscalar_double_col = m .double_adscalar_col (adscalar_vec_col )
175
- adscalar_double_row = m .double_adscalar_row (adscalar_vec_row )
176
- np .testing .assert_array_equal (conv_double_to_adscalar (adscalar_double_col , vice_versa = True ),
177
- 2 * ref [:, 0 ])
178
- np .testing .assert_array_equal (conv_double_to_adscalar (adscalar_double_row , vice_versa = True ),
179
- 2 * ref [0 , :])
187
+ double_adscalar_mat = float_to_adscalar (2 * ref , deriv = [2. ])
188
+ check_array (m .double_adscalar_col (adscalar_vec_col ), double_adscalar_mat [:, 0 ])
189
+ check_array (m .double_adscalar_col5 (adscalar_vec_col ), double_adscalar_mat [:, 0 ])
190
+ check_array (m .double_adscalar_row (adscalar_vec_row ), double_adscalar_mat [0 , :])
191
+ check_array (m .double_adscalar_row6 (adscalar_vec_row ), double_adscalar_mat [0 , :])
180
192
181
193
# Adding 7 to the a dynamic matrix using reference.
182
- incremented_adscalar_mat = conv_double_to_adscalar (m .incr_adscalar_matrix (adscalar_mat , 7. ),
183
- vice_versa = True )
184
- np .testing .assert_array_equal (incremented_adscalar_mat , ref + 7 )
194
+ incr_adscalar_mat = float_to_adscalar (ref + 7 , deriv = [1. ])
195
+ check_array (m .incr_adscalar_matrix (adscalar_mat , 7. ), incr_adscalar_mat )
185
196
# The original adscalar_mat remains unchanged in spite of passing by reference, since
186
197
# `Eigen::Ref<const CType>` permits copying, and copying is the only valid operation for
187
198
# `dtype=object`.
188
- np . testing . assert_array_equal ( conv_double_to_adscalar (adscalar_mat , vice_versa = True ), ref )
199
+ check_array ( adscalar_to_float (adscalar_mat ), ref )
189
200
190
201
# Changes in Python are not reflected in C++ when internal_reference is returned.
191
202
# These conversions should be disabled at runtime.
0 commit comments