@@ -17,7 +17,8 @@ struct ParameterIndex{P, I}
17
17
end
18
18
19
19
const ParamIndexMap = Dict{Union{Symbol, BasicSymbolic}, Tuple{Int, Int}}
20
- const UnknownIndexMap = Dict{Union{Symbol, BasicSymbolic}, Union{Int, UnitRange{Int}}}
20
+ const UnknownIndexMap = Dict{
21
+ Union{Symbol, BasicSymbolic}, Union{Int, UnitRange{Int}, AbstractArray{Int}}}
21
22
22
23
struct IndexCache
23
24
unknown_idx:: UnknownIndexMap
@@ -40,17 +41,32 @@ function IndexCache(sys::AbstractSystem)
40
41
for sym in unks
41
42
usym = unwrap (sym)
42
43
sym_idx = if Symbolics. isarraysymbolic (sym)
43
- idx: (idx + length (sym) - 1 )
44
+ reshape ( idx: (idx + length (sym) - 1 ), size (sym) )
44
45
else
45
46
idx
46
47
end
47
48
unk_idxs[usym] = sym_idx
48
49
49
- if hasname (sym)
50
+ if hasname (sym) && ( ! istree (sym) || operation (sym) != = getindex)
50
51
unk_idxs[getname (usym)] = sym_idx
51
52
end
52
53
idx += length (sym)
53
54
end
55
+ for sym in unks
56
+ usym = unwrap (sym)
57
+ istree (sym) && operation (sym) === getindex || continue
58
+ arrsym = arguments (sym)[1 ]
59
+ all (haskey (unk_idxs, arrsym[i]) for i in eachindex (arrsym)) || continue
60
+
61
+ idxs = [unk_idxs[arrsym[i]] for i in eachindex (arrsym)]
62
+ if idxs == idxs[begin ]: idxs[end ]
63
+ idxs = reshape (idxs[begin ]: idxs[end ], size (idxs))
64
+ end
65
+ unk_idxs[arrsym] = idxs
66
+ if hasname (arrsym)
67
+ unk_idxs[getname (arrsym)] = idxs
68
+ end
69
+ end
54
70
end
55
71
56
72
disc_buffers = Dict {Any, Set{BasicSymbolic}} ()
@@ -124,7 +140,7 @@ function IndexCache(sys::AbstractSystem)
124
140
for (j, p) in enumerate (buf)
125
141
idxs[p] = (i, j)
126
142
idxs[default_toterm (p)] = (i, j)
127
- if hasname (p)
143
+ if hasname (p) && ( ! istree (p) || operation (p) != = getindex)
128
144
idxs[getname (p)] = (i, j)
129
145
idxs[getname (default_toterm (p))] = (i, j)
130
146
end
0 commit comments