36 #ifndef GMM_DOMAIN_DECOMP_H__
37 #define GMM_DOMAIN_DECOMP_H__
49 template <
typename Matrix,
typename Po
int>
53 std::vector<Matrix> &vB) {
54 typedef typename linalg_traits<Matrix>::value_type value_type;
55 typedef abstract_null_type void_type;
56 typedef std::map<size_type, void_type> map_type;
58 size_type nbpts = pts.size();
59 if (!nbpts || pts[0].size() == 0) { vB.resize(0);
return; }
60 int dim = int(pts[0].size());
63 Point pmin = pts[0], pmax = pts[0];
64 for (size_type i = 1; i < nbpts; ++i)
65 for (
int k = 0; k < dim; ++k) {
66 pmin[k] = std::min(pmin[k], pts[i][k]);
67 pmax[k] = std::max(pmax[k], pts[i][k]);
70 std::vector<size_type> nbsub(dim),
mult(dim);
71 std::vector<int> pts1(dim), pts2(dim);
72 size_type nbtotsub = 1;
73 for (
int k = 0; k < dim; ++k) {
74 nbsub[k] =
size_type((pmax[k] - pmin[k]) / msize)+1;
75 mult[k] = nbtotsub; nbtotsub *= nbsub[k];
78 std::vector<map_type> subs(nbtotsub);
80 std::vector<size_type> ns(dim), na(dim), nu(dim);
81 for (size_type i = 0; i < nbpts; ++i) {
82 for (
int k = 0; k < dim; ++k) {
83 double a = (pts[i][k] - pmin[k]) / msize;
85 pts1[k] = int(a + overlap); pts2[k] = int(ceil(a-1.0-overlap));
90 for (
int k = 0; k < dim; ++k)
91 if ((ns[k] >= nbsub[k]) || (pts1[k] <
int(ns[k]))
92 || (pts2[k] >
int(ns[k]))) { ok =
false;
break; }
94 size_type ind = ns[0];
95 for (
int k=1; k < dim; ++k) ind += ns[k]*
mult[k];
96 subs[ind][i] = void_type();
98 for (
int k = 0; k < dim; ++k) {
99 if (na[k] < 2) { na[k]++; ns[k]++; ++sum;
break; }
100 na[k] = 0; ns[k] -= 2; sum -= 2;
105 size_type nbmaxinsub = 0;
106 for (size_type i = 0; i < nbtotsub; ++i)
107 nbmaxinsub = std::max(nbmaxinsub, subs[i].size());
109 std::fill(ns.begin(), ns.end(), size_type(0));
110 for (size_type i = 0; i < nbtotsub; ++i) {
111 if (subs[i].size() > 0 && subs[i].size() < nbmaxinsub / 10) {
113 for (
int k = 0; k < dim; ++k) nu[k] = ns[k];
114 size_type nbmax = 0, imax = 0;
116 for (
int l = 0; l < dim; ++l) {
118 for (
int m = 0; m < 2; ++m, nu[l]+=2) {
120 for (
int k = 0; k < dim && ok; ++k)
121 if (nu[k] >= nbsub[k]) ok =
false;
123 size_type ind = ns[0];
124 for (
int k=1; k < dim; ++k) ind += ns[k]*
mult[k];
125 if (subs[ind].size() > nbmax)
126 { nbmax = subs[ind].size(); imax = ind; }
132 if (nbmax > subs[i].size()) {
133 for (map_type::iterator it=subs[i].begin(); it!=subs[i].end(); ++it)
134 subs[imax][it->first] = void_type();
138 for (
int k = 0; k < dim; ++k)
139 { ns[k]++;
if (ns[k] < nbsub[k])
break; ns[k] = 0; }
144 for (size_type i = 0; i < nbtotsub; ++i) {
145 if (subs[i].size() > 0)
146 {
if (i != effnb) std::swap(subs[i], subs[effnb]); ++effnb; }
152 for (size_type i = 0; i < effnb; ++i) {
153 clear(vB[i]);
resize(vB[i], nbpts, subs[i].size());
155 for (map_type::iterator it=subs[i].begin(); it!=subs[i].end(); ++it, ++j)
156 vB[i](it->first, j) = value_type(1);
void clear(L &l)
clear (fill with zeros) a vector or matrix.
void resize(V &v, size_type n)
*/
void mult(const L1 &l1, const L2 &l2, L3 &l3)
*/
void rudimentary_regular_decomposition(std::vector< Point > pts, double msize, double overlap, std::vector< Matrix > &vB)
This function separates into small boxes of size msize with a ratio of overlap (in [0,...
Include the base gmm files.
size_t size_type
used as the common size type in the library