From 9325f04856b8cd90dfc504010ae08f4c9c194bf1 Mon Sep 17 00:00:00 2001
From: Daniel Waggoner <dwaggoner@frbatlanta.org>
Date: Thu, 3 May 2012 17:29:24 -0400
Subject: [PATCH] changes to elliptical testing and minor changes of
 dw_elliptical.c (cherry picked from commit
 f977618b9da25a83daaf1bc1eb09cf6a71cd2c32)

---
 elliptical/dw_elliptical.c      | 276 +++-----------------------------
 elliptical/dw_elliptical_test.c | 236 +++++++++++++++++++++++++++
 include/dw_elliptical.h         |   7 +-
 3 files changed, 260 insertions(+), 259 deletions(-)
 create mode 100644 elliptical/dw_elliptical_test.c

diff --git a/elliptical/dw_elliptical.c b/elliptical/dw_elliptical.c
index 11cfd66..89a94f6 100644
--- a/elliptical/dw_elliptical.c
+++ b/elliptical/dw_elliptical.c
@@ -170,7 +170,7 @@ static void print_info_truncated_gaussian(FILE *f_out, TElliptical *elliptical)
 }
 
 /*
-   Creates a power distribution on the elliptical annulus which is given by the 
+   Creates a truncated gaussian distribution on the elliptical annulus which is given by the 
    set of all z such that
 
         r = sqrt((z - center)' * Inverse(scale * scale') * (z - center))
@@ -522,6 +522,16 @@ static PRECISION logdensity_radius_step(PRECISION radius, TElliptical *elliptica
     }
 }
 
+static PRECISION cummulative_radius_step(PRECISION radius, TElliptical *elliptical)
+{
+  TElliptical_step *d=(TElliptical_step*)elliptical->data;
+  int i;
+  if (radius <= d->t[0]) return 0.0;
+  for (i=1; i <= d->m; i++)
+    if (radius <= d->t[i]) return ((PRECISION)(i-1) + (radius - d->t[i-1])/(d->t[i] - d->t[i-1]))/(PRECISION)d->m; 
+  return 1.0;
+}
+
 static PRECISION draw_step(PRECISION *draw, TElliptical *elliptical)
 {
   PRECISION r, s;
@@ -543,8 +553,15 @@ static PRECISION draw_step(PRECISION *draw, TElliptical *elliptical)
 static void print_info_step(FILE *f_out, TElliptical *elliptical)
 {
   TElliptical_step *d=(TElliptical_step*)(elliptical->data);
-  if (f_out) fprintf(f_out,"%s\n dim=%d\n lower bound=%lg\n upper bound=%lg\n",
-		     elliptical->type,elliptical->dim,d->t[0],d->t[d->m]);
+  int i;
+  if (f_out)
+    {
+      fprintf(f_out,"%s\n dim=%d\n lower bound=%lg\n upper bound=%lg\n",elliptical->type,elliptical->dim,d->t[0],d->t[d->m]);
+      fprintf(f_out,"table size=%d\n table=\n",d->m);
+      for (i=0; i <= d->m; i++) fprintf(f_out,"%lg ",d->t[i]);
+      fprintf(f_out,"\n");
+    }
+
 }
 
 /*
@@ -597,6 +614,7 @@ TElliptical* CreateElliptical_Step(int dim, TVector center, TMatrix scale, PRECI
 
       elliptical->data=(void*)data;
       elliptical->logdensity_radius=logdensity_radius_step;
+      elliptical->cummulative_radius=cummulative_radius_step;
       elliptical->logdensity_draw=logdensity_draw;
       elliptical->draw_vector=draw_step;
       elliptical->print_info=print_info_step;
@@ -608,256 +626,4 @@ TElliptical* CreateElliptical_Step(int dim, TVector center, TMatrix scale, PRECI
 /*******************************************************************************/
 /*******************************************************************************/
 /*******************************************************************************/
-
-
-/*******************************************************************************/
-/******************************** Test Routines ********************************/
-/*******************************************************************************
-#include "dw_matrix_sort.h"
-#include <stdio.h>
-static void TestSimulateEllipticalCummulativeDensity(TElliptical *elliptical, int count, char *filename)
-{
-  TVector R;
-  int d=200, i, j;
-  FILE *f_out;
-  PRECISION min, max, inc, x;
-
-  if (!filename) filename="tmp.csv";
-  if (elliptical->cummulative_radius && (f_out=fopen(filename,"wt")))
-    {
-      R=CreateVector(count);
-      for (i=0; i < count; i++)
-	ElementV(R,i)=DrawElliptical((PRECISION*)NULL,elliptical); 
-      SortVectorAscending(R,R);
-
-      min=ElementV(R,0);
-      max=ElementV(R,count-1);
-      inc=(max-min)/(PRECISION)(d-1);
-
-      for (x=min, i=j=0; i < d; x+=inc, i++)
-	{
-	  for ( ; j < count; j++)
-	    if (ElementV(R,j) >= x) break;
-	  fprintf(f_out,"%lf,%lf,%lf\n",x,(double)j/(double)count,CummulativeDensityElliptical_Radius(x,elliptical));
-	}
-      fclose(f_out);
-    }
-}
-
-// Prints, in a format suitable for graphing, the cummulative density.
-void TestEllipticalCummulativeDensity(void)
-{
-  TVector center;
-  TMatrix scale, variance;
-  PRECISION lower_bound=2.0, upper_bound=10.0, power=5, s=2.3, *table;
-  int i, j, dim=3, count=50000, m=10;
-  char *filename="cummulative.csv";
-  TElliptical *elliptical;
-
-  dw_initialize_generator(0);
-
-  dw_NormalVector(center=CreateVector(dim));
-  dw_NormalMatrix(scale=CreateMatrix(dim,dim));
-
-  printf("Cummulative density test\n");
-  printf("Count = %d\n",count);
-
-  // Truncated gaussian 
-  variance=ProductTransposeMM((TMatrix)NULL,scale,scale);
-  elliptical=CreateElliptical_TruncatedGaussian(dim,center,variance,lower_bound,upper_bound,s);
-  printf("\nCumulative density test of truncated gaussian distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalCummulativeDensity(elliptical,count,filename);
-  FreeMatrix(variance);
-  FreeElliptical(elliptical);
-
-  // Gaussian 
-  variance=ProductTransposeMM((TMatrix)NULL,scale,scale);
-  elliptical=CreateElliptical_Gaussian(dim,center,variance);
-  printf("\nCumulative density test of gaussian distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  printf("\nGaussian test...\n");
-  TestSimulateEllipticalCummulativeDensity(elliptical,count,filename);
-  FreeMatrix(variance);
-  FreeElliptical(elliptical);
- 
-  // Truncated Power
-  elliptical=CreateElliptical_TruncatedPower(dim,center,scale,lower_bound,upper_bound,power);
-  printf("\nCumulative density test of truncated power distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalCummulativeDensity(elliptical,count,filename);
-  FreeElliptical(elliptical);
-
-  // Uniform 
-  elliptical=CreateElliptical_Uniform(dim,center,scale,lower_bound,upper_bound);
-  printf("\nCumulative density test of uniform distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalCummulativeDensity(elliptical,count,filename);
-  FreeElliptical(elliptical);
-
-  // Power
-  elliptical=CreateElliptical_Power(dim,center,scale,upper_bound,power);
-  printf("\nCumulative density test of power distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalCummulativeDensity(elliptical,count,filename);
-  FreeElliptical(elliptical);
-
-  // Step
-  table=(PRECISION*)dw_malloc((m+1)*sizeof(PRECISION));
-  table[0]=lower_bound;
-  for (i=1; i < m; i++)
-    table[i]=table[i-1]+dw_uniform_rnd()*(upper_bound-table[i-1]);
-  table[m]=upper_bound;
-  factor=sqrt(VarianceScale_TruncatedPower(dim,lower_bound,upper_bound,power));
-  ProductMS(scale,scale,1.0/factor);
-  elliptical=CreateElliptical_Step(dim,center,scale,table,m);
-  ProductMS(scale,scale,factor);
-  printf("\nCumulative density test of step distribution...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  dw_free(table);
-  FreeElliptical(elliptical);
-
-  FreeMatrix(scale);
-  FreeVector(center);
-}
-
-static void TestSimulateEllipticalVariance(TElliptical *elliptical, int count)
-{
-  TVector mean, v;
-  TMatrix variance, x;
-  int i;
-
-  // Create matrices and vectors
-  InitializeVector(mean=CreateVector(elliptical->dim),0.0);
-  InitializeMatrix(variance=CreateMatrix(elliptical->dim,elliptical->dim),0.0);
-  v=CreateVector(elliptical->dim);
-  x=CreateMatrix(elliptical->dim,elliptical->dim);
-
-  // Simulate mean and variance
-  for (i=0; i < count; i++)
-    {
-      DrawElliptical(pElementV(v),elliptical);
-      AddVV(mean,mean,v);
-      OuterProduct(x,v,v);
-      AddMM(variance,variance,x);
-    }
-  ProductVS(mean,mean,1/(PRECISION)count);
-  ProductMS(variance,variance,1/(PRECISION)count);
-  OuterProduct(x,mean,mean);
-  SubtractMM(variance,variance,x);
-
-  // Difference in centers
-  SubtractVV(v,elliptical->center,mean);
-  printf("difference in estimated vs acutal center: %lf\n",Norm(v));
-
-  // Difference in variances
-  ProductMS(x,elliptical->scale,sqrt(elliptical->variance_scale));
-  ProductTransposeMM(x,x,x);
-  SubtractMM(x,x,variance);
-  printf("difference in estimated vs actual variance: %lf\n",MatrixNorm(x));
-
-  // Prints the variance matrices
-  ProductMS(x,elliptical->scale,sqrt(elliptical->variance_scale));
-  ProductTransposeMM(x,x,x);
-  printf("Actual Variance:\n");
-  dw_PrintMatrix(stdout,x,"%lg ");
-  printf("Estimated Variance:\n");
-  dw_PrintMatrix(stdout,variance,"%lg ");
-
-  // Clean up
-  FreeMatrix(variance);
-  FreeVector(mean);
-  FreeVector(v);
-  FreeMatrix(x);
-}
-
-// Prints the difference difference, in terms of norms, between estimated and
-// actual variances and means.
-void TestEllipticalVariance(void)
-{
-  TMatrix scale, variance;
-  TVector center;
-  PRECISION factor, lower_bound=0.0, upper_bound=10.0, power=5.0, s=2.0, *table;
-  int i, j, dim=2, count=50000, m=10;
-  TElliptical *elliptical;
-
-  dw_initialize_generator(0);
-
-  dw_NormalVector(center=CreateVector(dim));
-  dw_NormalMatrix(scale=CreateMatrix(dim,dim));
-  variance=ProductTransposeMM((TMatrix)NULL,scale,scale);
-
-  printf("Mean and Variance test\n");
-  printf("Count = %d\n",count);
-
-  // Gaussian family
-  factor=VarianceScale_TruncatedGaussian(dim,lower_bound,upper_bound,s);
-  ProductMS(variance,variance,1.0/factor);
-  elliptical=CreateElliptical_TruncatedGaussian(dim,center,variance,lower_bound,upper_bound,s);
-  ProductMS(variance,variance,factor);
-  printf("\nTruncated gaussian test (factor=%lf)...\n",factor);
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  FreeElliptical(elliptical);
-
-  factor=sqrt(VarianceScale_TruncatedGaussian(dim,0.0,PLUS_INFINITY,1.0));
-  elliptical=CreateElliptical_Gaussian(dim,center,variance);
-  printf("\nGaussian test...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  FreeElliptical(elliptical);
- 
-  // Truncated Power family 
-  factor=sqrt(VarianceScale_TruncatedPower(dim,lower_bound,upper_bound,power));
-  ProductMS(scale,scale,1.0/factor);
-  elliptical=CreateElliptical_TruncatedPower(dim,center,scale,lower_bound,upper_bound,power);
-  ProductMS(scale,scale,factor);
-  printf("\nTruncated power test...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  FreeElliptical(elliptical);
-
-  factor=sqrt(VarianceScale_TruncatedPower(dim,lower_bound,upper_bound,dim));
-  ProductMS(scale,scale,1.0/factor);
-  elliptical=CreateElliptical_Uniform(dim,center,scale,lower_bound,upper_bound);
-  ProductMS(scale,scale,factor);
-  printf("\nUniform test...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  FreeElliptical(elliptical);
-
-  factor=sqrt(VarianceScale_TruncatedPower(dim,0.0,upper_bound,power));
-  ProductMS(scale,scale,1.0/factor);
-  elliptical=CreateElliptical_Power(dim,center,scale,upper_bound,power);
-  ProductMS(scale,scale,factor);
-  printf("\nPower test...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  FreeElliptical(elliptical);
-
-  // Step
-  table=(PRECISION*)dw_malloc((m+1)*sizeof(PRECISION));
-  table[0]=lower_bound;
-  for (i=1; i < m; i++)
-    table[i]=table[i-1]+dw_uniform_rnd()*(upper_bound-table[i-1]);
-  table[m]=upper_bound;
-  factor=sqrt(VarianceScale_Step(dim,table,m));
-  ProductMS(scale,scale,1.0/factor);
-  elliptical=CreateElliptical_Step(dim,center,scale,table,m);
-  ProductMS(scale,scale,factor);
-  printf("\nStep test...\n");
-  PrintEllipticalInfo(stdout,elliptical);
-  TestSimulateEllipticalVariance(elliptical,count);
-  dw_free(table);
-  FreeElliptical(elliptical);
-
-  // Clean up
-  FreeMatrix(variance);
-  FreeVector(center);
-  FreeMatrix(scale);
-}
-*******************************************************************************/
-/*******************************************************************************/
-/*******************************************************************************/
 #undef PI
diff --git a/elliptical/dw_elliptical_test.c b/elliptical/dw_elliptical_test.c
new file mode 100644
index 0000000..9f93319
--- /dev/null
+++ b/elliptical/dw_elliptical_test.c
@@ -0,0 +1,236 @@
+/*******************************************************************************/
+/************************** Elliptical Test Routines ***************************/
+/*******************************************************************************/
+#include "dw_matrix_sort.h"
+#include "dw_elliptical.h"
+#include "dw_rand.h"
+#include "dw_matrix_rand.h"
+#include "dw_parse_cmd.h"
+#include "dw_std.h"
+
+#include <stdio.h>
+#include <math.h>
+
+static void TestSimulateEllipticalVariance(TElliptical *elliptical, int count, FILE *f_out);
+static void TestSimulateEllipticalCummulativeDensity(TElliptical *elliptical, int count, FILE *f_out);
+
+static void TestSimulateEllipticalCummulativeDensity(TElliptical *elliptical, int count, FILE *f_out)
+{
+  TVector R;
+  int d=200, i, j;
+  PRECISION min, max, inc, x;
+
+  if (!f_out)
+    {
+      printf("Null file pointer\n");
+      exit(0);
+    }
+
+  PrintEllipticalInfo(f_out,elliptical);
+
+  if (elliptical->cummulative_radius)
+    {
+      R=CreateVector(count);
+      for (i=0; i < count; i++)
+	ElementV(R,i)=DrawElliptical((PRECISION*)NULL,elliptical); 
+      SortVectorAscending(R,R);
+
+      min=ElementV(R,0);
+      max=ElementV(R,count-1);
+      inc=(max-min)/(PRECISION)(d-1);
+
+      for (x=min, i=j=0; i < d; x+=inc, i++)
+	{
+	  for ( ; j < count; j++)
+	    if (ElementV(R,j) >= x) break;
+	  fprintf(f_out,"%lf,%lf,%lf\n",x,(double)j/(double)count,CummulativeDensityElliptical_Radius(x,elliptical));
+	}
+    }
+
+  fprintf(f_out,"\n\n");
+}
+
+static void TestSimulateEllipticalVariance(TElliptical *elliptical, int count, FILE *f_out)
+{
+  TVector mean, v;
+  TMatrix variance, x;
+  int i;
+
+  if (!f_out)
+    {
+      printf("Null file pointer\n");
+      exit(0);
+    }
+
+  PrintEllipticalInfo(f_out,elliptical);
+
+  // Create matrices and vectors
+  InitializeVector(mean=CreateVector(elliptical->dim),0.0);
+  InitializeMatrix(variance=CreateMatrix(elliptical->dim,elliptical->dim),0.0);
+  v=CreateVector(elliptical->dim);
+  x=CreateMatrix(elliptical->dim,elliptical->dim);
+
+  // Simulate mean and variance
+  for (i=0; i < count; i++)
+    {
+      DrawElliptical(pElementV(v),elliptical);
+      AddVV(mean,mean,v);
+      OuterProduct(x,v,v);
+      AddMM(variance,variance,x);
+    }
+  ProductVS(mean,mean,1/(PRECISION)count);
+  ProductMS(variance,variance,1/(PRECISION)count);
+  OuterProduct(x,mean,mean);
+  SubtractMM(variance,variance,x);
+
+  // Difference in centers
+  fprintf(f_out,"acutal mean\n");
+  dw_PrintVector(f_out,elliptical->center,"%lf ");
+  fprintf(f_out,"difference between estimated and actual mean divided by standard deviation\n");
+  SubtractVV(v,elliptical->center,mean);
+  for (i=0; i < elliptical->dim; i++)
+    fprintf(f_out,"%8.5lf ",ElementV(v,i)/sqrt(ElementM(variance,i,i)/count));
+  fprintf(f_out,"\n");
+
+  // Difference in variances
+  ProductMS(x,elliptical->scale,sqrt(elliptical->variance_scale));
+  ProductTransposeMM(x,x,x);
+  SubtractMM(x,x,variance);
+  fprintf(f_out,"norm of the difference between estimated and actual variance: %lf\n",MatrixNorm(x));
+
+  // Prints the variance matrices
+  fprintf(f_out,"Actual Variance:\n");
+  ProductMS(x,elliptical->scale,sqrt(elliptical->variance_scale));
+  ProductTransposeMM(x,x,x);
+  dw_PrintMatrix(f_out,x,"%lg ");
+  fprintf(f_out,"difference between estimated and actual variance:\n");
+  SubtractMM(x,x,variance);
+  dw_PrintMatrix(f_out,x,"%lg ");
+
+  fprintf(f_out,"\n\n");
+
+  // Clean up
+  FreeMatrix(variance);
+  FreeVector(mean);
+  FreeVector(v);
+  FreeMatrix(x);
+}
+
+// Prints the difference, in terms of norms, between estimated and
+// actual variances and means.
+int main(int nargs, char **args)
+{
+  TMatrix base_scale, scale, variance;
+  TVector center;
+  PRECISION lower_bound, upper_bound, power, s, *table;
+  int i, seed, dim, count, table_size, cummulative;
+  TElliptical *elliptical;
+  FILE *f_out;
+
+  count=dw_ParseInteger_String(nargs,args,"ndraws",10000);
+  dim=dw_ParseInteger_String(nargs,args,"dim",3);
+  lower_bound=dw_ParseFloating_String(nargs,args,"lower_bound",2.0);
+  if (lower_bound < 0.0) lower_bound=0.0;
+  upper_bound=dw_ParseFloating_String(nargs,args,"upper_bound",8.0);
+  if (lower_bound >= upper_bound) upper_bound=lower_bound+1.0;
+  power=dw_ParseFloating_String(nargs,args,"power",5.0);
+  table_size=dw_ParseInteger_String(nargs,args,"table_size",10);
+  s=dw_ParseFloating_String(nargs,args,"s",1.0);
+  cummulative=(dw_FindArgument_String(nargs,args,"cummulative") == -1) ? 0 : 1;
+  seed=dw_ParseInteger_String(nargs,args,"seed",0);
+
+  f_out=cummulative ? fopen("cummulative.csv","wt") : stdout;
+
+  dw_initialize_generator(seed);
+
+  dw_NormalVector(center=CreateVector(dim));
+  dw_NormalMatrix(base_scale=CreateMatrix(dim,dim));
+  variance=CreateMatrix(dim,dim);
+  scale=CreateMatrix(dim,dim);
+
+  fprintf(f_out,"Mean and Variance test\n");
+  fprintf(f_out,"Count = %d\n",count);
+
+  // Gaussian family
+  variance=ProductTransposeMM((TMatrix)NULL,base_scale,base_scale);
+  ProductMS(variance,variance,1.0/VarianceScale_TruncatedGaussian(dim,lower_bound,upper_bound,s));
+  elliptical=CreateElliptical_TruncatedGaussian(dim,center,variance,lower_bound,upper_bound,s);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+
+  //==========
+  if (cummulative)
+    {
+      variance=ProductTransposeMM((TMatrix)NULL,base_scale,base_scale);
+      elliptical=CreateElliptical_TruncatedGaussian(dim,center,variance,lower_bound,upper_bound,s);
+      TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+      FreeElliptical(elliptical);
+
+      elliptical=CreateElliptical_TruncatedGaussian(dim,center,variance,lower_bound,upper_bound,s+100);
+      TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+      FreeElliptical(elliptical);
+    }
+  //============
+
+  variance=ProductTransposeMM((TMatrix)NULL,base_scale,base_scale);
+  elliptical=CreateElliptical_Gaussian(dim,center,variance);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+ 
+  // Truncated Power family 
+  ProductMS(scale,base_scale,1.0/sqrt(VarianceScale_TruncatedPower(dim,lower_bound,upper_bound,power)));
+  elliptical=CreateElliptical_TruncatedPower(dim,center,scale,lower_bound,upper_bound,power);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+
+  ProductMS(scale,base_scale,1.0/sqrt(VarianceScale_TruncatedPower(dim,lower_bound,upper_bound,dim)));
+  elliptical=CreateElliptical_Uniform(dim,center,scale,lower_bound,upper_bound);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+
+  ProductMS(scale,base_scale,1.0/sqrt(VarianceScale_TruncatedPower(dim,0.0,upper_bound,power)));
+  elliptical=CreateElliptical_Power(dim,center,scale,upper_bound,power);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+
+  // Step
+  table=(PRECISION*)dw_malloc((table_size+1)*sizeof(PRECISION));
+  table[0]=lower_bound;
+  for (i=1; i < table_size; i++)
+    table[i]=table[i-1]+dw_uniform_rnd()*(upper_bound-table[i-1]);
+  table[table_size]=upper_bound;
+  ProductMS(scale,base_scale,1.0/sqrt(VarianceScale_Step(dim,table,table_size)));
+  elliptical=CreateElliptical_Step(dim,center,scale,table,table_size);
+  dw_free(table);
+  if (cummulative)
+    TestSimulateEllipticalCummulativeDensity(elliptical,count,f_out);
+  else
+    TestSimulateEllipticalVariance(elliptical,count,f_out);
+  FreeElliptical(elliptical);
+
+  // Clean up
+  FreeMatrix(variance);
+  FreeVector(center);
+  FreeMatrix(scale);
+  FreeMatrix(base_scale);
+
+  return 0;
+}
+/*******************************************************************************/
+/*******************************************************************************/
+/*******************************************************************************/
diff --git a/include/dw_elliptical.h b/include/dw_elliptical.h
index d6c3b7e..8d0f595 100644
--- a/include/dw_elliptical.h
+++ b/include/dw_elliptical.h
@@ -84,6 +84,7 @@ void PrintEllipticalInfo_full(FILE *f_out, TElliptical *elliptical);
 
 PRECISION VarianceScale_TruncatedPower(int dim, PRECISION lower_bound, PRECISION upper_bound, PRECISION power);
 PRECISION VarianceScale_TruncatedGaussian(int dim, PRECISION lower_bound, PRECISION upper_bound, PRECISION s);
+PRECISION VarianceScale_Step(int dim, PRECISION *t, int m);
 
 TElliptical* CreateElliptical_TruncatedGaussian(int dim, TVector mean, TMatrix variance, PRECISION lower_bound, PRECISION upper_bound, PRECISION s);
 TElliptical* CreateElliptical_Gaussian(int dim, TVector mean, TMatrix variance);
@@ -93,8 +94,6 @@ TElliptical* CreateElliptical_TruncatedPower(int dim, TVector center, TMatrix sc
 					     PRECISION lower_bound, PRECISION upper_bound, PRECISION power);
 TElliptical* CreateElliptical_Step(int dim, TVector center, TMatrix scale, PRECISION *table, int m);
 
-// Testing routines
-void TestEllipticalVariance(void);
 #endif
 
 /********************************************************************************
@@ -128,7 +127,7 @@ This gives that the log of the density of z is given by
 
     -ln(abs(det(S)))-ln(2)-0.5*n*ln(pi)+ln(gamma(n/2))-(n-1)*ln(r)+ln(f(r))
 
-where r=Inverse(S)*(z-c).  
+where r=norm(Inverse(S)*(z-c)).  
 
 ---------------------------------------------------------------------------------
 Note that
@@ -153,7 +152,7 @@ The mapping to the data structure is:
   center = c
   scale = S
   quadratic_form = Inverse(S*S')
-  logabsdet = -log(abs(det(S)))
+  logabsdet = -ln(abs(det(S)))
   dim = n
 
 ---------------------------------------------------------------------------------
-- 
GitLab