cortical_surface  5.0.5
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 
10 };
11 
12 class 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;
60  case INTRAPRIMALSKETCH:
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;
142  case INTRAPRIMALSKETCH:
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 
188  void updateLabelsCount();
189 
190  void updateSubjectsCount();
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 
206  Clique() {
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 
217 double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2, uint *no_overlap);
218 
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 );
223 
224 #endif
225 
static float simx2
Definition: cliques.h:14
static float lsx2
Definition: cliques.h:14
Clique()
Definition: cliques.h:206
static float lsweight
Definition: cliques.h:14
std::vector< Site *> blobs
Definition: cliques.h:18
static float ddx1
Definition: cliques.h:14
double getOverlap(Point3df bbmin1, Point3df bbmax1, Point3df bbmin2, Point3df bbmax2, uint *no_overlap)
void updateLabelsCount()
static float simx1
Definition: cliques.h:14
void BuildMaximalOrderCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
Definition: cliques.h:12
double computeEnergy(bool save, uint CLIQUESNBSUJETS)
Definition: cliques.h:24
double pot
Definition: cliques.h:22
double distance
Definition: cliques.h:19
double energie
Definition: cliques.h:16
static float getIntraPSWeight()
Definition: cliques.h:204
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)
typesCliques
Definition: cliques.h:8
static float ddh
Definition: cliques.h:14
std::map< int, uint > labelscount
Definition: cliques.h:20
static float ddx2
Definition: cliques.h:14
Definition: cliques.h:9
static float simweight
Definition: cliques.h:14
static float lsx1
Definition: cliques.h:14
unsigned int uint
void BuildLowerScaleCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
std::map< int, std::set< std::string > > subjectscount
Definition: cliques.h:21
static float ddweight
Definition: cliques.h:14
double updateEnergy(uint node, int old, bool save, uint CLIQUESNBSUJETS)
Definition: cliques.h:110
static float intrapsweight
Definition: cliques.h:14
short type
Definition: cliques.h:17
#define ASSERT(EX)
Definition: cliques.h:9
void BuildDataDrivenCliques(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)
double similarity
Definition: cliques.h:19
void BuildGlobalClique(std::vector< Site *> &sites, std::vector< std::vector< int > > &cliquesDuSite, std::vector< Clique > &cliques)