@@ -11,10 +11,6 @@ input = [1, 2, 3]
11
11
# ===== Dense tests =====
12
12
# Arrays of Matrices
13
13
h_dense_arraymat = [[a 1 ; b 0 ], [0 0 ; 0 0 ], [a c; 1 0 ]] # empty array support required
14
- function h_dense_arraymat_julia (x)
15
- a, b, c = x
16
- return [[a[1 ] 1 ; b[1 ] 0 ], [0 0 ; 0 0 ], [a[1 ] c[1 ]; 1 0 ]]
17
- end
18
14
function h_dense_arraymat_julia! (out, x)
19
15
a, b, c = x
20
16
out[1 ] .= [a[1 ] 1 ; b[1 ] 0 ]
@@ -23,23 +19,32 @@ function h_dense_arraymat_julia!(out, x)
23
19
end
24
20
25
21
h_dense_arraymat_str = ModelingToolkit. build_function (h_dense_arraymat, [a, b, c])
26
- h_dense_arraymat_oop = eval (h_dense_arraymat_str[1 ])
27
22
h_dense_arraymat_ip! = eval (h_dense_arraymat_str[2 ])
28
23
out_1_arraymat = [Array {Int64} (undef, 2 , 2 ) for i in 1 : 3 ]
29
24
out_2_arraymat = [similar (x) for x in out_1_arraymat]
30
- julia_dense_arraymat = h_dense_arraymat_julia (input)
31
- mtk_dense_arraymat = h_dense_arraymat_oop (input)
32
- @test_broken julia_dense_arraymat == mtk_dense_arraymat
33
25
h_dense_arraymat_julia! (out_1_arraymat, input)
34
26
h_dense_arraymat_ip! (out_2_arraymat, input)
35
27
@test out_1_arraymat == out_2_arraymat
36
28
37
- # Arrays of 1D Vectors
38
- h_dense_arrayvec = [[a, 0 , c], [0 , 0 , 0 ], [1 , a, b]] # same for empty vectors, etc.
39
- function h_dense_arrayvec_julia (x)
29
+ # Arrays of Matrices, Heterogeneous element types
30
+ test_exp = [exp (a) * exp (b), a]
31
+ h_dense_arraymat_het = [ModelingToolkit. hessian (t, [a, b]) for t in test_exp]
32
+ function h_dense_arraymat_het_julia! (out, x)
40
33
a, b, c = x
41
- return [[a[1 ], 0 , c[1 ]], [0 , 0 , 0 ], [1 , a[1 ], b[1 ]]]
34
+ out[1 ] .= [exp (a[1 ]) * exp (b[1 ]) exp (a[1 ]) * exp (b[1 ]); exp (a[1 ]) * exp (b[1 ]) exp (a[1 ]) * exp (b[1 ])]
35
+ out[2 ] .= [0 0 ; 0 0 ]
42
36
end
37
+
38
+ h_dense_arraymat_het_str = ModelingToolkit. build_function (h_dense_arraymat_het, [a, b, c])
39
+ h_dense_arraymat_het_ip! = eval (h_dense_arraymat_het_str[2 ])
40
+ out_1_arraymat_het = [Array {Float64} (undef, 2 , 2 ) for i in 1 : 2 ]
41
+ out_2_arraymat_het = [similar (x) for x in out_1_arraymat_het]
42
+ h_dense_arraymat_het_julia! (out_1_arraymat_het, input)
43
+ h_dense_arraymat_het_ip! (out_2_arraymat_het, input)
44
+ @test out_1_arraymat_het == out_2_arraymat_het
45
+
46
+ # Arrays of 1D Vectors
47
+ h_dense_arrayvec = [[a, 0 , c], [0 , 0 , 0 ], [1 , a, b]] # same for empty vectors, etc.
43
48
function h_dense_arrayvec_julia! (out, x)
44
49
a, b, c = x
45
50
out[1 ] .= [a[1 ], 0 , c[1 ]]
@@ -48,24 +53,15 @@ function h_dense_arrayvec_julia!(out, x)
48
53
end
49
54
50
55
h_dense_arrayvec_str = ModelingToolkit. build_function (h_dense_arrayvec, [a, b, c])
51
- h_dense_arrayvec_oop = eval (h_dense_arrayvec_str[1 ])
52
56
h_dense_arrayvec_ip! = eval (h_dense_arrayvec_str[2 ])
53
57
out_1_arrayvec = [Vector {Int64} (undef, 3 ) for i in 1 : 3 ]
54
58
out_2_arrayvec = [Vector {Int64} (undef, 3 ) for i in 1 : 3 ]
55
- julia_dense_arrayvec = h_dense_arrayvec_julia (input)
56
- mtk_dense_arrayvec = h_dense_arrayvec_oop (input)
57
- @test_broken julia_dense_arrayvec == mtk_dense_arrayvec
58
- mtk_dense_arrayvec = @test_broken h_dense_arrayvec_oop (input)
59
59
h_dense_arrayvec_julia! (out_1_arrayvec, input)
60
60
h_dense_arrayvec_ip! (out_2_arrayvec, input)
61
61
@test out_1_arrayvec == out_2_arrayvec
62
62
63
63
# Arrays of Arrays of Matrices
64
64
h_dense_arrayNestedMat = [[[a 1 ; b 0 ], [0 0 ; 0 0 ]], [[b 1 ; a 0 ], [b c; 0 1 ]]]
65
- function h_dense_arrayNestedMat_julia (x)
66
- a, b, c = x
67
- return [[[a[1 ] 1 ; b[1 ] 0 ], [0 0 ; 0 0 ]], [[b[1 ] 1 ; a[1 ] 0 ], [b[1 ] c[1 ]; 0 1 ]]]
68
- end
69
65
function h_dense_arrayNestedMat_julia! (out, x)
70
66
a, b, c = x
71
67
out[1 ][1 ] .= [a[1 ] 1 ; b[1 ] 0 ]
@@ -75,24 +71,34 @@ function h_dense_arrayNestedMat_julia!(out, x)
75
71
end
76
72
77
73
h_dense_arrayNestedMat_str = ModelingToolkit. build_function (h_dense_arrayNestedMat, [a, b, c])
78
- h_dense_arrayNestedMat_oop = eval (h_dense_arrayNestedMat_str[1 ])
79
74
h_dense_arrayNestedMat_ip! = eval (h_dense_arrayNestedMat_str[2 ])
80
75
out_1_arrayNestedMat = [[rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )], [rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )]] # avoid undef broadcasting issue
81
76
out_2_arrayNestedMat = [[rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )], [rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )]]
82
- julia_dense_arrayNestedMat = h_dense_arrayNestedMat_julia (input)
83
- mtk_dense_arrayNestedMat = h_dense_arrayNestedMat_oop (input)
84
- @test_broken julia_dense_arrayNestedMat == mtk_dense_arrayNestedMat
85
77
h_dense_arrayNestedMat_julia! (out_1_arrayNestedMat, input)
86
78
h_dense_arrayNestedMat_ip! (out_2_arrayNestedMat, input)
87
79
@test out_1_arrayNestedMat == out_2_arrayNestedMat
88
80
81
+ # Arrays of Arrays of Matrices, Heterogeneous element types
82
+ test_exp = [exp (a) * exp (b), a]
83
+ h_dense_arrayNestedMat_het = [[ModelingToolkit. hessian (t, [a, b]) for t in test_exp], [[ModelingToolkit. Constant (0 ) ModelingToolkit. Constant (0 ); ModelingToolkit. Constant (0 ) ModelingToolkit. Constant (0 )], [ModelingToolkit. Constant (0 ) ModelingToolkit. Constant (0 ); ModelingToolkit. Constant (0 ) ModelingToolkit. Constant (0 )]]]
84
+ function h_dense_arrayNestedMat_het_julia! (out, x)
85
+ a, b, c = x
86
+ out[1 ][1 ] .= [exp (a[1 ]) * exp (b[1 ]) exp (a[1 ]) * exp (b[1 ]); exp (a[1 ]) * exp (b[1 ]) exp (a[1 ]) * exp (b[1 ])]
87
+ out[1 ][2 ] .= [0 0 ; 0 0 ]
88
+ out[2 ][1 ] .= [0 0 ; 0 0 ]
89
+ out[2 ][2 ] .= [0 0 ; 0 0 ]
90
+ end
91
+ h_dense_arrayNestedMat_het_str = ModelingToolkit. build_function (h_dense_arrayNestedMat_het, [a, b, c])
92
+ h_dense_arrayNestedMat_het_ip! = eval (h_dense_arrayNestedMat_het_str[2 ])
93
+ out_1_arrayNestedMat_het = [[rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )], [rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )]] # avoid undef broadcasting issue
94
+ out_2_arrayNestedMat_het = [[rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )], [rand (Int64, 2 , 2 ), rand (Int64, 2 , 2 )]]
95
+ h_dense_arrayNestedMat_julia! (out_1_arrayNestedMat_het, input)
96
+ h_dense_arrayNestedMat_ip! (out_2_arrayNestedMat_het, input)
97
+ @test out_1_arrayNestedMat_het == out_2_arrayNestedMat_het
98
+
89
99
# ===== Sparse tests =====
90
100
# Array of Matrices
91
101
h_sparse_arraymat = sparse .([[a 1 ; b 0 ], [0 0 ; 0 0 ], [a c; 1 0 ]])
92
- function h_sparse_arraymat_julia (x)
93
- a, b, c = x
94
- return [sparse ([a[1 ] 1 ; b[1 ] 0 ]), sparse ([0 0 ; 0 0 ]), sparse ([a[1 ] c[1 ]; 1 0 ])] # necessary because sparse([]) is a SparseVector, not SparseMatrix
95
- end
96
102
function h_sparse_arraymat_julia! (out, x)
97
103
a, b, c = x
98
104
out[1 ][1 , 1 ] = a[1 ]
@@ -105,24 +111,16 @@ function h_sparse_arraymat_julia!(out, x)
105
111
end
106
112
107
113
h_sparse_arraymat_str = ModelingToolkit. build_function (h_sparse_arraymat, [a, b, c])
108
- h_sparse_arraymat_oop = eval (h_sparse_arraymat_str[1 ])
109
114
h_sparse_arraymat_ip! = eval (h_sparse_arraymat_str[2 ])
110
115
h_sparse_arraymat_sparsity_patterns = map (get_sparsity_pattern, h_sparse_arraymat)
111
116
out_1_arraymat = [similar (h) for h in h_sparse_arraymat_sparsity_patterns]
112
117
out_2_arraymat = [similar (h) for h in h_sparse_arraymat_sparsity_patterns] # can't do similar() because it will just be #undef, with the wrong sparsity pattern
113
- julia_sparse_arraymat = h_sparse_arraymat_julia (input)
114
- mtk_sparse_arraymat = h_sparse_arraymat_oop (input)
115
- @test_broken julia_sparse_arraymat == mtk_sparse_arraymat
116
118
h_sparse_arraymat_julia! (out_1_arraymat, input)
117
119
h_sparse_arraymat_ip! (out_2_arraymat, input)
118
120
@test out_1_arraymat == out_2_arraymat
119
121
120
122
# Array of 1D Vectors
121
123
h_sparse_arrayvec = sparse .([[a, 0 , c], [0 , 0 , 0 ], [1 , a, b]])
122
- function h_sparse_arrayvec_julia (x)
123
- a, b, c = x
124
- return sparse .([[a[1 ], 0 , c[1 ]], [0 , 0 , 0 ], [1 , a[1 ], b[1 ]]])
125
- end
126
124
function h_sparse_arrayvec_julia! (out, x)
127
125
a, b, c = x
128
126
out[1 ][1 ] = a[1 ]
@@ -134,24 +132,16 @@ function h_sparse_arrayvec_julia!(out, x)
134
132
end
135
133
136
134
h_sparse_arrayvec_str = ModelingToolkit. build_function (h_sparse_arrayvec, [a, b, c])
137
- h_sparse_arrayvec_oop = eval (h_sparse_arrayvec_str[1 ])
138
135
h_sparse_arrayvec_ip! = eval (h_sparse_arrayvec_str[2 ])
139
136
h_sparse_arrayvec_sparsity_patterns = map (get_sparsity_pattern, h_sparse_arrayvec)
140
137
out_1_arrayvec = [similar (h) for h in h_sparse_arrayvec_sparsity_patterns]
141
138
out_2_arrayvec = [similar (h) for h in h_sparse_arrayvec_sparsity_patterns]
142
- julia_sparse_arrayvec = h_sparse_arrayvec_julia (input)
143
- mtk_sparse_arrayvec = h_sparse_arrayvec_oop (input)
144
- @test_broken julia_sparse_arrayvec == mtk_sparse_arrayvec
145
139
h_sparse_arrayvec_julia! (out_1_arrayvec, input)
146
140
h_sparse_arrayvec_ip! (out_2_arrayvec, input)
147
141
@test out_1_arrayvec == out_2_arrayvec
148
142
149
143
# Arrays of Arrays of Matrices
150
144
h_sparse_arrayNestedMat = [sparse .([[a 1 ; b 0 ], [0 0 ; 0 0 ]]), sparse .([[b 1 ; a 0 ], [b c; 0 1 ]])]
151
- function h_sparse_arrayNestedMat_julia (x)
152
- a, b, c = x
153
- return [sparse .([[a[1 ] 1 ; b[1 ] 0 ], [0 0 ; 0 0 ]]), sparse .([[b[1 ] 1 ; a[1 ] 0 ], [b[1 ] c[1 ]; 0 1 ]])]
154
- end
155
145
function h_sparse_arrayNestedMat_julia! (out, x)
156
146
a, b, c = x
157
147
out[1 ][1 ][1 , 1 ] = a[1 ]
@@ -167,14 +157,10 @@ function h_sparse_arrayNestedMat_julia!(out, x)
167
157
end
168
158
169
159
h_sparse_arrayNestedMat_str = ModelingToolkit. build_function (h_sparse_arrayNestedMat, [a, b, c])
170
- h_sparse_arrayNestedMat_oop = eval (h_sparse_arrayNestedMat_str[1 ])
171
160
h_sparse_arrayNestedMat_ip! = eval (h_sparse_arrayNestedMat_str[2 ])
172
161
h_sparse_arrayNestedMat_sparsity_patterns = [map (get_sparsity_pattern, h) for h in h_sparse_arrayNestedMat]
173
162
out_1_arrayNestedMat = [[similar (h_sub) for h_sub in h] for h in h_sparse_arrayNestedMat_sparsity_patterns]
174
163
out_2_arrayNestedMat = [[similar (h_sub) for h_sub in h] for h in h_sparse_arrayNestedMat_sparsity_patterns]
175
- julia_sparse_arrayNestedMat = h_sparse_arrayNestedMat_julia (input)
176
- mtk_sparse_arrayNestedMat = h_sparse_arrayNestedMat_oop (input)
177
- @test_broken julia_sparse_arrayNestedMat == mtk_sparse_arrayNestedMat
178
164
h_sparse_arrayNestedMat_julia! (out_1_arrayNestedMat, input)
179
165
h_sparse_arrayNestedMat_ip! (out_2_arrayNestedMat, input)
180
166
@test out_1_arrayNestedMat == out_2_arrayNestedMat
@@ -184,26 +170,20 @@ h_sparse_arrayNestedMat_ip!(out_2_arrayNestedMat, input)
184
170
# Arrays of Matrices
185
171
h_empty = [[a b; c 0 ], Array {Expression,2} (undef, 0 ,0 )]
186
172
h_empty_str = ModelingToolkit. build_function (h_empty, [a, b, c])
187
- h_empty_oop = eval (h_empty_str[1 ])
188
173
h_empty_ip! = eval (h_empty_str[2 ])
189
- @test_broken h_empty_oop (input) == [[1 2 ; 3 0 ], Array {Int64,2} (undef,0 ,0 )]
190
174
out = [Matrix {Int64} (undef, 2 , 2 ), Matrix {Int64} (undef, 0 , 0 )]
191
175
h_empty_ip! (out, input) # should just not fail
192
176
193
177
# Array of Vectors
194
178
h_empty_vec = [[a, b, c, 0 ], Vector {Expression} (undef,0 )]
195
179
h_empty_vec_str = ModelingToolkit. build_function (h_empty_vec, [a, b, c])
196
- h_empty_vec_oop = eval (h_empty_vec_str[1 ])
197
180
h_empty_vec_ip! = eval (h_empty_vec_str[2 ])
198
- @test_broken h_empty_vec_oop (input) == [[1 , 2 , 3 , 0 ], Vector {Int64} (undef,0 )]
199
181
out = [Vector {Int64} (undef, 4 ), Vector {Int64} (undef, 0 )]
200
182
h_empty_vec_ip! (out, input) # should just not fail
201
183
202
184
# Arrays of Arrays of Matrices
203
185
h_emptyNested = [[[a b; c 0 ]], Array {Array{Expression, 2}} (undef, 0 )] # emptyNested array of arrays
204
186
h_emptyNested_str = ModelingToolkit. build_function (h_emptyNested, [a, b, c])
205
- h_emptyNested_oop = eval (h_emptyNested_str[1 ])
206
187
h_emptyNested_ip! = eval (h_emptyNested_str[2 ])
207
- @test_broken h_emptyNested_oop (input) == [[[1 2 ; 3 0 ]], Array {Array{Int64, 2}} (undef, 0 )]
208
188
out = [[[1 2 ;3 4 ]], Array {Array{Int64,2},1} (undef, 0 )]
209
189
h_emptyNested_ip! (out, input) # should just not fail
0 commit comments