diff --git a/src/ModelTree.hh b/src/ModelTree.hh index cd936ca069d5416739a0e018e7747a94ada52ad2..01e401d5a5f8a1cf5ec852d2852285eb380e386d 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -2497,15 +2497,12 @@ ModelTree::writeSparseModelMFiles(const string &basename) const // Residuals (non-block) open_file(private_m_dir / (prefix + "resid_tt.m")); output << "function [T_order, T] = " << prefix << "resid_tt(y, x, params" << ss_arg << ", T_order, T)" << endl - << "if isempty(T_order)" << endl - << " T_order = -1;" << endl - << " T = NaN(" << ttlen << ", 1);" << endl - << "else if T_order >= 0" << endl + << "if T_order >= 0" << endl << " return" << endl << "end" << endl << "T_order = 0;" << endl << "if size(T, 1) < " << ttlen << endl - << " T = resize(T, " << ttlen << ", 1);" << endl + << " T = [T; NaN(" << ttlen << " - size(T, 1), 1)];" << endl << "end" << endl << tt_sparse_output[0].str() << "end" << endl; @@ -2513,7 +2510,11 @@ ModelTree::writeSparseModelMFiles(const string &basename) const open_file(m_dir / (prefix + "resid.m")); output << "function [residual, T_order, T] = " << prefix << "resid(y, x, params" << ss_arg << ", T_order, T)" << endl - << "[T_order, T] = " << full_prefix << "resid_tt(y, x, params" << ss_arg << ", T_order, T);" << endl + << "if nargin < " << 5+static_cast<int>(dynamic) << endl + << " T_order = -1;" << endl + << " T = NaN(" << ttlen << ", 1);" << endl + << "end" << endl + << "[T_order, T] = " << prefix << "resid_tt(y, x, params" << ss_arg << ", T_order, T);" << endl << "residual = NaN(" << equations.size() << ", 1);" << endl << d_sparse_output[0].str(); if constexpr(!dynamic) @@ -2528,16 +2529,13 @@ ModelTree::writeSparseModelMFiles(const string &basename) const open_file(private_m_dir / (prefix + "g1_tt.m")); output << "function [T_order, T] = " << prefix << "g1_tt(y, x, params" << ss_arg << ", T_order, T)" << endl - << "if isempty(T_order)" << endl - << " T_order = -1;" << endl - << " T = NaN(" << ttlen << ", 1);" << endl - << "else if T_order >= 1" << endl + << "if T_order >= 1" << endl << " return" << endl << "end" << endl - << "[T_order, T] = " << full_prefix << "resid_tt(y, x, params" << ss_arg << ", T_order, T);" << endl + << "[T_order, T] = " << prefix << "resid_tt(y, x, params" << ss_arg << ", T_order, T);" << endl << "T_order = 1;" << endl << "if size(T, 1) < " << ttlen << endl - << " T = resize(T, " << ttlen << ", 1);" << endl + << " T = [T; NaN(" << ttlen << " - size(T, 1), 1)];" << endl << "end" << endl << tt_sparse_output[1].str() << "end" << endl; @@ -2546,7 +2544,11 @@ ModelTree::writeSparseModelMFiles(const string &basename) const open_file(m_dir / (prefix + "g1.m")); // NB: At first order, sparse indices are passed as extra arguments output << "function [g1, T_order, T] = " << prefix << "g1(y, x, params" << ss_arg << ", sparse_rowval, sparse_colval, sparse_colptr, T_order, T)" << endl - << "[T_order, T] = " << full_prefix << "g1_tt(y, x, params" << ss_arg << ", T_order, T);" << endl + << "if nargin < " << 8+static_cast<int>(dynamic) << endl + << " T_order = -1;" << endl + << " T = NaN(" << ttlen << ", 1);" << endl + << "end" << endl + << "[T_order, T] = " << prefix << "g1_tt(y, x, params" << ss_arg << ", T_order, T);" << endl << "g1_v = NaN(" << jacobian_sparse_column_major_order.size() << ", 1);" << endl << d_sparse_output[1].str(); if constexpr(!dynamic) @@ -2569,16 +2571,13 @@ ModelTree::writeSparseModelMFiles(const string &basename) const open_file(private_m_dir / (prefix + "g" + to_string(i) + "_tt.m")); output << "function T = " << prefix << "g" << i << "_tt(y, x, params" << ss_arg << ")" << endl - << "if isempty(T_order)" << endl - << " T_order = -1;" << endl - << " T = NaN(" << ttlen << ", 1);" << endl - << "else if T_order >= " << i << endl + << "if T_order >= " << i << endl << " return" << endl << "end" << endl - << "[T_order, T] = " << full_prefix << "g" << i-1 << "_tt(y, x, params" << ss_arg << ", T_order, T);" << endl + << "[T_order, T] = " << prefix << "g" << i-1 << "_tt(y, x, params" << ss_arg << ", T_order, T);" << endl << "T_order = " << i << ";" << endl << "if size(T, 1) < " << ttlen << endl - << " T = resize(T, " << ttlen << ", 1);" << endl + << " T = [T; NaN(" << ttlen << " - size(T, 1), 1)];" << endl << "end" << endl << tt_sparse_output[i].str() << "end" << endl; @@ -2586,7 +2585,11 @@ ModelTree::writeSparseModelMFiles(const string &basename) const open_file(m_dir / (prefix + "g" + to_string(i) + ".m")); output << "function [g" << i << "_v, T_order, T] = " << prefix << "g" << i << "(y, x, params" << ss_arg << ", T_order, T)" << endl - << "[T_order, T] = " << full_prefix << "g" << i << "_tt(y, x, params" << ss_arg << ", T_order, T);" << endl + << "if nargin < " << 5+static_cast<int>(dynamic) << endl + << " T_order = -1;" << endl + << " T = NaN(" << ttlen << ", 1);" << endl + << "end" << endl + << "[T_order, T] = " << prefix << "g" << i << "_tt(y, x, params" << ss_arg << ", T_order, T);" << endl << "g" << i << "_v = NaN(" << derivatives[i].size() << ", 1);" << endl << d_sparse_output[i].str() << "end" << endl;