11 #ifndef PRIMATOLOGIST_PROBA_PROBA_D_H
12 #define PRIMATOLOGIST_PROBA_PROBA_D_H
16 #include <aims/math/mathelem.h>
17 #include <aims/vector/vector.h>
18 #include <cartodata/volume/volume.h>
33 double attenuate(
double proba,
float alpha,
int n )
37 else if( alpha == 0. )
40 return proba * (double)alpha + ( 1. - (
double)alpha ) / n;
43 template <
typename P,
typename M>
47 const carto::VolumeRef<M> & mask )
51 int n = proba.getSizeT();
52 for(
int z = 0; z < proba.getSizeZ(); ++z )
53 for(
int y = 0; y < proba.getSizeY(); ++y )
54 for(
int x = 0; x < proba.getSizeX(); ++x )
55 if( !mask.get() || mask( x, y, z ) != 0 )
56 for(
int t = 0; t < proba.getSizeT(); ++t )
57 proba(x, y, z, t) =
attenuate( proba(x, y, z, t), alpha, n );
64 attenuate( carto::VolumeRef<P> & proba,
float alpha )
66 return attenuate( proba, alpha, vol::empty<int>() );
69 template <
typename P,
typename M>
73 const carto::VolumeRef<M> & mask )
75 carto::VolumeRef<P> copy = proba.copy();
84 carto::VolumeRef<P> copy = proba.copy();
89 template <
typename P,
typename M>
93 const carto::VolumeRef<M> & mask )
97 int n = proba.getSizeT();
99 for(
int z = 0; z < proba.getSizeZ(); ++z )
100 for(
int y = 0; y < proba.getSizeY(); ++y )
101 for(
int x = 0; x < proba.getSizeX(); ++x )
102 if( !mask.get() || mask( x, y, z ) != 0 )
105 for(
int t = 0; t < proba.getSizeT(); ++t ) {
106 proba( x, y, z, t ) = std::pow( (
double)proba( x, y, z, t ), (
double)alpha );
107 sum += proba( x, y, z, t );
110 for(
int t = 0; t < proba.getSizeT(); ++t )
111 proba( x, y, z, t ) /=
sum;
113 for(
int t = 0; t < proba.getSizeT(); ++t )
114 proba( x, y, z, t ) = 1./n;
120 template <
typename P>
121 carto::VolumeRef<P> &
124 return attenuateZ( proba, alpha, vol::empty<int>() );
127 template <
typename P,
typename M>
131 const carto::VolumeRef<M> & mask )
133 carto::VolumeRef<P> copy = proba.copy();
138 template <
typename P>
142 carto::VolumeRef<P> copy = proba.copy();
149 template <
typename P,
typename M>
150 carto::VolumeRef<P> &
152 const carto::VolumeRef<M> & mask )
155 int n = proba.getSizeT();
156 for(
int z = 0; z < proba.getSizeZ(); ++z )
157 for(
int y = 0; y < proba.getSizeY(); ++y )
158 for(
int x = 0; x < proba.getSizeX(); ++x )
159 if( !mask.get() || mask( x, y, z ) != 0 )
162 for(
int t = 0; t < proba.getSizeT(); ++t )
163 sum += proba( x, y, z, t );
165 for(
int t = 0; t < proba.getSizeT(); ++t )
166 proba( x, y, z, t ) /=
sum;
168 for(
int t = 0; t < proba.getSizeT(); ++t )
169 proba( x, y, z, t ) = 1./n;
174 template <
typename P>
175 carto::VolumeRef<P> &
178 return normalize( proba, vol::empty<int>() );
181 template <
typename P,
typename M>
184 const carto::VolumeRef<M> & mask )
186 carto::VolumeRef<P> copy = proba.copy();
191 template <
typename P>
195 carto::VolumeRef<P> copy = proba.copy();
203 template <
typename P,
typename I,
typename M,
typename Distrib>
204 carto::VolumeRef<P> &
205 pdf(
const std::vector<Distrib> & param,
206 const carto::VolumeRef<I> & values,
207 carto::VolumeRef<P> & output,
208 const carto::VolumeRef<M> & mask )
210 output.reallocate( values.getSizeX(), values.getSizeY(),
211 values.getSizeZ(), param.size() );
212 for(
int z = 0; z < output.getSizeZ(); ++z )
213 for(
int y = 0; y < output.getSizeY(); ++y )
214 for(
int x = 0; x < output.getSizeX(); ++x )
215 if( !mask.get() || mask(x, y, z) != 0 )
217 for(
int t = 0; t < output.getSizeT(); ++t )
218 output(x, y, z, t) = (P)param[t].
pdf( (
double)values(x, y, z) );
223 template <
typename P,
typename I,
typename Distrib>
224 carto::VolumeRef<P> &
225 pdf(
const std::vector<Distrib> & param,
226 const carto::VolumeRef<I> & values,
227 carto::VolumeRef<P> & output )
229 return pdf( param, values, output, vol::empty<int>() );
232 template <
typename P,
typename I,
typename M,
typename Distrib>
234 newPdf(
const std::vector<Distrib> & param,
235 const carto::VolumeRef<I> & values,
236 const carto::VolumeRef<M> & mask )
238 carto::VolumeRef<P> output;
239 output.copyHeaderFrom( values.header() );
240 pdf( param, values, output, mask );
244 template <
typename P,
typename I,
typename Distrib>
246 newPdf(
const std::vector<Distrib> & param,
247 const carto::VolumeRef<I> & values )
249 return newPdf<P>( param, values, vol::empty<int>() );
254 template <
typename OP,
typename P1,
typename P2,
typename M>
255 carto::VolumeRef<OP> &
256 bayes(
const carto::VolumeRef<P1> & conditional,
257 const std::vector<P2> & prior,
258 carto::VolumeRef<OP> & output,
259 const carto::VolumeRef<M> & mask )
261 if( conditional.getSizeT() != prior.size() )
262 throw std::invalid_argument(
"aims::proba::bayes: conditional and prior "
263 "should have similar number of classes" );
265 output.reallocate( conditional.getSizeX(), conditional.getSizeY(),
266 conditional.getSizeZ(), conditional.getSizeT() );
268 for(
int z = 0; z < output.getSizeZ(); ++z )
269 for(
int y = 0; y < output.getSizeY(); ++y )
270 for(
int x = 0; x < output.getSizeX(); ++x )
271 if( !mask.get() || mask(x, y, z) != 0 )
274 for(
int t = 0; t < output.getSizeT(); ++t )
275 output(x, y, z, t) = conditional( x, y, z, t ) * prior[t];
280 template <
typename OP,
typename P1,
typename P2>
281 carto::VolumeRef<OP> &
282 bayes(
const carto::VolumeRef<P1> & conditional,
283 const std::vector<P2> & prior,
284 carto::VolumeRef<OP> & output)
286 return bayes( conditional, prior, output, vol::empty<int>() );
289 template <
typename OP,
typename P1,
typename P2,
typename M>
291 newBayes(
const carto::VolumeRef<P1> & conditional,
292 const std::vector<P2> & prior,
293 const carto::VolumeRef<M> & mask )
295 carto::VolumeRef<OP> output;
296 output.copyHeaderFrom( conditional.header() );
297 return bayes( conditional, prior, output, mask );
300 template <
typename OP,
typename P1,
typename P2>
302 newBayes(
const carto::VolumeRef<P1> & conditional,
303 const std::vector<P2> & prior )
305 return newBayes<OP>( conditional, prior, vol::empty<int>() );
310 template <
typename OP,
typename P1,
typename P2,
typename M>
311 carto::VolumeRef<OP> &
312 bayes(
const carto::VolumeRef<P1> & conditional,
313 const carto::VolumeRef<P2> & prior,
314 carto::VolumeRef<OP> & output,
315 const carto::VolumeRef<M> & mask )
317 if( conditional.getSizeX() != prior.getSizeX() ||
318 conditional.getSizeY() != prior.getSizeY() ||
319 conditional.getSizeZ() != prior.getSizeZ() ||
320 conditional.getSizeT() != prior.getSizeT() )
321 throw std::invalid_argument(
"aims::proba::bayes: conditional and prior "
322 "volumes should have similar dimensions" );
324 output.reallocate( prior.getSizeX(), prior.getSizeY(),
325 prior.getSizeZ(), prior.getSizeT() );
327 for(
int z = 0; z < output.getSizeZ(); ++z )
328 for(
int y = 0; y < output.getSizeY(); ++y )
329 for(
int x = 0; x < output.getSizeX(); ++x )
330 if( !mask.get() || mask(x, y, z) != 0 )
333 for(
int t = 0; t < output.getSizeT(); ++t )
334 output(x, y, z, t) = conditional( x, y, z, t ) * prior( x, y, z, t );
339 template <
typename OP,
typename P1,
typename P2>
340 carto::VolumeRef<OP> &
341 bayes(
const carto::VolumeRef<P1> & conditional,
342 const carto::VolumeRef<P2> & prior,
343 carto::VolumeRef<OP> & output)
345 return bayes( conditional, prior, output, vol::empty<int>() );
348 template <
typename OP,
typename P1,
typename P2,
typename M>
350 newBayes(
const carto::VolumeRef<P1> & conditional,
351 const carto::VolumeRef<P2> & prior,
352 const carto::VolumeRef<M> & mask )
354 carto::VolumeRef<OP> output;
355 output.copyHeaderFrom( prior.header() );
356 return bayes( conditional, prior, output, mask );
359 template <
typename OP,
typename P1,
typename P2>
361 newBayes(
const carto::VolumeRef<P1> & conditional,
362 const carto::VolumeRef<P2> & prior )
364 return newBayes<OP>( conditional, prior, vol::empty<int>() );
370 template <
typename P>
373 bool operator() (
const std::pair<int,P> & a,
const std::pair<int,P> & b )
const
375 return a.second > b.second;
382 template <
typename OP,
typename P1,
typename P2,
typename M>
383 carto::VolumeRef<OP> &
385 const carto::VolumeRef<P1> & conditional,
386 const std::vector<P2> & prior,
387 carto::VolumeRef<OP> & output,
388 const carto::VolumeRef<M> & mask )
390 if( conditional.getSizeT() != prior.size() )
391 throw std::invalid_argument(
"aims::proba::bayes: conditional and prior "
392 "should have similar number of classes" );
394 output.reallocate( conditional.getSizeX(), conditional.getSizeY(),
395 conditional.getSizeZ(), conditional.getSizeT() );
396 std::vector<std::pair<int,P2> > sorted( prior.size() );
397 for(
int t = 0; t < prior.size(); ++t ) {
399 sorted[t].second = prior[t];
403 for(
int z = 0; z < output.getSizeZ(); ++z )
404 for(
int y = 0; y < output.getSizeY(); ++y )
405 for(
int x = 0; x < output.getSizeX(); ++x )
406 if( !mask.get() || mask(x, y, z) != 0 )
409 for(
int t = 0; t < output.getSizeT() && t < n_best; ++t )
410 output( x, y, z, sorted[t].first ) = conditional( x, y, z, sorted[t].first ) * sorted[t].second;
411 for(
int t = n_best; t < output.getSizeT(); ++t )
412 output( x, y, z, sorted[t].first ) = 0.;
417 template <
typename OP,
typename P1,
typename P2>
418 carto::VolumeRef<OP> &
420 const carto::VolumeRef<P1> & conditional,
421 const std::vector<P2> & prior,
422 carto::VolumeRef<OP> & output)
424 return robustBayes( n_best, conditional, prior, output, vol::empty<int>() );
427 template <
typename OP,
typename P1,
typename P2,
typename M>
430 const carto::VolumeRef<P1> & conditional,
431 const std::vector<P2> & prior,
432 const carto::VolumeRef<M> & mask )
434 carto::VolumeRef<OP> output;
435 output.copyHeaderFrom( conditional.header() );
436 return robustBayes( n_best, conditional, prior, output, mask );
439 template <
typename OP,
typename P1,
typename P2>
442 const carto::VolumeRef<P1> & conditional,
443 const std::vector<P2> & prior )
445 return newRobustBayes<OP>( n_best, conditional, prior, vol::empty<int>() );
450 template <
typename OP,
typename P1,
typename P2,
typename M>
451 carto::VolumeRef<OP> &
453 const carto::VolumeRef<P1> & conditional,
454 const carto::VolumeRef<P2> & prior,
455 carto::VolumeRef<OP> & output,
456 const carto::VolumeRef<M> & mask )
458 if( conditional.getSizeX() != prior.getSizeX() ||
459 conditional.getSizeY() != prior.getSizeY() ||
460 conditional.getSizeZ() != prior.getSizeZ() ||
461 conditional.getSizeT() != prior.getSizeT() )
462 throw std::invalid_argument(
"aims::proba::bayes: conditional and prior "
463 "volumes should have similar dimensions" );
465 output.reallocate( prior.getSizeX(), prior.getSizeY(),
466 prior.getSizeZ(), prior.getSizeT() );
468 std::vector<std::pair<int,P2> > sorted( prior.getSizeT() );
469 for(
int z = 0; z < output.getSizeZ(); ++z )
470 for(
int y = 0; y < output.getSizeY(); ++y )
471 for(
int x = 0; x < output.getSizeX(); ++x )
472 if( !mask.get() || mask(x, y, z) != 0 )
474 for(
int t = 0; t < output.getSizeT(); ++t ) {
476 sorted[t].second = prior( x, y, z, t );
480 for(
int t = 0; t < output.getSizeT() && t < n_best; ++t )
481 output( x, y, z, sorted[t].first ) = conditional( x, y, z, sorted[t].first ) * sorted[t].second;
482 for(
int t = n_best; t < output.getSizeT(); ++t )
483 output( x, y, z, sorted[t].first ) = 0.;
488 template <
typename OP,
typename P1,
typename P2>
489 carto::VolumeRef<OP> &
491 const carto::VolumeRef<P1> & conditional,
492 const carto::VolumeRef<P2> & prior,
493 carto::VolumeRef<OP> & output)
495 return robustBayes( n_best, conditional, prior, output, vol::empty<int>() );
498 template <
typename OP,
typename P1,
typename P2,
typename M>
501 const carto::VolumeRef<P1> & conditional,
502 const carto::VolumeRef<P2> & prior,
503 const carto::VolumeRef<M> & mask )
505 carto::VolumeRef<OP> output;
506 output.copyHeaderFrom( prior.header() );
507 return robustBayes( n_best, conditional, prior, output, mask );
510 template <
typename OP,
typename P1,
typename P2>
513 const carto::VolumeRef<P1> & conditional,
514 const carto::VolumeRef<P2> & prior )
516 return newRobustBayes<OP>( n_best, conditional, prior, vol::empty<int>() );
521 template <
typename C,
typename P,
typename M>
522 carto::VolumeRef<C> &
524 carto::VolumeRef<C> & output,
525 const carto::VolumeRef<M> & mask )
527 output.reallocate( proba.getSizeX(), proba.getSizeY(),
528 proba.getSizeZ(), 1 );
530 for(
int z = 0; z < proba.getSizeZ(); ++z )
531 for(
int y = 0; y < proba.getSizeY(); ++y )
532 for(
int x = 0; x < proba.getSizeX(); ++x )
533 if( !mask.get() || mask(x, y, z) != 0 )
536 for(
int t = 0; t < proba.getSizeT(); ++t )
538 current = proba( x, y, z, t );
542 output( x, y, z ) = t;
549 template <
typename C,
typename P>
550 carto::VolumeRef<C> &
552 carto::VolumeRef<C> & output )
557 template <
typename C,
typename P,
typename M>
560 const carto::VolumeRef<M> & mask )
562 carto::VolumeRef<C> output;
563 output.copyHeaderFrom( proba.header() );
567 template <
typename C,
typename P>
571 return newMaximumLikelihood<C>( proba, vol::empty<int>() );
576 template <
typename C,
typename P1,
typename P2,
typename M>
577 carto::VolumeRef<C> &
579 const carto::VolumeRef<P2> & prior,
580 carto::VolumeRef<C> & output,
581 const carto::VolumeRef<M> & mask )
583 if( conditional.getSizeX() != prior.getSizeX() ||
584 conditional.getSizeY() != prior.getSizeY() ||
585 conditional.getSizeZ() != prior.getSizeZ() ||
586 conditional.getSizeT() != prior.getSizeT() )
587 throw std::invalid_argument(
"aims::proba::map: conditional and prior "
588 "volumes should have similar dimensions" );
590 output.reallocate( conditional.getSizeX(), conditional.getSizeY(),
591 conditional.getSizeZ(), 1 );
593 for(
int z = 0; z < conditional.getSizeZ(); ++z )
594 for(
int y = 0; y < conditional.getSizeY(); ++y )
595 for(
int x = 0; x < conditional.getSizeX(); ++x )
596 if( !mask.get() || mask(x, y, z) != 0 )
599 for(
int t = 0; t < conditional.getSizeT(); ++t )
601 current = conditional( x, y, z, t ) * prior( x, y, z, t );
605 output( x, y, z ) = t;
612 template <
typename C,
typename P1,
typename P2>
613 carto::VolumeRef<C> &
615 const carto::VolumeRef<P2> & prior,
616 carto::VolumeRef<C> & output )
621 template <
typename C,
typename P1,
typename P2,
typename M>
624 const carto::VolumeRef<P2> & prior,
625 const carto::VolumeRef<M> & mask )
627 carto::VolumeRef<C> output;
628 output.copyHeaderFrom( conditional.header() );
632 template <
typename C,
typename P1,
typename P2>
635 const carto::VolumeRef<P2> & prior )
637 return newMaximumAPosteriori<C>( conditional, prior, vol::empty<int>() );
642 template <
typename C,
typename P1,
typename P2,
typename M>
643 carto::VolumeRef<C> &
645 const carto::VolumeRef<P1> & conditional,
646 const carto::VolumeRef<P2> & prior,
647 carto::VolumeRef<C> & output,
648 const carto::VolumeRef<M> & mask )
650 if( conditional.getSizeX() != prior.getSizeX() ||
651 conditional.getSizeY() != prior.getSizeY() ||
652 conditional.getSizeZ() != prior.getSizeZ() ||
653 conditional.getSizeT() != prior.getSizeT() )
654 throw std::invalid_argument(
"aims::proba::map: conditional and prior "
655 "volumes should have similar dimensions" );
657 output.reallocate( conditional.getSizeX(), conditional.getSizeY(),
658 conditional.getSizeZ(), 1 );
660 std::vector<std::pair<int,P2> > sorted( prior.getSizeT() );
661 for(
int z = 0; z < conditional.getSizeZ(); ++z )
662 for(
int y = 0; y < conditional.getSizeY(); ++y )
663 for(
int x = 0; x < conditional.getSizeX(); ++x )
664 if( !mask.get() || mask(x, y, z) != 0 )
666 for(
int t = 0; t < output.getSizeT(); ++t ) {
668 sorted[t].second = prior( x, y, z, t );
672 for(
int t = 0; t < output.getSizeT() && t < n_best; ++t )
674 current = conditional( x, y, z, sorted[t].first ) * sorted[t].second;
678 output( x, y, z ) = t;
685 template <
typename C,
typename P1,
typename P2>
686 carto::VolumeRef<C> &
688 const carto::VolumeRef<P1> & conditional,
689 const carto::VolumeRef<P2> & prior,
690 carto::VolumeRef<C> & output )
695 template <
typename C,
typename P1,
typename P2,
typename M>
698 const carto::VolumeRef<P1> & conditional,
699 const carto::VolumeRef<P2> & prior,
700 const carto::VolumeRef<M> & mask )
702 carto::VolumeRef<C> output;
703 output.copyHeaderFrom( conditional.header() );
707 template <
typename C,
typename P1,
typename P2>
710 const carto::VolumeRef<P1> & conditional,
711 const carto::VolumeRef<P2> & prior )
713 return newRobustMaximumAPosteriori<C>( n_best, conditional, prior, vol::empty<int>() );
718 template <
typename P,
typename M>
721 const carto::VolumeRef<M> & mask )
725 for(
int z = 0; z < conditional.getSizeZ(); ++z )
726 for(
int y = 0; y < conditional.getSizeY(); ++y )
727 for(
int x = 0; x < conditional.getSizeX(); ++x )
728 if( !mask.get() || mask(x, y, z) != 0 )
731 for(
int t = 0; t < conditional.getSizeT(); ++t )
732 if( std::isfinite( conditional( x, y, z, t ) ) )
733 sum += conditional( x, y, z, t );
735 ll += std::log(
sum );
740 template <
typename P>
float max(float x, float y)
carto::VolumeRef< OP > newRobustBayes(int n_best, const carto::VolumeRef< P1 > &conditional, const std::vector< P2 > &prior, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > & normalize(carto::VolumeRef< P > &proba, const carto::VolumeRef< M > &mask)
double attenuate(double proba, float alpha, int n)
carto::VolumeRef< P > newPdf(const std::vector< Distrib > ¶m, const carto::VolumeRef< I > &values, const carto::VolumeRef< M > &mask)
double logLikelihoodSum(const carto::VolumeRef< P > &conditional, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > newNormalize(const carto::VolumeRef< P > &proba, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > newAttenuateZ(const carto::VolumeRef< P > &proba, float alpha, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > newRobustMaximumAPosteriori(int n_best, const carto::VolumeRef< P1 > &conditional, const carto::VolumeRef< P2 > &prior, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > newAttenuate(const carto::VolumeRef< P > &proba, float alpha, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > & maximumAPosteriori(const carto::VolumeRef< P1 > &conditional, const carto::VolumeRef< P2 > &prior, carto::VolumeRef< C > &output, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > & pdf(const std::vector< Distrib > ¶m, const carto::VolumeRef< I > &values, carto::VolumeRef< P > &output, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > newMaximumAPosteriori(const carto::VolumeRef< P1 > &conditional, const carto::VolumeRef< P2 > &prior, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > newMaximumLikelihood(const carto::VolumeRef< P > &proba, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > & robustMaximumAPosteriori(int n_best, const carto::VolumeRef< P1 > &conditional, const carto::VolumeRef< P2 > &prior, carto::VolumeRef< C > &output, const carto::VolumeRef< M > &mask)
carto::VolumeRef< OP > & robustBayes(int n_best, const carto::VolumeRef< P1 > &conditional, const std::vector< P2 > &prior, carto::VolumeRef< OP > &output, const carto::VolumeRef< M > &mask)
carto::VolumeRef< C > & maximumLikelihood(const carto::VolumeRef< P > &proba, carto::VolumeRef< C > &output, const carto::VolumeRef< M > &mask)
carto::VolumeRef< OP > newBayes(const carto::VolumeRef< P1 > &conditional, const std::vector< P2 > &prior, const carto::VolumeRef< M > &mask)
carto::VolumeRef< P > & attenuateZ(carto::VolumeRef< P > &proba, float alpha, const carto::VolumeRef< M > &mask)
carto::VolumeRef< OP > & bayes(const carto::VolumeRef< P1 > &conditional, const std::vector< P2 > &prior, carto::VolumeRef< OP > &output, const carto::VolumeRef< M > &mask)
carto::DataTypeTraits< T >::LongType sum(const carto::VolumeRef< T > &in, const carto::VolumeRef< M > &mask)
bool operator()(const std::pair< int, P > &a, const std::pair< int, P > &b) const