Skip to content

Commit 259d2e6

Browse files
wip: better parameter indexing
1 parent 9a84642 commit 259d2e6

10 files changed

+672
-263
lines changed

docs/src/api.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ allvariables
3232
observed
3333
```
3434

35+
#### Parameter timeseries
36+
37+
If the index provider contains parameters that change during the course of the simulation
38+
at discrete intervals, it must implement the following methods to ensure correct
39+
functioning of [`getu`](@ref) and [`getp`](@ref) for value providers that save the parameter
40+
timeseries. Note that there can be multiple parameter timeseries, in case different parameters
41+
change at different times.
42+
43+
```@docs
44+
is_timeseries_parameter
45+
timeseries_parameter_index
46+
ParameterTimeseriesIndex
47+
```
48+
3549
## Value provider interface
3650

3751
### State indexing
@@ -67,8 +81,8 @@ correct functioning of [`getu`](@ref) and [`getp`](@ref).
6781
```@docs
6882
is_parameter_timeseries
6983
parameter_timeseries
70-
parameter_values_at_time
7184
parameter_values_at_state_time
85+
parameter_timeseries_at_state_time
7286
```
7387

7488
### Batched Queries and Updates

src/SymbolicIndexingInterface.jl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,19 @@ export ScalarSymbolic, ArraySymbolic, NotSymbolic, symbolic_type, hasname, getna
1212
include("trait.jl")
1313

1414
export is_variable, variable_index, variable_symbols, is_parameter, parameter_index,
15+
is_timeseries_parameter, timeseries_parameter_index, ParameterTimeseriesIndex,
1516
parameter_symbols, is_independent_variable, independent_variable_symbols,
16-
is_observed,
17-
observed, is_time_dependent, constant_structure, symbolic_container,
18-
all_variable_symbols,
19-
all_symbols, solvedvariables, allvariables, default_values, symbolic_evaluate
17+
is_observed, observed, is_time_dependent, constant_structure, symbolic_container,
18+
all_variable_symbols, all_symbols, solvedvariables, allvariables, default_values,
19+
symbolic_evaluate
2020
include("index_provider_interface.jl")
2121

2222
export SymbolCache
2323
include("symbol_cache.jl")
2424

2525
export parameter_values, set_parameter!, finalize_parameters_hook!,
26-
parameter_values_at_time, parameter_values_at_state_time, parameter_timeseries,
27-
state_values, set_state!, current_time
26+
parameter_values_at_state_time, parameter_timeseries,
27+
parameter_timeseries_at_state_time, state_values, set_state!, current_time
2828
include("value_provider_interface.jl")
2929

3030
export getp, setp
@@ -39,6 +39,9 @@ include("batched_interface.jl")
3939
export ProblemState
4040
include("problem_state.jl")
4141

42+
export ParameterTimeseriesCollection
43+
include("parameter_timeseries_collection.jl")
44+
4245
export ParameterIndexingProxy
4346
include("parameter_indexing_proxy.jl")
4447

src/index_provider_interface.jl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,51 @@ Return the index of the given parameter `sym` in `indp`, or `nothing` otherwise.
5353
"""
5454
parameter_index(indp, sym) = parameter_index(symbolic_container(indp), sym)
5555

56+
"""
57+
is_timeseries_parameter(indp, sym)
58+
59+
Check whether the given `sym` is a timeseries parameter in `indp`.
60+
"""
61+
function is_timeseries_parameter(indp, sym)
62+
if hasmethod(symbolic_container, Tuple{typeof(indp)})
63+
is_timeseries_parameter(symbolic_container(indp), sym)
64+
else
65+
false
66+
end
67+
end
68+
69+
"""
70+
struct ParameterTimeseriesIndex
71+
function ParameterTimeseriesIndex(timeseries_idx, parameter_idx)
72+
73+
A struct storing the index of the timeseries of a timeseries parameter in a parameter
74+
timeseries object. `timeseries_idx` refers to an index that identifies the timeseries
75+
that the parameter belongs to. `parameter_idx` refers to the index of the parameter's
76+
timeseries in that timeseries object. Note that `parameter_idx` may be different from
77+
the object returned by [`parameter_index`](@ref) for a given parameter. The two fields in
78+
this struct are `timeseries_idx` and `parameter_idx`.
79+
"""
80+
struct ParameterTimeseriesIndex{T, I}
81+
timeseries_idx::T
82+
parameter_idx::I
83+
end
84+
85+
"""
86+
timeseries_parameter_index(indp, sym)
87+
88+
Return the index of timeseries parameter `sym` in `indp`. Must return this index as a
89+
[`ParameterTimeseriesIndex`](@ref) object. Return `nothing` if `sym` is not a timeseries
90+
parameter in `indp`. Defaults to returning `nothing`. Respects the
91+
[`symbolic_container`](@ref) fallback for `indp` if present.
92+
"""
93+
function timeseries_parameter_index(indp, sym)
94+
if hasmethod(symbolic_container, Tuple{typeof(indp)})
95+
timeseries_parameter_index(symbolic_container(indp), sym)
96+
else
97+
nothing
98+
end
99+
end
100+
56101
"""
57102
parameter_symbols(indp)
58103

0 commit comments

Comments
 (0)