feat(core): extend AD/IA/McCormick tape to handle preserved array mod… · modelscript/modelscript@1c807e9 · GitHub
Skip to content

Commit 1c807e9

Browse files
committed
feat(core): extend AD/IA/McCormick tape to handle preserved array mode via element-wise unrolling
1 parent 48e3c7b commit 1c807e9

3 files changed

Lines changed: 114 additions & 4 deletions

File tree

‎packages/core/src/compiler/modelica/ad-codegen.ts‎

Lines changed: 71 additions & 1 deletion

‎packages/core/src/compiler/modelica/ad-jacobian.ts‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,25 @@ export function buildAdJacobian(dae: ModelicaDAE): ((t: number, y: number[]) =>
167167
// Gather derivative equations: der(x) = f(x, u)
168168
const derEqs: { state: string; rhs: ModelicaExpression }[] = [];
169169
for (const eq of dae.equations) {
170-
if (eq instanceof ModelicaArrayEquation) continue;
171170
if (!("expression1" in eq && "expression2" in eq)) continue;
172171
const se = eq as { expression1: ModelicaExpression; expression2: ModelicaExpression };
173172
const ld = extractDer(se.expression1);
174173
const rd = extractDer(se.expression2);
174+
175+
if (eq instanceof ModelicaArrayEquation) {
176+
// Unroll array equation element-wise
177+
const baseName = ld || rd;
178+
if (!baseName) continue;
179+
const rhs = ld ? se.expression2 : se.expression1;
180+
const v = dae.variables.find((dv) => dv.name === baseName);
181+
const dims = v?.arrayDimensions ?? [];
182+
const size = dims.length > 0 ? dims.reduce((a: number, b: number) => a * b, 1) : 1;
183+
for (let i = 0; i < size; i++) {
184+
derEqs.push({ state: `${baseName}[${i + 1}]`, rhs });
185+
}
186+
continue;
187+
}
188+
175189
if (ld) derEqs.push({ state: ld, rhs: se.expression2 });
176190
else if (rd) derEqs.push({ state: rd, rhs: se.expression1 });
177191
}

‎packages/core/src/compiler/modelica/sparse.ts‎

Lines changed: 28 additions & 2 deletions

0 commit comments

Comments
 (0)