18 #include <gsl/gsl_statistics_double.h>
19 #include <gsl/gsl_multifit_nlin.h>
20 #include <gsl/gsl_math.h>
21 #include <gsl/gsl_eigen.h>
22 #include <gsl/gsl_sf_gamma.h>
24 #include <gsl/gsl_randist.h>
26 #include <gsl/gsl_cdf.h>
35 #if defined(__APPLE__) && (__APPLE_CC__ < 4000)
64 std::cout <<
"Error __LINE__, __FILE__ : this is an abstract class it should have no params" << std::endl;
112 Log::instance()->
warn(
"CSM needs at least two occurrence points..aborting...\n" );
127 bool myFlag =
csm1();
155 for (
int i=0; pit != fin; ++pit, ++i)
160 float myCellValue = (float)(*pit)->environment()[j];
176 gsl_vector * theMeanVector,
177 gsl_vector * theStdDevVector)
180 assert (theMatrix != 0);
181 assert (theMeanVector !=0);
182 assert (theStdDevVector !=0);
185 gsl_vector_set_zero(theMeanVector);
188 gsl_vector_set_zero(theStdDevVector);
199 gsl_vector_view myColumn = gsl_matrix_column (theMatrix, j);
201 double myAverage = gsl_stats_mean (myColumn.vector.data, myColumn.vector.stride, myColumn.vector.size);
203 gsl_vector_set (theMeanVector,j,myAverage);
205 double myStdDev = gsl_stats_sd (myColumn.vector.data, myColumn.vector.stride, myColumn.vector.size);
207 gsl_vector_set (theStdDevVector,j,myStdDev);
236 myDouble = (myDouble-myAverage)/myStdDev;
290 gsl_matrix * tmp_gsl_matrix = gsl_matrix_alloc (1,
_layer_count);
291 gsl_matrix * tmp_raw_gsl_matrix = gsl_matrix_alloc (1,
_layer_count);
294 myFloat =
static_cast<float>(x[i]);
295 gsl_matrix_set (tmp_raw_gsl_matrix,0,i,myFloat);
308 myFloat = (myFloat-myAverage)/myStdDev;
312 myFloat=myFloat-myAverage;
315 gsl_matrix_set (tmp_gsl_matrix,0,i,myFloat);
319 displayMatrix(tmp_raw_gsl_matrix,
"Voxel passed to getValue",
false);
320 displayMatrix(tmp_gsl_matrix,
"Voxel passed to getValue -Mean / stddev");
327 displayMatrix(z,
"z - Product of voxel passed to getValue -Mean / stddev");
330 if (z->size1 != tmp_gsl_matrix->size1)
332 Log::instance()->
warn(
"Error during creation of product Z in CSM getValue - number of rows don't match\n" );
337 if (z->size2 != tmp_gsl_matrix->size1)
348 for (
unsigned int i=0;i<z->size2;i++)
352 displayMatrix(z,
"Standardised : Each value in z / sqrt of associated element in the eigenvalues vector");
354 double mySumOfSquares=0;
355 for (
unsigned int i=0;i<z->size2;i++)
357 double myValue=gsl_matrix_get (z,0,i);
360 mySumOfSquares+= pow(gsl_matrix_get (z,0,i), 2);
367 double myHalfComponentCountDouble=(z->size2)/2;
368 double myHalfSumOfSquaresDouble=mySumOfSquares/2;
375 double myProbability=gsl_cdf_chisq_Q(mySumOfSquares,z->size2);
378 printf(
"\n-------------------------------\n");
379 printf(
"Component count : %u\n",static_cast<unsigned int>(z->size2));
380 printf(
"Component count / 2: %f\n",myHalfComponentCountDouble);
381 printf(
"Sum of squares : %f\n",mySumOfSquares);
382 printf(
"Sum of squares / 2: %f\n",myHalfSumOfSquaresDouble);
383 printf(
"Probability: %f\n\n", myProbability);
384 printf(
"-------------------------------\n");
392 gsl_matrix_free (tmp_gsl_matrix);
393 gsl_matrix_free (tmp_raw_gsl_matrix);
394 return myProbability;
420 fprintf( stderr,
"\nDisplaying Vector rounded to 4 decimal places '%s' (%u): \n----------------------------------------------\n[ ", name, static_cast<unsigned int>(v->size) );
424 fprintf( stderr,
"\nDisplaying Vector '%s' (%u): \n----------------------------------------------\n[ ", name, static_cast<unsigned int>(v->size) );
429 for (
unsigned int i=0;i<v->size;++i)
434 double myDouble = gsl_vector_get (v,i);
437 fprintf( stderr,
"%.4g %s", myDouble, sep1 );
441 fprintf( stderr,
"%g %s", myDouble, sep1 );
444 fprintf( stderr,
"\n----------------------------------------------\n" );
457 fprintf( stderr,
"\nDisplaying Matrix '%s' (%u / %u): \n----------------------------------------------\n[\n", name, static_cast<unsigned int>(m->size1), static_cast<unsigned int>(m->size2) );
461 fprintf( stderr,
"\nDisplaying Matrix rounded to 4 decimal places '%s' (%u / %u): \n----------------------------------------------\n[\n", name, static_cast<unsigned int>(m->size1), static_cast<unsigned int>(m->size2) );
463 for (
unsigned int i=0;i<m->size1;++i)
468 for (
unsigned int j=0;j<m->size2;j++)
470 double myDouble = gsl_matrix_get (m,i,j);
472 if (j == m->size2 -1)
476 fprintf( stderr,
"%g %s ", myDouble, sep1 );
480 fprintf( stderr,
"%.4g %s ", myDouble, sep1 );
484 fprintf( stderr,
"%s\n", sep2 );
486 fprintf( stderr,
"]\n----------------------------------------------\n" );
495 gsl_matrix * t = gsl_matrix_alloc (m->size2, m->size1);
497 for (
unsigned int i = 0; i < m->size1; i++)
499 gsl_vector * v = gsl_vector_alloc(m->size2);
500 gsl_matrix_get_row (v, m, i);
501 gsl_matrix_set_col (t, i, v);
516 for (
unsigned int i = 0; i < va->size; i++)
518 res += gsl_vector_get(va, i)*gsl_vector_get(vb, i);
530 gsl_matrix * p = gsl_matrix_alloc (a->size1, b->size2);
532 for (
unsigned int i = 0; i < a->size1; i++)
534 gsl_vector * va = gsl_vector_alloc(a->size2);
536 gsl_matrix_get_row (va, a, i);
538 for (
unsigned int j = 0; j < b->size2; j++)
540 gsl_vector * vb = gsl_vector_alloc(a->size2);
542 gsl_matrix_get_col (vb, b, j);
546 gsl_matrix_set (p, i, j, vp);
548 gsl_vector_free (vb);
551 gsl_vector_free (va);
583 gsl_matrix * m = gsl_matrix_alloc (original_matrix->size1, original_matrix->size2);
584 gsl_matrix_memcpy (m, original_matrix);
586 int numrows = m->size1;
587 int numcols = m->size2;
595 gsl_matrix * s = gsl_matrix_alloc (numrows, numcols);
599 gsl_matrix_memcpy (m, s);
603 gsl_vector * v = gsl_vector_alloc(numcols);
605 for (
int i = 0; i < numcols; i++)
609 for (j = 0; j < numrows; j++)
611 val += gsl_matrix_get (m, j, i);
614 gsl_vector_set (v, i, val);
616 for (j = 0; j < numrows; j++)
618 gsl_matrix_set_row (s, j, v);
625 gsl_matrix_scale (s, (
double)1/numrows);
628 gsl_matrix_sub (m, s);
634 gsl_matrix * p =
product(mt, m);
638 gsl_matrix_scale (p, (
double)1/(numrows-1));
640 gsl_matrix_free (mt);
669 Log::instance()->
warn(
"CSM critical error - covariance matrix is not square!\n" );
680 gsl_eigen_symmv_workspace * myWorkpace = gsl_eigen_symmv_alloc (
_layer_count);
686 gsl_eigen_symmv_free (myWorkpace);
695 GSL_EIGEN_SORT_VAL_DESC);
711 Log::instance()->
debug(
"Discard components retained too few components - model can not be generated!\n" );
712 Log::instance()->
warn(
"Could not generate a model with sufficient components!\n" );
729 config->addSubsection( model_config );
737 model_config->addNameValue(
"AvgVector", values, _layer_count );
743 model_config->addNameValue(
"StddevVector", values, _layer_count );
749 model_config->addNameValue(
"EigenvalueVector", values, _retained_components_count );
756 double *flat_eigenvector_matrix =
new double[num_cells];
764 model_config->addNameValue(
"EigenvectorMatrix", flat_eigenvector_matrix, num_cells );
766 delete[] flat_eigenvector_matrix;
778 std::vector<double> stl_vector = model_config->getAttributeAsVecDouble(
"AvgVector" );
788 stl_vector = model_config->getAttributeAsVecDouble(
"StddevVector" );
796 stl_vector = model_config->getAttributeAsVecDouble(
"EigenvalueVector" );
806 stl_vector = model_config->getAttributeAsVecDouble(
"EigenvectorMatrix" );
Scalar getValue(const Sample &x) const
void warn(const char *format,...)
'Warn' level.
gsl_matrix * _gsl_eigenvector_matrix
double Scalar
Type of map values.
static Log * instance()
Returns the instance pointer, creating the object on the first call.
int getConvergence(Scalar *const val) const
virtual void _getConfiguration(ConfigurationPtr &config) const
int calculateMeanAndSd(gsl_matrix *theMatrix, gsl_vector *theMeanVector, gsl_vector *theStdDevVector)
virtual void _setConfiguration(const ConstConfigurationPtr &config)
bool verboseDebuggingBool
int _retained_components_count
virtual int discardComponents()=0
Csm(AlgMetadata const *metadata)
gsl_vector * _gsl_eigenvalue_vector
gsl_vector * _gsl_avg_vector
gsl_vector * _gsl_stddev_vector
void displayMatrix(const gsl_matrix *m, const char *name, const bool roundFlag=true) const
gsl_matrix * autoCovariance(gsl_matrix *m)
void displayVector(const gsl_vector *v, const char *name, const bool roundFlag=true) const
gsl_matrix * _gsl_covariance_matrix
gsl_matrix * transpose(gsl_matrix *m)
double product(gsl_vector *va, gsl_vector *vb) const
gsl_matrix * _gsl_environment_matrix
std::vector< OccurrencePtr >::const_iterator const_iterator
static AlgParamMetadata * parameters
void debug(const char *format,...)
'Debug' level.