28 #ifndef CBINARYRELATION_H_
29 #define CBINARYRELATION_H_
39 namespace mrpt {
namespace math {
54 typedef typename detail::MatrixWrapper<U,UIsObject>::MatrixType
MatrixType;
73 template<
typename FunctionType>
inline void applyFunction(FunctionType fun,
size_t e1,
size_t e2,
const T &T1,
const T &T2) {
74 detail::applyFunction<T,U,UIsObject,FunctionType>(*
this,fun,e1,e2,T1,T2);
93 for (
size_t i=0;i<
elements.size();++i,++it) {
103 for (
size_t i=0;i<
elements.size();++i,++it) {
107 for (
size_t j=i+1;j<
elements.size();++j,++jt) {
143 if (it1==e||it2==e)
return false;
153 if (it1==e||it2==e)
throw std::domain_error(
"Element not found");
163 if (it1==e||it2==e)
throw std::domain_error(
"Element not found");
229 if (it==e)
throw std::domain_error(
"Element not found");
239 if (it==e)
throw std::domain_error(
"Element not found");
247 std::copy(access.
begin(),access.
end(),vec.begin());
252 if (it==e)
throw std::domain_error(
"Element not found");
261 if (it==e)
throw std::domain_error(
"Element not found");
271 if (it==e)
throw std::domain_error(
"Element not found");
279 std::copy(access.
begin(),access.
end(),vec.begin());
284 if (it==e)
throw std::domain_error(
"Element not found");
305 if (it==e)
return false;
313 set<size_t> positions;
325 return positions.size();
328 relation.removeRowsAndCols(poss,poss);
329 for (set<size_t>::const_reverse_iterator it=poss.rbegin();it!=poss.rend();++it) {
331 std::advance(it2,*it);
343 std::multiset<size_t> newEls;
345 relation.insertRowsAndCols(newEls,newEls);
346 return std::make_pair(
true,dist);
347 }
else return std::make_pair(
false,dist);
352 template<
typename FunctionType> std::pair<bool,size_t>
insertElement(
const T &el,FunctionType fun) {
354 size_t pos=ins.second;
355 for (
size_t i=0;i<
elements.size();++i) {
366 if (els.empty())
return 0;
370 std::vector<size_t> added;
372 added.reserve(els.size());
377 added.push_back(dist);
382 std::sort(added.begin(),added.end());
383 for (
size_t j=1;j<added.size();++j) added[j]-=j;
384 std::multiset<size_t> poss(added.begin(),added.end());
385 relation.insertRowsAndCols(poss,poss);
391 template<
typename FunctionType>
size_t insertElements(
const std::set<T> &els,FunctionType fun) {
392 if (els.empty())
return 0;
394 std::set<size_t> poss;
400 std::set<size_t> nPoss;
402 for (
size_t i=0;i<
elements.size();++i)
if (std::find(begin,
end,i)==
end) nPoss.insert(i);
403 vector<const T *> proxy;
404 proxy.reserve(poss.size());
407 proxy.push_back(&e1);
424 relation.setSize(newEls.size(),newEls.size());
436 template<
typename T,
typename U,
bool UIsObject,
typename FunctionType>
inline void applyFunction(
CBinaryRelation<T,U,UIsObject> &o, FunctionType fun,
size_t e1,
size_t e2,
const T &T1,
const T &T2) {
442 template<
typename T,
typename U,
bool UIsObject>
inline void applyFunction(
CBinaryRelation<T,U,UIsObject> &o,
typename CBinaryRelation<T,U,UIsObject>::FunctionByReferencePass fun,
size_t e1,
size_t e2,
const T &T1,
const T &T2) {