@@ -166,55 +166,109 @@ dval = fs.p[4]
166
166
bidx = timeseries_parameter_index (sys, :b )
167
167
cidx = timeseries_parameter_index (sys, :c )
168
168
169
- for (sym, indexer_trait, timeseries_index, val, check_inference) in [
170
- (:a , IndexerNotTimeseries, 0 , aval, true ),
171
- (1 , IndexerNotTimeseries, 0 , aval, true ),
172
- ([:a , :d ], IndexerNotTimeseries, 0 , [aval, dval], true ),
173
- ((:a , :d ), IndexerNotTimeseries, 0 , (aval, dval), true ),
174
- ([1 , 4 ], IndexerNotTimeseries, 0 , [aval, dval], true ),
175
- ((1 , 4 ), IndexerNotTimeseries, 0 , (aval, dval), true ),
176
- ([:a , 4 ], IndexerNotTimeseries, 0 , [aval, dval], true ),
177
- ((:a , 4 ), IndexerNotTimeseries, 0 , (aval, dval), true ),
178
- (:b , IndexerBoth, 1 , bval, true ),
179
- (bidx, IndexerTimeseries, 1 , bval, true ),
180
- ([:a , :b ], IndexerNotTimeseries, 0 , [aval, bval[end ]], true ),
181
- ((:a , :b ), IndexerNotTimeseries, 0 , (aval, bval[end ]), true ),
182
- ([1 , :b ], IndexerNotTimeseries, 0 , [aval, bval[end ]], true ),
183
- ((1 , :b ), IndexerNotTimeseries, 0 , (aval, bval[end ]), true ),
184
- ([:b , :b ], IndexerBoth, 1 , vcat .(bval, bval), true ),
185
- ((:b , :b ), IndexerBoth, 1 , tuple .(bval, bval), true ),
186
- ([bidx, :b ], IndexerTimeseries, 1 , vcat .(bval, bval), true ),
187
- ((bidx, :b ), IndexerTimeseries, 1 , tuple .(bval, bval), true ),
188
- ([bidx, bidx], IndexerTimeseries, 1 , vcat .(bval, bval), true ),
189
- ((bidx, bidx), IndexerTimeseries, 1 , tuple .(bval, bval), true ),
169
+ for (sym, indexer_trait, timeseries_index, val, buffer, check_inference) in [
170
+ (:a , IndexerNotTimeseries, 0 , aval, nothing , true ),
171
+ (1 , IndexerNotTimeseries, 0 , aval, nothing , true ),
172
+ ([:a , :d ], IndexerNotTimeseries, 0 , [aval, dval], zeros ( 2 ), true ),
173
+ ((:a , :d ), IndexerNotTimeseries, 0 , (aval, dval), zeros ( 2 ), true ),
174
+ ([1 , 4 ], IndexerNotTimeseries, 0 , [aval, dval], zeros ( 2 ), true ),
175
+ ((1 , 4 ), IndexerNotTimeseries, 0 , (aval, dval), zeros ( 2 ), true ),
176
+ ([:a , 4 ], IndexerNotTimeseries, 0 , [aval, dval], zeros ( 2 ), true ),
177
+ ((:a , 4 ), IndexerNotTimeseries, 0 , (aval, dval), zeros ( 2 ), true ),
178
+ (:b , IndexerBoth, 1 , bval, zeros ( length (bval)), true ),
179
+ (bidx, IndexerTimeseries, 1 , bval, zeros ( length (bval)), true ),
180
+ ([:a , :b ], IndexerNotTimeseries, 0 , [aval, bval[end ]], zeros ( 2 ), true ),
181
+ ((:a , :b ), IndexerNotTimeseries, 0 , (aval, bval[end ]), zeros ( 2 ), true ),
182
+ ([1 , :b ], IndexerNotTimeseries, 0 , [aval, bval[end ]], zeros ( 2 ), true ),
183
+ ((1 , :b ), IndexerNotTimeseries, 0 , (aval, bval[end ]), zeros ( 2 ), true ),
184
+ ([:b , :b ], IndexerBoth, 1 , vcat .(bval, bval), map (_ -> zeros ( 2 ), bval), true ),
185
+ ((:b , :b ), IndexerBoth, 1 , tuple .(bval, bval), map (_ -> zeros ( 2 ), bval), true ),
186
+ ([bidx, :b ], IndexerTimeseries, 1 , vcat .(bval, bval), map (_ -> zeros ( 2 ), bval), true ),
187
+ ((bidx, :b ), IndexerTimeseries, 1 , tuple .(bval, bval),map (_ -> zeros ( 2 ), bval), true ),
188
+ ([bidx, bidx], IndexerTimeseries, 1 , vcat .(bval, bval), map (_ -> zeros ( 2 ), bval), true ),
189
+ ((bidx, bidx), IndexerTimeseries, 1 , tuple .(bval, bval), map (_ -> zeros ( 2 ), bval), true ),
190
190
]
191
191
getter = getp (sys, sym)
192
192
@test is_indexer_timeseries (getter) isa indexer_trait
193
193
if indexer_trait <: Union{IndexerTimeseries, IndexerBoth}
194
194
@test indexer_timeseries_index (getter) == timeseries_index
195
195
end
196
+ test_inplace = buffer != = nothing
197
+ test_non_timeseries = indexer_trait != = IndexerTimeseries
198
+ if test_inplace && test_non_timeseries
199
+ non_timeseries_val = indexer_trait == IndexerNotTimeseries ? val : val[end ]
200
+ non_timeseries_buffer = indexer_trait == IndexerNotTimeseries ? deepcopy (buffer) : deepcopy (buffer[end ])
201
+ test_non_timeseries_inplace = non_timeseries_buffer isa AbstractArray
202
+ end
196
203
if check_inference
197
204
@inferred getter (fs)
198
- if indexer_trait != IndexerTimeseries
205
+ if test_inplace
206
+ @inferred getter (deepcopy (buffer), fs)
207
+ end
208
+ if test_non_timeseries
199
209
@inferred getter (parameter_values (fs))
210
+ if test_inplace && test_non_timeseries_inplace && test_non_timeseries_inplace
211
+ @inferred getter (deepcopy (non_timeseries_buffer), parameter_values (fs))
212
+ end
200
213
end
201
214
end
202
215
@test getter (fs) == val
203
-
204
- if indexer_trait == IndexerTimeseries
205
- @test_throws ParameterTimeseriesValueIndexMismatchError{NotTimeseries} getter (parameter_values (fs))
206
- else
216
+ if test_inplace
217
+ tmp = deepcopy (buffer)
218
+ getter (tmp, fs)
219
+ if val isa Tuple
220
+ target = collect (val)
221
+ elseif eltype (val) <: Tuple
222
+ target = collect .(val)
223
+ else
224
+ target = val
225
+ end
226
+ @test tmp == target
227
+ end
228
+ if test_non_timeseries
207
229
non_timeseries_val = indexer_trait == IndexerNotTimeseries ? val : val[end ]
208
230
@test getter (parameter_values (fs)) == non_timeseries_val
231
+ if test_inplace && test_non_timeseries && test_non_timeseries_inplace
232
+ getter (non_timeseries_buffer, parameter_values (fs))
233
+ if non_timeseries_val isa Tuple
234
+ target = collect (non_timeseries_val)
235
+ else
236
+ target = non_timeseries_val
237
+ end
238
+ @test non_timeseries_buffer == target
239
+ end
240
+ else
241
+ @test_throws ParameterTimeseriesValueIndexMismatchError{NotTimeseries} getter (parameter_values (fs))
242
+ if test_inplace
243
+ @test_throws ParameterTimeseriesValueIndexMismatchError{NotTimeseries} getter ([], parameter_values (fs))
244
+ end
209
245
end
210
246
for subidx in [1 , CartesianIndex (1 ), :, rand (Bool, length (val)), rand (eachindex (val), 3 ), 1 : 2 ]
211
247
if indexer_trait <: IndexerNotTimeseries
212
248
@test_throws ParameterTimeseriesValueIndexMismatchError{Timeseries} getter (fs, subidx)
249
+ if test_inplace
250
+ @test_throws ParameterTimeseriesValueIndexMismatchError{Timeseries} getter ([], fs, subidx)
251
+ end
213
252
else
214
253
if check_inference
215
254
@inferred getter (fs, subidx)
255
+ if test_inplace && buffer[subidx] isa AbstractArray
256
+ @inferred getter (deepcopy (buffer[subidx]), fs, subidx)
257
+ end
216
258
end
217
259
@test getter (fs, subidx) == val[subidx]
260
+ if test_inplace && buffer[subidx] isa AbstractArray
261
+ tmp = deepcopy (buffer[subidx])
262
+ getter (tmp, fs, subidx)
263
+ if val[subidx] isa Tuple
264
+ target = collect (val[subidx])
265
+ elseif eltype (val) <: Tuple
266
+ target = collect .(val[subidx])
267
+ else
268
+ target = val[subidx]
269
+ end
270
+ @test tmp == target
271
+ end
218
272
end
219
273
end
220
274
end
0 commit comments