Skip to content

Commit 5a28bde

Browse files
authored
refactor: Use designated initializers for ModelDimensions (#2958)
Improves readability/maintainability. Also fixes the C++ standard for model building which was still lagging behind.
1 parent dbf0ac2 commit 5a28bde

File tree

24 files changed

+466
-545
lines changed

24 files changed

+466
-545
lines changed

include/amici/model_dimensions.h

Lines changed: 10 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -12,94 +12,10 @@ namespace amici {
1212
* Holds number of state variables, observables, etc.
1313
*/
1414
struct ModelDimensions {
15-
/** Default ctor */
16-
ModelDimensions() = default;
17-
1815
/**
19-
* @brief Constructor with model dimensions
20-
* @param nx_rdata Number of state variables
21-
* @param nxtrue_rdata Number of state variables of the non-augmented model
22-
* @param nx_solver Number of state variables with conservation laws applied
23-
* @param nxtrue_solver Number of state variables of the non-augmented model
24-
* with conservation laws applied
25-
* @param nx_solver_reinit Number of state variables with conservation laws
26-
* subject to reinitialization
27-
* @param np Number of parameters
28-
* @param nk Number of constants
29-
* @param ny Number of observables
30-
* @param nytrue Number of observables of the non-augmented model
31-
* @param nz Number of event observables
32-
* @param nztrue Number of event observables of the non-augmented model
33-
* @param ne Number of events
34-
* @param ne_solver Number of events that require root-finding
35-
* @param nspl Number of splines
36-
* @param nJ Number of objective functions
37-
* @param nw Number of repeating elements
38-
* @param ndwdx Number of nonzero elements in the `x` derivative of the
39-
* repeating elements
40-
* @param ndwdp Number of nonzero elements in the `p` derivative of the
41-
* repeating elements
42-
* @param ndwdw Number of nonzero elements in the `w` derivative of the
43-
* repeating elements
44-
* @param ndxdotdw Number of nonzero elements in the \f$ w\f$ derivative of
45-
* \f$ xdot\f$
46-
* @param ndJydy Number of nonzero elements in the \f$ y\f$ derivative of
47-
* \f$ dJy\f$ (shape `nytrue`)
48-
* @param ndxrdatadxsolver Number of nonzero elements in the \f$ x\f$
49-
* derivative of \f$ x_rdata\f$
50-
* @param ndxrdatadtcl Number of nonzero elements in the \f$ tcl\f$
51-
* derivative of \f$ x_rdata\f$
52-
* @param ndtotal_cldx_rdata Number of nonzero elements in the
53-
* \f$ x_rdata \f$ derivative of \f$ total_cl \f$
54-
* @param nnz Number of nonzero elements in Jacobian
55-
* @param ubw Upper matrix bandwidth in the Jacobian
56-
* @param lbw Lower matrix bandwidth in the Jacobian
57-
* @param ndxdotdp_explicit Number of nonzero elements in `dxdotdp_explicit`
58-
* @param ndxdotdx_explicit Number of nonzero elements in `dxdotdx_explicit`
59-
* @param w_recursion_depth Recursion depth of fw
16+
* @brief Validate dimensions.
6017
*/
61-
ModelDimensions(
62-
int const nx_rdata, int const nxtrue_rdata, int const nx_solver,
63-
int const nxtrue_solver, int const nx_solver_reinit, int const np,
64-
int const nk, int const ny, int const nytrue, int const nz,
65-
int const nztrue, int const ne, int const ne_solver, int const nspl,
66-
int const nJ, int const nw, int const ndwdx, int const ndwdp,
67-
int const ndwdw, int const ndxdotdw, std::vector<int> ndJydy,
68-
int const ndxrdatadxsolver, int const ndxrdatadtcl,
69-
int const ndtotal_cldx_rdata, int const nnz, int const ubw,
70-
int const lbw, int ndxdotdp_explicit = 0, int ndxdotdx_explicit = 0,
71-
int w_recursion_depth = 0
72-
)
73-
: nx_rdata(nx_rdata)
74-
, nxtrue_rdata(nxtrue_rdata)
75-
, nx_solver(nx_solver)
76-
, nxtrue_solver(nxtrue_solver)
77-
, nx_solver_reinit(nx_solver_reinit)
78-
, np(np)
79-
, nk(nk)
80-
, ny(ny)
81-
, nytrue(nytrue)
82-
, nz(nz)
83-
, nztrue(nztrue)
84-
, ne(ne)
85-
, ne_solver(ne_solver)
86-
, nspl(nspl)
87-
, nw(nw)
88-
, ndwdx(ndwdx)
89-
, ndwdp(ndwdp)
90-
, ndwdw(ndwdw)
91-
, ndxdotdw(ndxdotdw)
92-
, ndJydy(std::move(ndJydy))
93-
, ndxrdatadxsolver(ndxrdatadxsolver)
94-
, ndxrdatadtcl(ndxrdatadtcl)
95-
, ndtotal_cldx_rdata(ndtotal_cldx_rdata)
96-
, nnz(nnz)
97-
, nJ(nJ)
98-
, ubw(ubw)
99-
, lbw(lbw)
100-
, ndxdotdp_explicit(ndxdotdp_explicit)
101-
, ndxdotdx_explicit(ndxdotdx_explicit)
102-
, w_recursion_depth(w_recursion_depth) {
18+
void validate() const {
10319
Expects(nxtrue_rdata >= 0);
10420
Expects(nxtrue_rdata <= nx_rdata);
10521
Expects(nxtrue_solver >= 0);
@@ -139,23 +55,22 @@ struct ModelDimensions {
13955
Expects(ndxdotdx_explicit >= 0);
14056
Expects(w_recursion_depth >= 0);
14157
}
142-
143-
/** Number of states */
58+
/** Number of state variables */
14459
int nx_rdata{0};
14560

146-
/** Number of states in the unaugmented system */
61+
/** Number of state variables in the unaugmented system */
14762
int nxtrue_rdata{0};
14863

149-
/** Number of states with conservation laws applied */
64+
/** Number of state variables with conservation laws applied */
15065
int nx_solver{0};
15166

15267
/**
153-
* Number of states in the unaugmented system with conservation laws
154-
* applied
68+
* Number of state variables in the unaugmented system with conservation
69+
* laws applied
15570
*/
15671
int nxtrue_solver{0};
15772

158-
/** Number of solver states subject to reinitialization */
73+
/** Number of solver state variables subject to reinitialization */
15974
int nx_solver_reinit{0};
16075

16176
/** Number of parameters */
@@ -240,10 +155,10 @@ struct ModelDimensions {
240155
/** Lower bandwidth of the Jacobian */
241156
int lbw{0};
242157

243-
/** Number of nonzero elements in `dxdotdx_explicit` */
158+
/** Number of nonzero elements in `dxdotdp_explicit` */
244159
int ndxdotdp_explicit = 0;
245160

246-
/** Number of nonzero elements in `dxdotdp_explicit` */
161+
/** Number of nonzero elements in `dxdotdx_explicit` */
247162
int ndxdotdx_explicit = 0;
248163

249164
/** Recursion depth of fw */

models/model_calvetti_py/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ cmake_policy(VERSION 3.22...3.31)
44

55
project(model_calvetti_py)
66

7-
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD 20)
88
set(CMAKE_CXX_STANDARD_REQUIRED ON)
99
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
1010

models/model_calvetti_py/model_calvetti_py.h

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -110,38 +110,38 @@ class Model_model_calvetti_py : public amici::Model_DAE {
110110
*/
111111
Model_model_calvetti_py()
112112
: amici::Model_DAE(
113-
amici::ModelDimensions(
114-
6, // nx_rdata
115-
6, // nxtrue_rdata
116-
6, // nx_solver
117-
6, // nxtrue_solver
118-
0, // nx_solver_reinit
119-
0, // np
120-
6, // nk
121-
6, // ny
122-
6, // nytrue
123-
0, // nz
124-
0, // nztrue
125-
4, // nevent
126-
0, // nevent_solver
127-
0, // nspl
128-
1, // nobjective
129-
17, // nw
130-
15, // ndwdx
131-
0, // ndwdp
132-
16, // ndwdw
133-
7, // ndxdotdw
134-
std::vector<int>{1, 1, 1, 1, 1, 1}, // ndjydy
135-
0, // ndxrdatadxsolver
136-
0, // ndxrdatadtcl
137-
0, // ndtotal_cldx_rdata
138-
0, // nnz
139-
6, // ubw
140-
6, // lbw
141-
0, // ndxdotdp_explicit
142-
5, // ndxdotdx_explicit
143-
2 // w_recursion_depth
144-
),
113+
amici::ModelDimensions{
114+
.nx_rdata = 6,
115+
.nxtrue_rdata = 6,
116+
.nx_solver = 6,
117+
.nxtrue_solver = 6,
118+
.nx_solver_reinit = 0,
119+
.np = 0,
120+
.nk = 6,
121+
.ny = 6,
122+
.nytrue = 6,
123+
.nz = 0,
124+
.nztrue = 0,
125+
.ne = 4,
126+
.ne_solver = 0,
127+
.nspl = 0,
128+
.nw = 17,
129+
.ndwdx = 15,
130+
.ndwdp = 0,
131+
.ndwdw = 16,
132+
.ndxdotdw = 7,
133+
.ndJydy = std::vector<int>{1, 1, 1, 1, 1, 1},
134+
.ndxrdatadxsolver = 0,
135+
.ndxrdatadtcl = 0,
136+
.ndtotal_cldx_rdata = 0,
137+
.nnz = 0,
138+
.nJ = 1,
139+
.ubw = 6,
140+
.lbw = 6,
141+
.ndxdotdp_explicit = 0,
142+
.ndxdotdx_explicit = 5,
143+
.w_recursion_depth = 2,
144+
},
145145
amici::SimulationParameters(
146146
std::vector<realtype>{0.28999999999999998, 0.73999999999999999, 0.44, 0.080000000000000002, 0.27000000000000002, 0.17999999999999999}, // fixedParameters
147147
std::vector<realtype>{} // dynamic parameters
@@ -557,7 +557,7 @@ class Model_model_calvetti_py : public amici::Model_DAE {
557557
* @return AMICI git commit hash
558558
*/
559559
std::string getAmiciCommit() const override {
560-
return "dcbbae0f8e9b52afd7ab8b4b7a046da36b907139";
560+
return "570c71d2a041ed15d548e826df3d97e05d124309";
561561
}
562562

563563
bool hasQuadraticLLH() const override {

models/model_dirac_py/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ cmake_policy(VERSION 3.22...3.31)
44

55
project(model_dirac_py)
66

7-
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD 20)
88
set(CMAKE_CXX_STANDARD_REQUIRED ON)
99
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
1010

models/model_dirac_py/model_dirac_py.h

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -110,38 +110,38 @@ class Model_model_dirac_py : public amici::Model_ODE {
110110
*/
111111
Model_model_dirac_py()
112112
: amici::Model_ODE(
113-
amici::ModelDimensions(
114-
2, // nx_rdata
115-
2, // nxtrue_rdata
116-
2, // nx_solver
117-
2, // nxtrue_solver
118-
0, // nx_solver_reinit
119-
4, // np
120-
0, // nk
121-
1, // ny
122-
1, // nytrue
123-
0, // nz
124-
0, // nztrue
125-
1, // nevent
126-
0, // nevent_solver
127-
0, // nspl
128-
1, // nobjective
129-
1, // nw
130-
0, // ndwdx
131-
0, // ndwdp
132-
0, // ndwdw
133-
0, // ndxdotdw
134-
std::vector<int>{1}, // ndjydy
135-
0, // ndxrdatadxsolver
136-
0, // ndxrdatadtcl
137-
0, // ndtotal_cldx_rdata
138-
0, // nnz
139-
2, // ubw
140-
2, // lbw
141-
3, // ndxdotdp_explicit
142-
3, // ndxdotdx_explicit
143-
0 // w_recursion_depth
144-
),
113+
amici::ModelDimensions{
114+
.nx_rdata = 2,
115+
.nxtrue_rdata = 2,
116+
.nx_solver = 2,
117+
.nxtrue_solver = 2,
118+
.nx_solver_reinit = 0,
119+
.np = 4,
120+
.nk = 0,
121+
.ny = 1,
122+
.nytrue = 1,
123+
.nz = 0,
124+
.nztrue = 0,
125+
.ne = 1,
126+
.ne_solver = 0,
127+
.nspl = 0,
128+
.nw = 1,
129+
.ndwdx = 0,
130+
.ndwdp = 0,
131+
.ndwdw = 0,
132+
.ndxdotdw = 0,
133+
.ndJydy = std::vector<int>{1},
134+
.ndxrdatadxsolver = 0,
135+
.ndxrdatadtcl = 0,
136+
.ndtotal_cldx_rdata = 0,
137+
.nnz = 0,
138+
.nJ = 1,
139+
.ubw = 2,
140+
.lbw = 2,
141+
.ndxdotdp_explicit = 3,
142+
.ndxdotdx_explicit = 3,
143+
.w_recursion_depth = 0,
144+
},
145145
amici::SimulationParameters(
146146
std::vector<realtype>{}, // fixedParameters
147147
std::vector<realtype>{1.0, 0.5, 2.0, 3.0} // dynamic parameters
@@ -544,7 +544,7 @@ class Model_model_dirac_py : public amici::Model_ODE {
544544
* @return AMICI git commit hash
545545
*/
546546
std::string getAmiciCommit() const override {
547-
return "dcbbae0f8e9b52afd7ab8b4b7a046da36b907139";
547+
return "570c71d2a041ed15d548e826df3d97e05d124309";
548548
}
549549

550550
bool hasQuadraticLLH() const override {

models/model_events_py/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ cmake_policy(VERSION 3.22...3.31)
44

55
project(model_events_py)
66

7-
set(CMAKE_CXX_STANDARD 17)
7+
set(CMAKE_CXX_STANDARD 20)
88
set(CMAKE_CXX_STANDARD_REQUIRED ON)
99
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
1010

0 commit comments

Comments
 (0)