16 namespace mrpt {
namespace srba {
20 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
24 sym.next_edge.clear();
25 sym.all_edges.clear();
29 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
37 " From | Shortest path to:=>Next node to move to [Distance] \n"
38 "--------+-----------------------------------------------------------------\n";
41 s +=
format(
" %6u |",static_cast<unsigned int>(it1->first) );
44 s +=
format(
" %5u:=>%5u [%u] |",static_cast<unsigned int>(it2->first),
static_cast<unsigned int>(it2->second.next), static_cast<unsigned int>(it2->second.distance));
48 "--------+-----------------------------------------------------------------\n";
53 " From | To | Shortest path sequence \n"
54 "--------+--------+--------------------------------------------------------\n";
59 s +=
format(
" %6u | %6u |",static_cast<unsigned int>(it1->first),static_cast<unsigned int>(it2->first) );
63 s +=
format(
" [%4u => %4u] ",static_cast<unsigned int>((*it3)->from),
static_cast<unsigned int>((*it3)->to) );
67 "--------+--------+--------------------------------------------------------\n";
72 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
76 f.open(sFileName.c_str());
77 if (!f.is_open())
return false;
80 this->dump_as_text(s);
82 return !(f << s).fail();
87 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
89 set< pair<string,string> > & all_edges,
93 const map<TKeyFrameID,TSpanTreeEntry> &root_entries,
95 set<TKeyFrameID> &visited,
96 const map<TKeyFrameID,TSpanTreeEntry> &top_root_entries)
103 if (it->second.distance==1 && top_root_entries.find(it->first)!=top_root_entries.end())
107 const string s1 = prefix +
mrpt::format(
"%06u",static_cast<unsigned int>( std::max(root,child) ));
108 const string s2 = prefix +
mrpt::format(
"%06u",static_cast<unsigned int>( std::min(root,child) ));
109 all_edges.insert( make_pair(s1,s2) );
111 if (!visited.count(it->first))
123 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
129 f.open(sFileName.c_str());
130 if (!f.is_open())
return false;
132 vector<next_edge_maps_t::const_iterator> its_to_process;
134 if (kf_roots_to_save.empty())
137 its_to_process.reserve(sym.next_edge.size());
139 its_to_process.push_back(it1);
143 for (
size_t i=0;i<kf_roots_to_save.size();i++)
146 if (it!=sym.next_edge.end())
147 its_to_process.push_back(it);
155 map<size_t, set<string> > kfs_by_depth;
156 map<string, size_t> depth_kf;
159 for (
size_t k=0;k<its_to_process.size();k++)
164 const string sR =
format(
"%06u",static_cast<unsigned int>(root) );
166 const string sNodeDefR = sR +
mrpt::format(
"%06u [label=%u]",static_cast<unsigned int>(root),static_cast<unsigned int>(root));
167 kfs_by_depth[0].insert( sNodeDefR );
168 depth_kf[
mrpt::format(
"%06u%06u",static_cast<unsigned int>(root),static_cast<unsigned int>(root))] = 0;
173 const string sNodeDef = sR +
mrpt::format(
"%06u [label=%u]",static_cast<unsigned int>(it->first),static_cast<unsigned int>(it->first));
174 kfs_by_depth[it->second.distance].insert( sNodeDef );
175 depth_kf[
mrpt::format(
"%06u%06u",static_cast<unsigned int>(root),static_cast<unsigned int>(it->first))] = it->second.distance;
179 for (map<
size_t, set<string> >::
const_iterator it=kfs_by_depth.begin();it!=kfs_by_depth.end();++it)
182 const set<string> & sNodes = it->second;
193 set< pair<string,string> > all_edges;
195 for (
size_t k=0;k<its_to_process.size();k++)
212 ASSERT_(it_eds_id1 != sym.all_edges.end())
214 const std::map<TKeyFrameID, k2k_edge_vector_t> &eds_id1 = it_eds_id1->second;
220 for (
size_t i=0;i<eds.size();i++)
225 const string s1 =
mrpt::format(
"%06u%06u",static_cast<unsigned int>(root),static_cast<unsigned int>( std::max(to,from) ));
226 const string s2 =
mrpt::format(
"%06u%06u",static_cast<unsigned int>(root),static_cast<unsigned int>( std::min(to,from) ));
228 all_edges.insert( make_pair(s1,s2) );
235 for (set< pair<string,string> >::
const_iterator it=all_edges.begin();it!=all_edges.end();++it)
236 s << it->first <<
" -- " << it->second <<
";\n";
239 for (map<
size_t, set<string> >::
const_iterator it=kfs_by_depth.begin();it!=kfs_by_depth.end();++it)
241 const set<string> & sNodes = it->second;
242 if (sNodes.empty())
continue;
244 if (it!=kfs_by_depth.begin())
247 s << it->second.begin()->substr(0,12) <<
" ";
249 if (!kfs_by_depth.empty()) s <<
" [style=invis];\n";
253 return !(f << s.str()).fail();
258 template <
class KF2KF_POSE_TYPE,
class LM_TYPE,
class OBS_TYPE,
class RBA_OPTIONS>
260 size_t &num_nodes_min,
261 size_t &num_nodes_max,
262 double &num_nodes_mean,
263 double &num_nodes_std)
const
270 std::vector<size_t> num_nodes;
271 num_nodes.reserve(sym.next_edge.size());
274 num_nodes.push_back( it1->second.size() );
vec_t::const_iterator const_iterator
kf2kf_pose_traits< KF2KF_POSE_TYPE >::k2k_edge_vector_t k2k_edge_vector_t
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
iterator find(const size_t i)
Constant-time find, returning an iterator to the pair or to end() if not found (that is...
const Scalar * const_iterator
void recursive_print_st_dot(set< pair< string, string > > &all_edges, const string &prefix, const TKeyFrameID came_from, const TKeyFrameID root, const map< TKeyFrameID, TSpanTreeEntry > &root_entries, const typename TRBA_Problem_state< KF2KF_POSE_TYPE, LM_TYPE, OBS_TYPE, RBA_OPTIONS >::TSpanningTree::next_edge_maps_t &all, set< TKeyFrameID > &visited, const map< TKeyFrameID, TSpanTreeEntry > &top_root_entries)
bool save_as_dot_file(const std::string &sFileName, const std::vector< TKeyFrameID > &kf_roots_to_save=std::vector< TKeyFrameID >()) const
Saves all (or a subset of all) the spanning trees If kf_roots_to_save is left empty, all STs are saved.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
void minimum_maximum(const std::vector< T > &V, T &curMin, T &curMax)
Return the maximum and minimum values of a std::vector.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void get_stats(size_t &num_nodes_min, size_t &num_nodes_max, double &num_nodes_mean, double &num_nodes_std) const
Returns min/max and mean/std stats on the number of nodes found on all the spanning trees...
void meanAndStd(const VECTORLIKE &v, double &out_mean, double &out_std, bool unbiased=true)
Computes the standard deviation of a vector.
void clear()
Empty all sym & num data.
void dump_as_text(std::string &s) const
Useful for debugging.
bool dump_as_text_to_file(const std::string &sFileName) const
Useful for debugging.
uint64_t TKeyFrameID
Numeric IDs for key-frames (KFs)