summaryrefslogtreecommitdiff
path: root/src/divonne/Divonne.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/divonne/Divonne.c')
-rw-r--r--src/divonne/Divonne.c157
1 files changed, 157 insertions, 0 deletions
diff --git a/src/divonne/Divonne.c b/src/divonne/Divonne.c
new file mode 100644
index 0000000..5fcaada
--- /dev/null
+++ b/src/divonne/Divonne.c
@@ -0,0 +1,157 @@
+/*
+ Divonne.c
+ Multidimensional integration by partitioning
+ originally by J.H. Friedman and M.H. Wright
+ (CERNLIB subroutine D151)
+ this version by Thomas Hahn
+ last modified 15 Nov 11 th
+*/
+
+#include "decl.h"
+
+#define Print(s) puts(s); fflush(stdout)
+
+/*********************************************************************/
+
+#define DIVONNE
+static void DoSample(This *t, number n, creal *x, real *f, ccount ldx);
+static int ExploreParent(This *t, cint iregion);
+
+/*********************************************************************/
+
+static inline count SampleExtra(This *t, cBounds *b)
+{
+ number n = t->nextra;
+ t->peakfinder(&t->ndim, b, &n, t->xextra);
+ DoSample(t, n, t->xextra, t->fextra, t->ldxgiven);
+ return n;
+}
+
+/*********************************************************************/
+
+static inline void AllocGiven(This *t, creal *xgiven)
+{
+ if( t->ngiven | t->nextra ) {
+ cnumber nxgiven = t->ngiven*(t->ldxgiven = IMax(t->ldxgiven, t->ndim));
+ cnumber nxextra = t->nextra*t->ldxgiven;
+ cnumber nfgiven = t->ngiven*t->ncomp;
+ cnumber nfextra = t->nextra*t->ncomp;
+
+ Alloc(t->xgiven, nxgiven + nxextra + nfgiven + nfextra);
+ t->xextra = t->xgiven + nxgiven;
+ t->fgiven = t->xextra + nxextra;
+ t->fextra = t->fgiven + nfgiven;
+
+ if( nxgiven ) {
+ t->phase = 0;
+ Copy(t->xgiven, xgiven, nxgiven);
+ DoSample(t, t->ngiven, t->xgiven, t->fgiven, t->ldxgiven);
+ }
+ }
+}
+
+/*********************************************************************/
+
+#include "common.c"
+#include "DoSample.c"
+
+Extern void EXPORT(Divonne)(ccount ndim, ccount ncomp,
+ Integrand integrand, void *userdata,
+ creal epsrel, creal epsabs,
+ cint flags, cint seed,
+ cnumber mineval, cnumber maxeval,
+ cint key1, cint key2, cint key3, ccount maxpass,
+ creal border, creal maxchisq, creal mindeviation,
+ cnumber ngiven, ccount ldxgiven, creal *xgiven,
+ cnumber nextra, PeakFinder peakfinder,
+ int *pnregions, number *pneval, int *pfail,
+ real *integral, real *error, real *prob)
+{
+ This t;
+ t.ndim = ndim;
+ t.ncomp = ncomp;
+ t.integrand = integrand;
+ t.userdata = userdata;
+ t.epsrel = epsrel;
+ t.epsabs = epsabs;
+ t.flags = flags;
+ t.seed = seed;
+ t.mineval = mineval;
+ t.maxeval = maxeval;
+ t.key1 = key1;
+ t.key2 = key2;
+ t.key3 = key3;
+ t.maxpass = maxpass;
+ t.border.upper = 1 - (t.border.lower = border);
+ t.maxchisq = maxchisq;
+ t.mindeviation = mindeviation;
+ t.ngiven = ngiven;
+ t.xgiven = NULL;
+ t.ldxgiven = ldxgiven;
+ t.nextra = nextra;
+ t.peakfinder = peakfinder;
+ t.nregions = 0;
+ t.neval = 0;
+
+ ForkCores(&t);
+ AllocGiven(&t, xgiven);
+
+ *pfail = Integrate(&t, integral, error, prob);
+ *pnregions = t.nregions;
+ *pneval = t.neval;
+
+ free(t.xgiven);
+ WaitCores(&t);
+}
+
+/*********************************************************************/
+
+Extern void EXPORT(divonne)(ccount *pndim, ccount *pncomp,
+ Integrand integrand, void *userdata,
+ creal *pepsrel, creal *pepsabs,
+ cint *pflags, cint *pseed,
+ cnumber *pmineval, cnumber *pmaxeval,
+ cint *pkey1, cint *pkey2, cint *pkey3, ccount *pmaxpass,
+ creal *pborder, creal *pmaxchisq, creal *pmindeviation,
+ cnumber *pngiven, ccount *pldxgiven, creal *xgiven,
+ cnumber *pnextra, PeakFinder peakfinder,
+ int *pnregions, number *pneval, int *pfail,
+ real *integral, real *error, real *prob)
+{
+ This t;
+ t.ndim = *pndim;
+ t.ncomp = *pncomp;
+ t.integrand = integrand;
+ t.userdata = userdata;
+ t.epsrel = *pepsrel;
+ t.epsabs = *pepsabs;
+ t.flags = *pflags;
+ t.seed = *pseed;
+ t.mineval = *pmineval;
+ t.maxeval = *pmaxeval;
+ t.key1 = *pkey1;
+ t.key2 = *pkey2;
+ t.key3 = *pkey3;
+ t.maxpass = *pmaxpass;
+ t.border.upper = 1 - (t.border.lower = *pborder);
+ t.maxchisq = *pmaxchisq;
+ t.mindeviation = *pmindeviation;
+ t.ngiven = *pngiven;
+ t.xgiven = NULL;
+ t.ldxgiven = *pldxgiven;
+ t.nextra = *pnextra;
+ t.peakfinder = peakfinder;
+ t.nregions = 0;
+ t.neval = 0;
+
+ ForkCores(&t);
+ AllocGiven(&t, xgiven);
+
+ *pfail = Integrate(&t, integral, error, prob);
+ *pnregions = t.nregions;
+ *pneval = t.neval;
+
+ free(t.xgiven);
+ WaitCores(&t);
+}
+