@@ -118,57 +118,96 @@ j′vp(fdm, f, ȳ, xs...) = j′vp(fdm, xs->f(xs...), ȳ, xs)[1]
118
118
119
119
Transform `x` into a `Vector`, and return a closure which inverts the transformation.
120
120
"""
121
- to_vec (x:: Number ) = ([x], first)
121
+ function to_vec (x:: Number )
122
+ function Number_from_vec (x_vec)
123
+ return first (x_vec)
124
+ end
125
+ return [x], Number_from_vec
126
+ end
122
127
123
128
# Vectors
124
129
to_vec (x:: Vector{<:Number} ) = (x, identity)
125
130
function to_vec (x:: Vector )
126
131
x_vecs_and_backs = map (to_vec, x)
127
132
x_vecs, backs = first .(x_vecs_and_backs), last .(x_vecs_and_backs)
128
- return vcat (x_vecs ... ), function (x_vec)
133
+ function Vector_from_vec (x_vec)
129
134
sz = cumsum ([map (length, x_vecs)... ])
130
135
return [backs[n](x_vec[sz[n]- length (x_vecs[n])+ 1 : sz[n]]) for n in eachindex (x)]
131
136
end
137
+ return vcat (x_vecs... ), Vector_from_vec
132
138
end
133
139
134
140
# Arrays
135
- to_vec (x:: Array{<:Number} ) = vec (x), x_vec-> reshape (x_vec, size (x))
141
+ function to_vec (x:: Array{<:Number} )
142
+ function Array_from_vec (x_vec)
143
+ return reshape (x_vec, size (x))
144
+ end
145
+ return vec (x), Array_from_vec
146
+ end
147
+
136
148
function to_vec (x:: Array )
137
149
x_vec, back = to_vec (reshape (x, :))
138
- return x_vec, x_vec-> reshape (back (x_vec), size (x))
150
+ function Array_from_vec (x_vec)
151
+ return reshape (back (x_vec), size (x))
152
+ end
153
+ return x_vec, Array_from_vec
139
154
end
140
155
141
156
# AbstractArrays
142
157
function to_vec (x:: T ) where {T<: LinearAlgebra.AbstractTriangular }
143
158
x_vec, back = to_vec (Matrix (x))
144
- return x_vec, x_vec-> T (reshape (back (x_vec), size (x)))
159
+ function AbstractTriangular_from_vec (x_vec)
160
+ return T (reshape (back (x_vec), size (x)))
161
+ end
162
+ return x_vec, AbstractTriangular_from_vec
163
+ end
164
+
165
+ function to_vec (x:: Symmetric )
166
+ function Symmetric_from_vec (x_vec)
167
+ return Symmetric (reshape (x_vec, size (x)))
168
+ end
169
+ return vec (Matrix (x)), Symmetric_from_vec
170
+ end
171
+
172
+ function to_vec (X:: Diagonal )
173
+ function Diagonal_from_vec (x_vec)
174
+ return Diagonal (reshape (x_vec, size (X)... ))
175
+ end
176
+ return vec (Matrix (X)), Diagonal_from_vec
145
177
end
146
- to_vec (x:: Symmetric ) = vec (Matrix (x)), x_vec-> Symmetric (reshape (x_vec, size (x)))
147
- to_vec (X:: Diagonal ) = vec (Matrix (X)), x_vec-> Diagonal (reshape (x_vec, size (X)... ))
148
178
149
179
function to_vec (X:: Transpose )
150
- return vec (Matrix (X)), x_vec-> Transpose (permutedims (reshape (x_vec, size (X))))
180
+ function Transpose_from_vec (x_vec)
181
+ return Transpose (permutedims (reshape (x_vec, size (X))))
182
+ end
183
+ return vec (Matrix (X)), Transpose_from_vec
151
184
end
185
+
152
186
function to_vec (X:: Adjoint )
153
- return vec (Matrix (X)), x_vec-> Adjoint (conj! (permutedims (reshape (x_vec, size (X)))))
187
+ function Adjoint_from_vec (x_vec)
188
+ return Adjoint (conj! (permutedims (reshape (x_vec, size (X)))))
189
+ end
190
+ return vec (Matrix (X)), Adjoint_from_vec
154
191
end
155
192
156
193
# Non-array data structures
157
194
158
195
function to_vec (x:: Tuple )
159
196
x_vecs, x_backs = zip (map (to_vec, x)... )
160
197
sz = cumsum ([map (length, x_vecs)... ])
161
- return vcat (x_vecs ... ), function (v)
198
+ function Tuple_from_vec (v)
162
199
return ntuple (n-> x_backs[n](v[sz[n]- length (x_vecs[n])+ 1 : sz[n]]), length (x))
163
200
end
201
+ return vcat (x_vecs... ), Tuple_from_vec
164
202
end
165
203
166
204
# Convert to a vector-of-vectors to make use of existing functionality.
167
205
function to_vec (d:: Dict )
168
206
d_vec_vec = [val for val in values (d)]
169
207
d_vec, back = to_vec (d_vec_vec)
170
- return d_vec, function (v)
208
+ function Dict_from_vec (v)
171
209
v_vec_vec = back (v)
172
210
return Dict ([(key, v_vec_vec[n]) for (n, key) in enumerate (keys (d))])
173
211
end
212
+ return d_vec, Dict_from_vec
174
213
end
0 commit comments