12 namespace mrpt {
namespace srba {
20 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
21 template <
class HESS_Ap,
class HESS_f,
class HESS_Apf,
class JACOB_COLUMN_dh_dAp,
class JACOB_COLUMN_dh_df>
26 const std::vector<JACOB_COLUMN_dh_dAp*> & dh_dAp,
27 const std::vector<JACOB_COLUMN_dh_df*> & dh_df)
29 typedef typename HESS_Ap::symbolic_t::THessianSymbolicInfoEntry hess_Ap_sym_entry_t;
30 typedef typename HESS_f::symbolic_t::THessianSymbolicInfoEntry hess_f_sym_entry_t;
31 typedef typename HESS_Apf::symbolic_t::THessianSymbolicInfoEntry hess_Apf_sym_entry_t;
33 const size_t nUnknowns_k2k = dh_dAp.size();
34 const size_t nUnknowns_k2f = dh_df.size();
40 HAp.setColCount (nUnknowns_k2k);
41 for (
size_t i=0;i<nUnknowns_k2k;i++)
43 const JACOB_COLUMN_dh_dAp & col_i = *dh_dAp[i];
49 typename HESS_Ap::symbolic_t & Hii_sym = HAp.getCol(i)[i].sym;
53 const size_t obs_idx = it->first;
55 Hii_sym.lst_jacob_blocks.push_back(
57 &it->second.num, &it->second.num,
58 it->second.sym.is_valid,it->second.sym.is_valid,
66 for (
size_t j=i+1;j<nUnknowns_k2k;j++)
68 const JACOB_COLUMN_dh_dAp & col_j = *dh_dAp[j];
69 ASSERTMSG_(!col_j.empty(),
mrpt::format(
"col_j,i=%u,j=%u empty (nUnknowns_k2k=%u)!",static_cast<unsigned int>(i),static_cast<unsigned int>(j),static_cast<unsigned int>(nUnknowns_k2k)))
78 typename HESS_Ap::symbolic_t Hij_sym;
80 while (it_i!=it_i_end && it_j!=it_j_end)
82 if ( it_i->first < it_j->first ) ++it_i;
83 else if ( it_j->first < it_i->first ) ++it_j;
87 const size_t obs_idx = it_i->first;
89 Hij_sym.lst_jacob_blocks.push_back(
91 &it_i->second.num, &it_j->second.num,
92 it_i->second.sym.is_valid,it_j->second.sym.is_valid,
102 if (!Hij_sym.lst_jacob_blocks.empty())
103 Hij_sym.lst_jacob_blocks.swap( HAp.getCol(j)[i].sym.lst_jacob_blocks );
112 Hf.setColCount (nUnknowns_k2f);
113 for (
size_t i=0;i<nUnknowns_k2f;i++)
115 const JACOB_COLUMN_dh_df & col_i = *dh_df[i];
121 typename HESS_f::symbolic_t & Hii_sym = Hf.getCol(i)[i].sym;
125 const size_t obs_idx = it->first;
127 Hii_sym.lst_jacob_blocks.push_back(
129 &it->second.num, &it->second.num,
130 it->second.sym.is_valid,it->second.sym.is_valid,
138 for (
size_t j=i+1;j<nUnknowns_k2f;j++)
140 const JACOB_COLUMN_dh_df & col_j = *dh_df[j];
150 typename HESS_f::symbolic_t Hij_sym;
152 while (it_i!=it_i_end && it_j!=it_j_end)
154 if ( it_i->first < it_j->first ) ++it_i;
155 else if ( it_j->first < it_i->first ) ++it_j;
159 const size_t obs_idx = it_i->first;
161 Hij_sym.lst_jacob_blocks.push_back(
163 &it_i->second.num, &it_j->second.num,
164 it_i->second.sym.is_valid,it_j->second.sym.is_valid,
174 if (!Hij_sym.lst_jacob_blocks.empty())
175 Hij_sym.lst_jacob_blocks.swap( Hf.getCol(j)[i].sym.lst_jacob_blocks );
188 HApf.setColCount(nUnknowns_k2k);
189 for (
size_t i=0;i<nUnknowns_k2k;i++)
191 const JACOB_COLUMN_dh_dAp & col_i = *dh_dAp[i];
195 for (
size_t j=0;j<nUnknowns_k2f;j++)
197 const JACOB_COLUMN_dh_df & col_j = *dh_df[j];
207 typename HESS_Apf::symbolic_t Hij_sym;
209 while (it_i!=it_i_end && it_j!=it_j_end)
211 if ( it_i->first < it_j->first ) ++it_i;
212 else if ( it_j->first < it_i->first ) ++it_j;
216 const size_t obs_idx = it_i->first;
218 Hij_sym.lst_jacob_blocks.push_back(
219 hess_Apf_sym_entry_t(
220 &it_i->second.num, &it_j->second.num,
221 it_i->second.sym.is_valid,it_j->second.sym.is_valid,
231 if (!Hij_sym.lst_jacob_blocks.empty())
232 Hij_sym.lst_jacob_blocks.swap( HApf.getCol(i)[j].sym.lst_jacob_blocks );
const Scalar * const_iterator
static void sparse_hessian_build_symbolic(HESS_Ap &HAp, HESS_f &Hf, HESS_Apf &HApf, const std::vector< JACOB_COLUMN_dh_dAp * > &dh_dAp, const std::vector< JACOB_COLUMN_dh_df * > &dh_df)
Rebuild the Hessian symbolic information from the given Jacobians.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define ASSERTMSG_(f, __ERROR_MSG)