14 static float ddweight,
intrapsweight,
simweight,
lsweight,
ddx1,
ddx2,
simx1,
simx2,
lsx1,
lsx2,
ddh;
28 ASSERT( blobs.size() == 1 );
30 if ( blobs[0]->label != 0 ) {
31 float measure = blobs[0]->t;
34 else if ( measure < ddx2 )
37 energy = (1.0 -
ddh) / (ddx2 - ddx1) * ( measure -
ddx2 ) + 1.0;
42 energy *= CLIQUESNBSUJETS;
45 ASSERT( blobs.size() == 1 );
46 if ( blobs[0]->label != 0 ) {
47 double mean_scale = (blobs[0]->tmax + blobs[0]->tmin) / 2.0;
48 if ( mean_scale < lsx1 )
50 else if ( mean_scale > lsx2 )
53 energy = 1.0 / (lsx2 -
lsx1) * ( mean_scale - lsx2 ) + 1.0;
58 energy *= CLIQUESNBSUJETS;
63 for (
uint i = 1 ; i < labelscount.size() ; i++ ) {
64 if ( labelscount[i] <= 1 )
67 energy += intrapsweight * ( labelscount[i] - 1 );
69 energy *= CLIQUESNBSUJETS;
72 ASSERT( blobs.size() == 2 );
73 if ( blobs[0]->label == blobs[1]->label && blobs[0]->label != 0 ) {
75 assert ( distance < 0.0 || similarity < 0.0 );
78 if ( similarity > 0.0 ) {
79 if ( similarity > simx2 )
81 else if ( similarity < simx1 )
84 energy = (- 1.0) / (simx2 -
simx1) * ( similarity - simx2 ) - 1.0;
87 else if ( distance > 0.0 ) {
88 if ( distance < simx2 )
90 else if ( distance > simx1 )
93 energy = (- 1.0) / (simx2 -
simx1) * ( distance - simx2 ) - 1.0;
105 if (save) energie = energy;
113 float _intrapsweight;
117 if ( old == 0 && blobs[0]->label != 0 )
119 else if ( old != 0 && blobs[0]->label == 0 )
123 if ( old == 0 && blobs[0]->label != 0 )
125 else if ( old != 0 && blobs[0]->label == 0 )
133 if ( fabs(energie) < DBL_EPSILON ) {
134 if ( (
uint) blobs[0]->label == (
uint) blobs[1]->label && (
uint) blobs[0]->label != 0 )
138 if ( ( blobs[0]->label != blobs[1]->label ) || ( blobs[1]->label == 0 || blobs[0]->label == 0 ) )
145 for ( i = 0 ; i < blobs.size() && (
uint) blobs[i]->index != (
uint) node ; i++ )
147 ASSERT( i < blobs.size() );
148 if ( old == blobs[i]->label )
153 else if ( labelscount[ old ] > 1 )
154 energy += -_intrapsweight;
156 if ( blobs[i]->label == 0 )
158 else if ( labelscount[ blobs[i]->label ] > 0 )
159 energy += _intrapsweight;
161 energy *= CLIQUESNBSUJETS;
163 labelscount[blobs[i]->label]++;
169 for ( j = 0 ; j < blobs.size() && (
uint) blobs[j]->index != (
uint) node ; j++ )
171 ASSERT( j < blobs.size() );
173 while ( k < blobs.size() && !(blobs[k]->subject == blobs[j]->subject && blobs[k]->label == old ) ) {
177 if ( k == blobs.size() )
178 subjectscount[old].erase(blobs[j]->subject);
180 subjectscount[blobs[j]->label].insert(blobs[j]->subject);
184 if (save) energie += energy;
193 float _intrapsweight,
210 blobs = std::vector<Site *>();
211 labelscount = std::map<int,uint>();
212 subjectscount = std::map<int, std::set<std::string> >();
217 double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2,
uint *no_overlap);
219 void BuildMaximalOrderCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques);
220 void BuildDataDrivenCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques);
221 void BuildGlobalClique ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques );
222 void BuildLowerScaleCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques );
std::vector< Site *> blobs
double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2, uint *no_overlap)
void BuildMaximalOrderCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
double computeEnergy(bool save, uint CLIQUESNBSUJETS)
static float getIntraPSWeight()
void updateSubjectsCount()
static void setParameters(float _ddweight, float _intrapsweight, float _simweight, float _lsweight, float _ddx1, float _ddx2, float _simx1, float _simx2, float _lsx1, float _lsx2, float _ddh)
std::map< int, uint > labelscount
void BuildLowerScaleCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
std::map< int, std::set< std::string > > subjectscount
double updateEnergy(uint node, int old, bool save, uint CLIQUESNBSUJETS)
static float intrapsweight
void BuildDataDrivenCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
void BuildGlobalClique(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)