1- function fill_A_S_M (A, S, M, A_indices, S_indices, M_indices, parameters)
2- for (iA, iS, par) in zip (A_indices, S_indices, parameters)
1+ # fill A, S, and M matrices with the parameter values according to the parameters map
2+ function fill_A_S_M! (
3+ A:: AbstractMatrix ,
4+ S:: AbstractMatrix ,
5+ M:: Union{AbstractVector, Nothing} ,
6+ A_indices:: AbstractArrayParamsMap ,
7+ S_indices:: AbstractArrayParamsMap ,
8+ M_indices:: Union{AbstractArrayParamsMap, Nothing} ,
9+ parameters:: AbstractVector ,
10+ )
11+ @inbounds for (iA, iS, par) in zip (A_indices, S_indices, parameters)
312 for index_A in iA
413 A[index_A] = par
514 end
@@ -10,22 +19,28 @@ function fill_A_S_M(A, S, M, A_indices, S_indices, M_indices, parameters)
1019 end
1120
1221 if ! isnothing (M)
13- for (iM, par) in zip (M_indices, parameters)
22+ @inbounds for (iM, par) in zip (M_indices, parameters)
1423 for index_M in iM
1524 M[index_M] = par
1625 end
1726 end
1827 end
1928end
2029
21- function get_parameter_indices (parameters, M; linear = true , kwargs... )
22- M_indices = [findall (x -> (x == par), M) for par in parameters]
23-
24- if linear
25- M_indices = cartesian2linear .(M_indices, [M])
30+ # build the map from the index of the parameter to the linear indices
31+ # of this parameter occurences in M
32+ # returns ArrayParamsMap object
33+ function array_parameters_map (parameters:: AbstractVector , M:: AbstractArray )
34+ params_index = Dict (param => i for (i, param) in enumerate (parameters))
35+ T = Base. eltype (eachindex (M))
36+ res = [Vector {T} () for _ in eachindex (parameters)]
37+ for (i, val) in enumerate (M)
38+ par_ind = get (params_index, val, nothing )
39+ if ! isnothing (par_ind)
40+ push! (res[par_ind], i)
41+ end
2642 end
27-
28- return M_indices
43+ return res
2944end
3045
3146function eachindex_lower (M; linear_indices = false , kwargs... )
@@ -49,9 +64,6 @@ function linear2cartesian(ind_lin, dims)
4964 return ind_cart
5065end
5166
52- cartesian2linear (ind_cart, A:: AbstractArray ) = cartesian2linear (ind_cart, size (A))
53- linear2cartesian (ind_linear, A:: AbstractArray ) = linear2cartesian (ind_linear, size (A))
54-
5567function set_constants! (M, M_pre)
5668 for index in eachindex (M)
5769 δ = tryparse (Float64, string (M[index]))
@@ -85,12 +97,18 @@ function get_matrix_derivative(M_indices, parameters, n_long)
8597 return ∇M
8698end
8799
88- function fill_matrix (M, M_indices, parameters)
100+ # fill M with parameters
101+ function fill_matrix! (
102+ M:: AbstractMatrix ,
103+ M_indices:: AbstractArrayParamsMap ,
104+ parameters:: AbstractVector ,
105+ )
89106 for (iM, par) in zip (M_indices, parameters)
90107 for index_M in iM
91108 M[index_M] = par
92109 end
93110 end
111+ return M
94112end
95113
96114function get_partition (A_indices, S_indices)
0 commit comments