diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index 3752d0190d2eb1089689382e67ef4815e407de50..8eb6d38ef08f8efeebd3e5b236ad7fa09a648092 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -2354,7 +2354,7 @@ DynamicModel::computeChainRuleJacobian() break; } - if (d != Zero) + if (d != Zero && eq >= nb_recursives) blocks_derivatives[blk][{ eq, var, lag }] = d; } @@ -2369,9 +2369,8 @@ DynamicModel::computeChainRuleJacobian() for (const auto &[indices, d1] : blocks_derivatives[blk]) { auto &[eq, var, lag] { indices }; - assert(lag >= -1 && lag <= 1); - if (eq >= nb_recursives && var >= nb_recursives - && !(one_boundary && lag != 0)) + assert(lag >= -1 && lag <= 1 && eq >= nb_recursives); + if (var >= nb_recursives && !(one_boundary && lag != 0)) blocks_jacobian_sparse_column_major_order[blk].try_emplace({eq-nb_recursives, var-nb_recursives+static_cast<int>(!one_boundary)*(lag+1)*mfs_size}, d1); } blocks_jacobian_sparse_colptr[blk] = computeCSCColPtr(blocks_jacobian_sparse_column_major_order[blk], (one_boundary ? 1 : 3)*mfs_size); diff --git a/src/ModelTree.hh b/src/ModelTree.hh index aa0f6fd8971fa5bcb575d2dd8656a7e7487f16d2..d7cdea22df167fdc13c22c47adde932fcc507aeb 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -1776,7 +1776,8 @@ ModelTree::writeBlockBytecodeHelper(BytecodeWriter &code_file, int block, tempor const auto &[eq, var, lag] {indices}; int eqr {getBlockEquationID(block, eq)}; int varr {getBlockVariableID(block, var)}; - if (eq >= block_recursive && var >= block_recursive) + assert(eq >= block_recursive); + if (var >= block_recursive) { if constexpr(dynamic) if (lag != 0 @@ -1837,10 +1838,11 @@ ModelTree::writeBlockBytecodeHelper(BytecodeWriter &code_file, int block, tempor int varr {getBlockVariableID(block, var)}; code_file << FNUMEXPR_{ExpressionType::FirstEndoDerivative, eqr, varr, lag}; d->writeBytecodeOutput(code_file, output_type, temporary_terms_union, blocks_temporary_terms_idxs, tef_terms); + assert(eq >= block_recursive); if constexpr(dynamic) - code_file << FSTPG3_{eq, var, lag, getBlockJacobianEndoCol(block, var, lag)}; + code_file << FSTPG3_{eq-block_recursive, var, lag, getBlockJacobianEndoCol(block, var, lag)}; else - code_file << FSTPG2_{eq, getBlockJacobianEndoCol(block, var, lag)}; + code_file << FSTPG2_{eq-block_recursive, getBlockJacobianEndoCol(block, var, lag)}; } // Update jump offset for previous JMP