cortical_surface 6.0.0
cliques.h
Go to the documentation of this file.
1#ifndef AIMS_CLIQUES_H
2#define AIMS_CLIQUES_H
3
4#include <math.h>
5#include <float.h>
7
11
12class Clique{
13 public:
15
16 double energie;
17 short type;
18 std::vector< Site * > blobs;
20 std::map<int, uint> labelscount;
21 std::map<int, std::set<std::string> > subjectscount;
22 double pot;
23
24 double computeEnergy ( bool save, uint CLIQUESNBSUJETS ) {
25 double energy = 0.0;
26 switch ( type ) {
27 case DATADRIVEN:
28 ASSERT( blobs.size() == 1 );
29
30 if ( blobs[0]->label != 0 ) {
31 float measure = blobs[0]->t;
32 if ( measure > ddx1 )
33 energy = ddh;
34 else if ( measure < ddx2 )
35 energy = 1.0;
36 else
37 energy = (1.0 - ddh) / (ddx2 - ddx1) * ( measure - ddx2 ) + 1.0;
38 }
39 else
40 energy = 0.0;
41 energy *= ddweight;
42 energy *= CLIQUESNBSUJETS;
43 break;
44 case BESTLOWERSCALE:
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 )
49 energy = 0.0;
50 else if ( mean_scale > lsx2 )
51 energy = 1.0;
52 else
53 energy = 1.0 / (lsx2 - lsx1) * ( mean_scale - lsx2 ) + 1.0;
54 }
55 else
56 energy = 0.0;
57 energy *= lsweight;
58 energy *= CLIQUESNBSUJETS;
59 break;
61 //std::cout << intrapsweight << std::endl;
62 energy = 0;
63 for ( uint i = 1 ; i < labelscount.size() ; i++ ) {
64 if ( labelscount[i] <= 1 )
65 energy += 0;
66 else
67 energy += intrapsweight * ( labelscount[i] - 1 );
68 }
69 energy *= CLIQUESNBSUJETS;
70 break;
71 case SIMILARITY:
72 ASSERT( blobs.size() == 2 );
73 if ( blobs[0]->label == blobs[1]->label && blobs[0]->label != 0 ) {
74
75 assert ( distance < 0.0 || similarity < 0.0 );
76
77 // MODE OVERLAP
78 if ( similarity > 0.0 ) {
79 if ( similarity > simx2 )
80 energy = -1.0;
81 else if ( similarity < simx1 )
82 energy = 0.0;
83 else
84 energy = (- 1.0) / (simx2 - simx1) * ( similarity - simx2 ) - 1.0;
85 }
86 // MODE DISTANCE
87 else if ( distance > 0.0 ) {
88 if ( distance < simx2 )
89 energy = -1.0;
90 else if ( distance > simx1 )
91 energy = 0.0;
92 else
93 energy = (- 1.0) / (simx2 - simx1) * ( distance - simx2 ) - 1.0;
94 }
95 }
96 else {
97 energy = 0.0;
98 }
99 energy *= simweight;
100 break;
101 case GLOBAL:
102 energy = 0.0;
103 break;
104 }
105 if (save) energie = energy;
106
107 return energy;
108 }
109
110 double updateEnergy ( uint node, int old, bool save, uint CLIQUESNBSUJETS ) {
111
112 double energy = 0.0;
113 float _intrapsweight;
114
115 switch ( type ) {
116 case DATADRIVEN:
117 if ( old == 0 && blobs[0]->label != 0 )
118 energy = computeEnergy ( false, CLIQUESNBSUJETS );
119 else if ( old != 0 && blobs[0]->label == 0 )
120 energy = - energie;
121 break;
122 case BESTLOWERSCALE:
123 if ( old == 0 && blobs[0]->label != 0 )
124 energy = computeEnergy ( false, CLIQUESNBSUJETS );
125 else if ( old != 0 && blobs[0]->label == 0 )
126 energy = -energie;
127 break;
128 case SIMILARITY:
129 ASSERT( (uint)blobs.size()==2 );
130 // ASSERT(((uint)blobs[0]->index == (uint)node || (uint)blobs[1]->index == (uint)node));
131 // if ((uint)blobs[0]->index == (uint)node) index = 0;
132 // else if ((uint)blobs[1]->index == (uint)node) index = 1;
133 if ( fabs(energie) < DBL_EPSILON ) {
134 if ( (uint) blobs[0]->label == (uint) blobs[1]->label && (uint) blobs[0]->label != 0 )
135 energy = computeEnergy ( false, CLIQUESNBSUJETS );
136 }
137 else {
138 if ( ( blobs[0]->label != blobs[1]->label ) || ( blobs[1]->label == 0 || blobs[0]->label == 0 ) )
139 energy = -energie;
140 }
141 break;
143 _intrapsweight = intrapsweight;
144 uint i;
145 for ( i = 0 ; i < blobs.size() && (uint) blobs[i]->index != (uint) node ; i++ )
146 {}
147 ASSERT( i < blobs.size() );
148 if ( old == blobs[i]->label )
149 energy = 0.0;
150 else {
151 if ( old == 0 )
152 energy = 0.0;
153 else if ( labelscount[ old ] > 1 )
154 energy += -_intrapsweight;
155
156 if ( blobs[i]->label == 0 )
157 energy += 0.0;
158 else if ( labelscount[ blobs[i]->label ] > 0 )
159 energy += _intrapsweight;
160 }
161 energy *= CLIQUESNBSUJETS;
162 if ( save ) {
163 labelscount[blobs[i]->label]++;
164 labelscount[old]--;
165 }
166 break;
167 case GLOBAL:
168 uint j, k;
169 for ( j = 0 ; j < blobs.size() && (uint) blobs[j]->index != (uint) node ; j++ )
170 {}
171 ASSERT( j < blobs.size() );
172 k = 0;
173 while ( k < blobs.size() && !(blobs[k]->subject == blobs[j]->subject && blobs[k]->label == old ) ) {
174 k++;
175 }
176 if ( save ) {
177 if ( k == blobs.size() )
178 subjectscount[old].erase(blobs[j]->subject);
179
180 subjectscount[blobs[j]->label].insert(blobs[j]->subject);
181 }
182 break;
183 }
184 if (save) energie += energy;
185 return energy;
186 }
187
189
191
192 static void setParameters ( float _ddweight,
193 float _intrapsweight,
194 float _simweight,
195 float _lsweight,
196 float _ddx1,
197 float _ddx2,
198 float _simx1,
199 float _simx2,
200 float _lsx1,
201 float _lsx2,
202 float _ddh );
203
204 static float getIntraPSWeight() { return intrapsweight; }
205
207 type = UNKNOWN;
208 energie = 0.0;
209 pot = 100.0;
210 blobs = std::vector<Site *>();
211 labelscount = std::map<int,uint>();
212 subjectscount = std::map<int, std::set<std::string> >();
213 }
214
215};
216
217double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2, uint *no_overlap);
218
219void BuildMaximalOrderCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques);
220void BuildDataDrivenCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques);
221void BuildGlobalClique ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques );
222void BuildLowerScaleCliques ( std::vector<Site *> &sites, std::vector<std::vector<int> > &cliquesDuSite, std::vector<Clique> &cliques );
223
224#endif
225
#define ASSERT(EX)
static float ddx2
Definition cliques.h:14
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, std::set< std::string > > subjectscount
Definition cliques.h:21
static float simx2
Definition cliques.h:14
double pot
Definition cliques.h:22
static float simweight
Definition cliques.h:14
double updateEnergy(uint node, int old, bool save, uint CLIQUESNBSUJETS)
Definition cliques.h:110
static float lsweight
Definition cliques.h:14
short type
Definition cliques.h:17
void updateSubjectsCount()
static float ddh
Definition cliques.h:14
static float lsx1
Definition cliques.h:14
static float ddx1
Definition cliques.h:14
double distance
Definition cliques.h:19
static float simx1
Definition cliques.h:14
std::map< int, uint > labelscount
Definition cliques.h:20
double energie
Definition cliques.h:16
std::vector< Site * > blobs
Definition cliques.h:18
static float intrapsweight
Definition cliques.h:14
static float getIntraPSWeight()
Definition cliques.h:204
static float ddweight
Definition cliques.h:14
double similarity
Definition cliques.h:19
void updateLabelsCount()
double computeEnergy(bool save, uint CLIQUESNBSUJETS)
Definition cliques.h:24
Clique()
Definition cliques.h:206
static float lsx2
Definition cliques.h:14
void BuildDataDrivenCliques(std::vector< Site * > &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
void BuildMaximalOrderCliques(std::vector< Site * > &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2, uint *no_overlap)
void BuildLowerScaleCliques(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)
typesCliques
Definition cliques.h:8
@ SIMILARITY
Definition cliques.h:9
@ INTRAPRIMALSKETCH
Definition cliques.h:9
@ UNKNOWN
Definition cliques.h:9
@ BESTLOWERSCALE
Definition cliques.h:9
@ DATADRIVEN
Definition cliques.h:9
@ GLOBAL
Definition cliques.h:9
unsigned int uint