+++ /dev/null
-/***************************************************************************\r
- * fit.cpp is part of Math Graphic Library\r
- * Copyright (C) 2007-2014 Alexey Balakin <mathgl.abalakin@gmail.ru> *\r
- * *\r
- * This program is free software; you can redistribute it and/or modify *\r
- * it under the terms of the GNU Library General Public License as *\r
- * published by the Free Software Foundation; either version 3 of the *\r
- * License, or (at your option) any later version. *\r
- * *\r
- * This program is distributed in the hope that it will be useful, *\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\r
- * GNU General Public License for more details. *\r
- * *\r
- * You should have received a copy of the GNU Library General Public *\r
- * License along with this program; if not, write to the *\r
- * Free Software Foundation, Inc., *\r
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *\r
- ***************************************************************************/\r
-#include <ctype.h>\r
-#include "mgl2/fit.h"\r
-#include "mgl2/prim.h"\r
-#include "mgl2/eval.h"\r
-#include "mgl2/data.h"\r
-#include "mgl2/base.h"\r
-\r
-#if MGL_HAVE_GSL\r
-#include <gsl/gsl_multifit_nlin.h>\r
-#include <gsl/gsl_blas.h>\r
-#endif\r
-HMDT MGL_NO_EXPORT mglFormulaCalc(const char *str, const std::vector<mglDataA*> &head);\r
-//-----------------------------------------------------------------------------\r
-int mglFitPnts=100; ///< Number of output points in fitting\r
-char mglFitRes[1024]; ///< Last fitted formula\r
-mreal mglFitChi=NAN; ///< Chi value for last fitted formula\r
-mglData mglFitCovar; ///< Covar matrix for lat fitted formula\r
-//-----------------------------------------------------------------------------\r
-mreal MGL_EXPORT mgl_get_fit_chi() { return mglFitChi; }\r
-mreal MGL_EXPORT mgl_get_fit_chi_() { return mglFitChi; }\r
-//-----------------------------------------------------------------------------\r
-HCDT MGL_EXPORT mgl_get_fit_covar() { return &mglFitCovar; }\r
-uintptr_t MGL_EXPORT mgl_get_fit_covar_() { return (uintptr_t)&mglFitCovar; }\r
-//-----------------------------------------------------------------------------\r
-void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *pre, const char *font, double size)\r
-{\r
- long n = strlen(mglFitRes)+(pre?strlen(pre):0)+1;\r
- char *buf = new char[n];\r
- if(pre) snprintf(buf,n,"%s%s",pre,mglFitRes);\r
- else strncpy(buf,mglFitRes,n);\r
- buf[n-1]=0; mgl_puts(gr,x,y,z,buf,font,size);\r
- delete []buf;\r
-}\r
-void MGL_EXPORT mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const char *prefix, const char *font, mreal *size, int l, int n)\r
-{\r
- char *s=new char[l+1]; memcpy(s,prefix,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,font,n); d[n]=0;\r
- mgl_puts_fit(_GR_, *x,*y,*z, s, d, *size);\r
- delete []s; delete []d;\r
-}\r
-//-----------------------------------------------------------------------------\r
-/// Structure for keeping data and precompiled fitted formula\r
-struct mglFitData\r
-{\r
- long n; ///< number of points\r
- mglDataA *x,*y,*z; ///< x, y, z values\r
- mreal *a; ///< function values\r
- mreal *s; ///< value dispersions (sigma)\r
- const char *eq; ///< approximation formula\r
- int m; ///< number of variables\r
- const char *var; ///< variables for fitting\r
-};\r
-//-----------------------------------------------------------------------------\r
-#if MGL_HAVE_GSL\r
-int mgl_fit__f (const gsl_vector *x, void *data, gsl_vector *f)\r
-{\r
- mglFitData *fd = (mglFitData *)data;\r
- mglDataV *var = new mglDataV[fd->m];\r
- std::vector<mglDataA*> list;\r
- for(long i=0;i<fd->m;i++)\r
- { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); }\r
- if(fd->x) list.push_back(fd->x);\r
- if(fd->y) list.push_back(fd->y);\r
- if(fd->z) list.push_back(fd->z);\r
- HMDT res = mglFormulaCalc(fd->eq, list);\r
-#pragma omp parallel for\r
- for(long i=0;i<fd->n;i++)\r
- {\r
- mreal aa = fd->a[i], ss = fd->s[i];\r
- if(mgl_isnum(aa) && ss==ss && ss!=0)\r
- gsl_vector_set (f, i, (res->a[i] - aa)/ss);\r
- else gsl_vector_set (f, i, 0);\r
- }\r
- delete []var; mgl_delete_data(res);\r
- return GSL_SUCCESS;\r
-}\r
-//-----------------------------------------------------------------------------\r
-int MGL_NO_EXPORT mgl_fit__df (const gsl_vector * x, void *data, gsl_matrix * J)\r
-{\r
- mglFitData *fd = (mglFitData *)data;\r
- mglDataV *var = new mglDataV[fd->m];\r
- std::vector<mglDataA*> list;\r
- for(long i=0;i<fd->m;i++)\r
- { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); }\r
- if(fd->x) list.push_back(fd->x);\r
- if(fd->y) list.push_back(fd->y);\r
- if(fd->z) list.push_back(fd->z);\r
- HMDT res = mglFormulaCalc(fd->eq, list);\r
- const mreal eps = 1e-5;\r
- for(long j=0;j<fd->m;j++)\r
- {\r
- var[j].Fill(gsl_vector_get(x,j)+eps);\r
- HMDT dif = mglFormulaCalc(fd->eq, list);\r
- var[j].Fill(gsl_vector_get(x,j));\r
-#pragma omp parallel for\r
- for(long i=0;i<fd->n;i++)\r
- {\r
- mreal aa = fd->a[i], ss = fd->s[i];\r
- if(mgl_isnum(aa) && ss==ss && ss!=0)\r
- gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss));\r
- else gsl_matrix_set (J, i, j, 0);\r
- }\r
- mgl_delete_data(dif);\r
- }\r
- delete []var; mgl_delete_data(res);\r
- return GSL_SUCCESS;\r
-}\r
-//-----------------------------------------------------------------------------\r
-int MGL_NO_EXPORT mgl_fit__fdf (const gsl_vector * x, void *data, gsl_vector * f, gsl_matrix * J)\r
-{\r
- mglFitData *fd = (mglFitData *)data;\r
- mglDataV *var = new mglDataV[fd->m];\r
- std::vector<mglDataA*> list;\r
- for(long i=0;i<fd->m;i++)\r
- { var[i].s=fd->var[i]; var[i].Fill(gsl_vector_get(x,i)); list.push_back(var+i); }\r
- if(fd->x) list.push_back(fd->x);\r
- if(fd->y) list.push_back(fd->y);\r
- if(fd->z) list.push_back(fd->z);\r
- HMDT res = mglFormulaCalc(fd->eq, list);\r
-#pragma omp parallel for\r
- for(long i=0;i<fd->n;i++)\r
- {\r
- mreal aa = fd->a[i], ss = fd->s[i];\r
- if(mgl_isnum(aa) && ss==ss && ss!=0)\r
- gsl_vector_set (f, i, (res->a[i] - aa)/ss);\r
- else gsl_vector_set (f, i, 0);\r
- }\r
- const mreal eps = 1e-5;\r
- for(long j=0;j<fd->m;j++)\r
- {\r
- var[j].Fill(gsl_vector_get(x,j)+eps);\r
- HMDT dif = mglFormulaCalc(fd->eq, list);\r
- var[j].Fill(gsl_vector_get(x,j));\r
-#pragma omp parallel for\r
- for(long i=0;i<fd->n;i++)\r
- {\r
- mreal aa = fd->a[i], ss = fd->s[i];\r
- if(mgl_isnum(aa) && ss==ss && ss!=0)\r
- gsl_matrix_set (J, i, j, (dif->a[i]-res->a[i])/(eps*ss));\r
- else gsl_matrix_set (J, i, j, 0);\r
- }\r
- mgl_delete_data(dif);\r
- }\r
- delete []var; mgl_delete_data(res);\r
- return GSL_SUCCESS;\r
-}\r
-#endif\r
-//-----------------------------------------------------------------------------\r
-/// GSL based fitting procedure for formula/arguments specified by string\r
-mreal MGL_NO_EXPORT mgl_fit_base(mglFitData &fd, mreal *ini)\r
-{\r
-#if MGL_HAVE_GSL\r
- register long i,m=fd.m,n=fd.n,iter=0;\r
- if(n<1 || ini==0) return -1;\r
- // setup data\r
- double *x_init = new double[fd.m];\r
- for(i=0;i<m;i++) x_init[i] = ini[i];\r
- // setup fitting\r
- gsl_vector_view vx = gsl_vector_view_array(x_init, m);\r
- const gsl_multifit_fdfsolver_type *T = gsl_multifit_fdfsolver_lmsder;\r
- gsl_multifit_fdfsolver *s = gsl_multifit_fdfsolver_alloc(T, n, m);\r
- gsl_multifit_function_fdf f;\r
- f.f = mgl_fit__f; f.df = mgl_fit__df;\r
- f.fdf = mgl_fit__fdf; f.n = n; f.p = m;\r
- f.params = &fd;\r
- gsl_multifit_fdfsolver_set(s, &f, &vx.vector);\r
- int status; // start fitting\r
- do\r
- {\r
- iter++;\r
- status = gsl_multifit_fdfsolver_iterate(s);\r
- if ( status ) break;\r
- status = gsl_multifit_test_delta (s->dx, s->x, 1e-4, 1e-4 );\r
- }\r
- while ( status == GSL_CONTINUE && iter < 500 );\r
-\r
- gsl_matrix *covar = gsl_matrix_alloc(m, m);\r
-#ifdef HAVE_GSL_2\r
- gsl_matrix *J = gsl_matrix_alloc(s->fdf->n, s->fdf->p);\r
- gsl_multifit_fdfsolver_jac(s, J);\r
- gsl_multifit_covar (J, 0.0, covar);\r
- gsl_matrix_free (J);\r
-#else\r
- gsl_multifit_covar(s->J, 0.0, covar);\r
-#endif\r
- mglFitCovar.Set(covar);\r
- gsl_matrix_free(covar);\r
-\r
- mreal res = gsl_blas_dnrm2(s->f);\r
- for(i=0;i<m;i++) ini[i] = gsl_vector_get(s->x, i);\r
- // free memory\r
- gsl_multifit_fdfsolver_free(s);\r
- delete []x_init;\r
- return res;\r
-#else\r
- return 0.0;\r
-#endif\r
-}\r
-//-----------------------------------------------------------------------------\r
-void mglPrepareFitEq(mglBase *gr,mreal chi, const char *eq, const char *var, mreal *par)\r
-{\r
- char buf[32]="";\r
- mglFitChi = chi;\r
- snprintf(mglFitRes,1024,"chi=%g",chi); mglFitRes[1023]=0;\r
- size_t i,k,len=strlen(var);\r
- for(i=0;i<len;i++)\r
- {\r
- snprintf(buf,32,", %c=%g",var[i],par[i]);\r
- buf[31]=0; strcat(mglFitRes,buf);\r
- }\r
- gr->SetWarn(-1,mglFitRes);\r
-\r
- memset(mglFitRes, 0, 1024); //mglFitRes[0] = 0;\r
- len=strlen(eq);\r
- for(i=k=0;i<len;i++)\r
- {\r
- const char *c = strchr(var,eq[i]);\r
- if(c && (i==0 || !isalnum(eq[i-1])) && (i==len-1 || !isalnum(eq[i+1])))\r
- {\r
- snprintf(buf,32,"%g",par[c-var]);\r
- buf[31]=0; strcat(mglFitRes+k, buf); k+=strlen(buf);\r
- }\r
- else { mglFitRes[k] = eq[i]; k++; }\r
- }\r
- mglFitRes[k]=0;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_1(HMGL gr, HCDT y, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- gr->SaveState(opt);\r
- mglData x(y->GetNx()); x.Fill(gr->Min.x, gr->Max.x);\r
- mglData s(y); s.Fill(1,1);\r
- return mgl_fit_xys(gr,&x,y,&s,eq,var,ini,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_2(HMGL gr, HCDT z, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- gr->SaveState(opt);\r
- mglData x(z->GetNx()); x.Fill(gr->Min.x, gr->Max.x);\r
- mglData y(z->GetNy()); y.Fill(gr->Min.y, gr->Max.y);\r
- mglData s(z); s.Fill(1,1);\r
- return mgl_fit_xyzs(gr,&x,&y,z,&s,eq,var,ini,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_3(HMGL gr, HCDT a, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- gr->SaveState(opt);\r
- mglData x(a->GetNx()); x.Fill(gr->Min.x, gr->Max.x);\r
- mglData y(a->GetNy()); y.Fill(gr->Min.y, gr->Max.y);\r
- mglData z(a->GetNz()); z.Fill(gr->Min.z, gr->Max.z);\r
- mglData s(a); s.Fill(1,1);\r
- return mgl_fit_xyzas(gr,&x,&y,&z,a,&s,eq,var,ini,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xy(HMGL gr, HCDT x, HCDT y, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- mglData s(y); s.Fill(1,1);\r
- return mgl_fit_xys(gr,x,y,&s,eq,var,ini,opt);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- mglData s(z); s.Fill(1,1);\r
- return mgl_fit_xyzs(gr,x,y,z,&s,eq,var,ini,opt);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xyza(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- mglData s(a); s.Fill(1,1);\r
- return mgl_fit_xyzas(gr,x,y,z,a,&s,eq,var,ini,opt);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- gr->SaveState(opt);\r
- mglData x(y->GetNx()); x.Fill(gr->Min.x, gr->Max.x);\r
- return mgl_fit_xys(gr,&x,y,s,eq,var,ini,0);\r
-}\r
-//-----------------------------------------------------------------------------\r
-void MGL_NO_EXPORT mgl_fill_fit(HMGL gr, mglData &fit, mglData &in, mglFitData &fd, const char *var, long nx, long ny, long nz, long k)\r
-{\r
- mglDataV *vv = new mglDataV[fd.m];\r
- std::vector<mglDataA*> list;\r
- for(long i=0;i<fd.m;i++)\r
- { vv[i].s=var[i]; vv[i].Fill(in.a[i]); list.push_back(vv+i); }\r
- mglDataV x(nx,ny,nz, gr->Min.x,gr->Max.x,'x'); x.s = L"x"; list.push_back(&x);\r
- mglDataV y(nx,ny,nz, gr->Min.y,gr->Max.y,'y'); y.s = L"y"; list.push_back(&y);\r
- mglDataV z(nx,ny,nz, gr->Min.z,gr->Max.z,'z'); z.s = L"z"; list.push_back(&z);\r
- HMDT res = mglFormulaCalc(fd.eq, list);\r
- long nn = nx*ny*nz;\r
- memcpy(fit.a+k*nn,res->a,nn*sizeof(mreal));\r
- delete []vv; mgl_delete_data(res);\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT xx, HCDT yy, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- long m = yy->GetNx();\r
- mreal rr = gr->SaveState(opt);\r
- long nn = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- if(xx->GetNx()!=m)\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(m<2)\r
- { gr->SetWarn(mglWarnLow,"Fit[S]"); return 0; }\r
- if(ss->GetNN() != yy->GetNN())\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(!var || *var==0)\r
- { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; }\r
-\r
- mglData x(xx), y(yy), s(ss); x.s=L"x";\r
- long mm = yy->GetNy()*yy->GetNz();\r
-#pragma omp parallel for\r
- for(long i=0;i<m;i++) if(mgl_isnan(x.a[i]))\r
- for(long j=0;j<mm;j++) y.a[i+m*j] = NAN;\r
- mglFitData fd;\r
- fd.n = m; fd.x = &x; fd.y = 0;\r
- fd.z = 0; fd.a = y.a; fd.s = s.a;\r
- fd.eq = eq; fd.var = var; fd.m = strlen(var);\r
- mglData in(fd.m), *fit=new mglData(nn, yy->GetNy(), yy->GetNz());\r
- mreal res=-1;\r
- for(long i=0;i<yy->GetNy()*yy->GetNz();i++)\r
- {\r
- if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m);\r
- else in.Fill(0.,0);\r
- mglDataR xc(x); xc.SetInd(i%x.ny, L"x");\r
- fd.a = y.a+i*m; fd.x = &xc; //x.a+(i%x.ny)*m;\r
- fd.s = s.a+i*m;\r
- res = mgl_fit_base(fd,in.a);\r
- mgl_fill_fit(gr,*fit,in,fd,var,nn,1,1,i);\r
- if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
- }\r
- mglPrepareFitEq(gr,res,eq,var,in.a);\r
- gr->LoadState(); return fit;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- long m=zz->GetNx(),n=zz->GetNy();\r
- mreal rr = gr->SaveState(opt);\r
- long nn = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- if(xx->GetNx()!=m)\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(ss->GetNN() != zz->GetNN())\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(yy->GetNx()!=n && (xx->GetNy()!=n || yy->GetNx()!=m || yy->GetNy()!=n))\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(m<2|| n<2)\r
- { gr->SetWarn(mglWarnLow,"Fit[S]"); return 0; }\r
- if(!var || *var==0)\r
- { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; }\r
-\r
- mglData x(m, n), y(m, n), z(zz), s(ss); x.s=L"x"; y.s=L"y";\r
- long nz = zz->GetNz(), mm = n*m;\r
-#pragma omp parallel for collapse(2)\r
- for(long i=0;i<m;i++) for(long j=0;j<n;j++)\r
- {\r
- register long i0 = i+m*j;\r
- x.a[i0] = GetX(xx,i,j,0).x;\r
- y.a[i0] = GetY(yy,i,j,0).x;\r
- if(mgl_isnan(x.a[i0]) || mgl_isnan(y.a[i0]))\r
- for(long k=0;k<nz;k++) z.a[i0+mm*k] = NAN;\r
- }\r
- mglFitData fd;\r
- fd.n = m*n; fd.x = &x; fd.y = &y;\r
- fd.z = 0; fd.a = z.a; fd.s = s.a;\r
- fd.eq = eq; fd.var=var; fd.m = strlen(var);\r
-\r
- mglData in(fd.m), *fit=new mglData(nn, nn, zz->GetNz());\r
- mreal res = -1;\r
- for(long i=0;i<nz;i++)\r
- {\r
- if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m);\r
- else in.Fill(0.,0);\r
- fd.a = z.a+i*m*n; fd.s = s.a+i*m*n;\r
- res = mgl_fit_base(fd,in.a);\r
- mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,1,i);\r
- if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
- }\r
- mglPrepareFitEq(gr,res, eq,var,in.a);\r
- gr->LoadState(); return fit;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT xx, HCDT yy, HCDT zz, HCDT aa, HCDT ss, const char *eq, const char *var, HMDT ini, const char *opt)\r
-{\r
- long m=aa->GetNx(), n=aa->GetNy(), l=aa->GetNz(), i = n*m*l;\r
- mreal rr = gr->SaveState(opt);\r
- long nn = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- if(m<2 || n<2 || l<2)\r
- { gr->SetWarn(mglWarnLow,"Fit[S]"); return 0; }\r
- if(ss->GetNN() != i)\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- bool both = xx->GetNN()==i && yy->GetNN()==i && zz->GetNN()==i;\r
- if(!(both || (xx->GetNx()==m && yy->GetNx()==n && zz->GetNx()==l)))\r
- { gr->SetWarn(mglWarnDim,"Fit[S]"); return 0; }\r
- if(!var || *var==0)\r
- { gr->SetWarn(mglWarnNull,"Fit[S]"); return 0; }\r
-\r
- mglData x(m,n,l), y(m,n,l), z(m,n,l), a(aa), s(ss);\r
- x.s=L"x"; y.s=L"y"; z.s=L"z";\r
-#pragma omp parallel for collapse(3)\r
- for(long i=0;i<m;i++) for(long j=0;j<n;j++) for(long k=0;k<l;k++)\r
- {\r
- register long i0 = i+m*(j+n*k);\r
- x.a[i0] = GetX(xx,i,j,k).x;\r
- y.a[i0] = GetY(yy,i,j,k).x;\r
- z.a[i0] = GetZ(zz,i,j,k).x;\r
- if(mgl_isnan(x.a[i0]) || mgl_isnan(y.a[i0]) || mgl_isnan(z.a[i0])) a.a[i0] = NAN;\r
- }\r
- mglFitData fd;\r
- fd.n = m*n*l; fd.x = &x; fd.y = &y;\r
- fd.z = &z; fd.a = a.a; fd.s = s.a;\r
- fd.eq = eq; fd.var=var; fd.m = strlen(var);\r
- mglData in(fd.m), *fit=new mglData(nn, nn, nn);\r
- mreal res = -1;\r
-\r
- if(ini && ini->nx>=fd.m) in.Set(ini->a,fd.m);\r
- else in.Fill(0.,0);\r
- res = mgl_fit_base(fd,in.a);\r
- mgl_fill_fit(gr,*fit,in,fd,var,nn,nn,nn,0);\r
- if(ini && ini->nx>=fd.m) memcpy(ini->a,in.a,fd.m*sizeof(mreal));\r
-\r
- mglPrepareFitEq(gr,res, eq,var,in.a);\r
- gr->LoadState(); return fit;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt)\r
-{\r
- long nn=a->GetNN();\r
- if(nn!=x->GetNN())\r
- { gr->SetWarn(mglWarnDim,"Hist"); return 0; }\r
- mreal rr = gr->SaveState(opt);\r
- long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- mglData *res = new mglData(n);\r
-\r
- mreal vx = n/(gr->Max.x-gr->Min.x);\r
- for(long i=0;i<nn;i++)\r
- {\r
- register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
- if(j1>=0 && j1<n) res->a[j1] += a->vthr(i);\r
- }\r
- gr->LoadState(); return res;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt)\r
-{\r
- long nn=a->GetNN();\r
- if(nn!=x->GetNN() || nn!=y->GetNN())\r
- { gr->SetWarn(mglWarnDim,"Hist"); return 0; }\r
- mreal rr = gr->SaveState(opt);\r
- long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- mglData *res = new mglData(n, n);\r
- mreal vx = n/(gr->Max.x-gr->Min.x);\r
- mreal vy = n/(gr->Max.y-gr->Min.y);\r
- for(long i=0;i<nn;i++)\r
- {\r
- register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
- register long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
- if(j1>=0 && j1<n && j2>=0 && j2<n) res->a[j1+n*j2] += a->vthr(i);\r
- }\r
- gr->LoadState(); return res;\r
-}\r
-//-----------------------------------------------------------------------------\r
-HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt)\r
-{\r
- long nn=a->GetNN();\r
- if(nn!=x->GetNN() || nn!=y->GetNN() || nn!=z->GetNN())\r
- { gr->SetWarn(mglWarnDim,"Hist"); return 0; }\r
- mreal rr = gr->SaveState(opt);\r
- long n = (mgl_isnan(rr) || rr<=0) ? mglFitPnts:long(rr+0.5);\r
- mglData *res = new mglData(n, n, n);\r
- mreal vx = n/(gr->Max.x-gr->Min.x), vy = n/(gr->Max.y-gr->Min.y), vz = n/(gr->Max.z-gr->Min.z);\r
- for(long i=0;i<nn;i++)\r
- {\r
- register long j1 = long((x->vthr(i)-gr->Min.x)*vx);\r
- register long j2 = long((y->vthr(i)-gr->Min.y)*vy);\r
- register long j3 = long((z->vthr(i)-gr->Min.z)*vz);\r
- if(j1>=0 && j1<n && j2>=0 && j2<n && j3>=0 && j3<n)\r
- res->a[j1+n*(j2+n*j3)] += a->vthr(i);\r
- }\r
- gr->LoadState(); return res;\r
-}\r
-//-----------------------------------------------------------------------------\r
-uintptr_t MGL_EXPORT mgl_hist_x_(uintptr_t* gr, uintptr_t* x, uintptr_t* a, const char *opt, int lo)\r
-{ char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_hist_x(_GR_, _DA_(x), _DA_(a), o);\r
- delete []o; return r; }\r
-uintptr_t MGL_EXPORT mgl_hist_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* a, const char *opt, int lo)\r
-{ char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_hist_xy(_GR_, _DA_(x), _DA_(y), _DA_(a), o);\r
- delete []o; return r; }\r
-uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *opt, int lo)\r
-{ char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_hist_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), o);\r
- delete []o; return r; }\r
-//-----------------------------------------------------------------------------\r
-MGL_EXPORT const char *mgl_get_fit(HMGL ) { return mglFitRes; }\r
-int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len)\r
-{\r
- const char *res = mgl_get_fit(_GR_);\r
- if(out) strncpy(out,res,len);\r
- return strlen(res);\r
-}\r
-//-----------------------------------------------------------------------------\r
-uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_1(_GR_, _DA_(y), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_2(_GR_, _DA_(z), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_3(_GR_, _DA_(a), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xy(_GR_, _DA_(x), _DA_(y), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xyz(_GR_, _DA_(x), _DA_(y), _DA_(z), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xyza(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_ys(_GR_, _DA_(y), _DA_(ss), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xys(_GR_, _DA_(x), _DA_(y), _DA_(ss), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xyzs(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(ss), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *var, uintptr_t *ini, const char *opt, int l, int n, int lo)\r
-{\r
- char *s=new char[l+1]; memcpy(s,eq,l); s[l]=0;\r
- char *d=new char[n+1]; memcpy(d,var,n); d[n]=0;\r
- char *o=new char[lo+1]; memcpy(o,opt,lo); o[lo]=0;\r
- uintptr_t r = (uintptr_t)mgl_fit_xyzas(_GR_, _DA_(x), _DA_(y), _DA_(z), _DA_(a), _DA_(ss), s, d, _DM_(ini), o);\r
- delete []o; delete []s; delete []d; return r;\r
-}\r
-//-----------------------------------------------------------------------------\r
libgif-dev, python-dev, python-numpy, libfontconfig1-dev, libqtwebkit-dev,
libhdf4-dev, chrpath, libxinerama-dev, libxmu-dev, libxi-dev, libhpdf-dev,
mpi-default-dev, swig3.0, cmake, libxft-dev, liboctave-dev, fluid
-Standards-Version: 3.9.6
+Standards-Version: 3.9.7
Homepage: http://mathgl.sourceforge.net/doc_en/Main.html
-Vcs-Git: git://anonscm.debian.org/debian-science/packages/mathgl.git
-Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-science/packages/mathgl.git
+Vcs-Git: https://anonscm.debian.org/debian-science/packages/mathgl.git
+Vcs-Browser: https://anonscm.debian.org/gitweb/?p=debian-science/packages/mathgl.git
Package: mathgl
Architecture: any
Section: libs
-Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl7.4.0 (= ${binary:Version})
+Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl7.4.1 (= ${binary:Version})
Description: library for scientific graphs (utilities and examples)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
Package: udav
Architecture: any
Section: libs
-Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl7.4.0 (= ${binary:Version})
+Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl7.4.1 (= ${binary:Version})
Description: library for scientific graphs (window interface)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
# .
# This package contains the MathGL documentation in English.
-Package: libmgl7.4.0
+Package: libmgl7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl5, libmgl6, libmgl6.0.0, libmgl7.1.0, libmgl7.2.0
-Conflicts: libmgl5, libmgl6, libmgl6.0.0, libmgl7.1.0, libmgl7.2.0
+Replaces: libmgl5, libmgl6, libmgl6.0.0, libmgl7.1.0, libmgl7.2.0,
+ libmgl7.4.0
+Conflicts: libmgl5, libmgl6, libmgl6.0.0, libmgl7.1.0, libmgl7.2.0,
+ libmgl7.4.0
Description: library for scientific graphs (main runtime library)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
.
This package contains the shared object files.
-Package: libmgl-mpi7.4.0
+Package: libmgl-mpi7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl-mpi7.0.0, libmgl-mpi7.1.0, libmgl-mpi7.2.0
-Conflicts: libmgl-mpi7.0.0, libmgl-mpi7.1.0, libmgl-mpi7.2.0
+Replaces: libmgl-mpi7.0.0, libmgl-mpi7.1.0, libmgl-mpi7.2.0, libmgl-mpi7.4.0
+Conflicts: libmgl-mpi7.0.0, libmgl-mpi7.1.0, libmgl-mpi7.2.0, libmgl-mpi7.4.0
Description: library for scientific graphs (mpi enhanced runtime library)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
This package contains the, parallel interface enhanced, shared object
files.
-Package: libmgl-wnd7.4.0
+Package: libmgl-wnd7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
Replaces: libmgl-fltk5, libmgl-wnd6, libmgl-qt5, libmgl-wx5, libmgl-wnd6.0.0,
- libmgl-wnd7.1.0, libmgl-wnd7.2.0
+ libmgl-wnd7.1.0, libmgl-wnd7.2.0, libmgl-wnd7.4.0
Conflicts: libmgl-fltk5, libmgl-wnd6, libmgl-qt5, libmgl-wx5, libmgl-wnd6.0.0,
- libmgl-wnd7.1.0, libmgl-wnd7.2.0
+ libmgl-wnd7.1.0, libmgl-wnd7.2.0, libmgl-wnd7.4.0
Description: library for scientific graphs (windows runtime library)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
.
This package contains the window opening related shared object files based
on Fltk, Qt and Wx.
-
-Package: libmgl-glut7.4.0
+
+Package: libmgl-glut7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl-glut5, libmgl-glut6.0.0, libmgl-glut7.1.0, libmgl-glut7.2.0
-Conflicts: libmgl-glut5, libmgl-glut6.0.0, libmgl-glut7.1.0, libmgl-glut7.2.0
+Replaces: libmgl-glut5, libmgl-glut6.0.0, libmgl-glut7.1.0, libmgl-glut7.2.0,
+ libmgl-glut7.4.0
+Conflicts: libmgl-glut5, libmgl-glut6.0.0, libmgl-glut7.1.0, libmgl-glut7.2.0,
+ libmgl-glut7.4.0
Description: library for scientific graphs (glut interface for windows)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
This package contains the glut interface shared object files for window
opening.
-Package: libmgl-qt7.4.0
+Package: libmgl-qt5-7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl-qt5, libmgl-qt7.1.0, libmgl-qt7.2.0
-Conflicts: libmgl-qt5, libmgl-qt7.1.0, libmgl-qt7.2.0
+Replaces: libmgl-qt5, libmgl-qt7.1.0, libmgl-qt7.2.0, libmgl-qt7.4.0
+Conflicts: libmgl-qt5, libmgl-qt7.1.0, libmgl-qt7.2.0, libmgl-qt7.4.0
Description: library for scientific graphs (Qt interface for windows)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
This package contains the Qt interface shared object files for window
opening.
-Package: libmgl-fltk7.4.0
+Package: libmgl-fltk7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl-fltk5, libmgl-fltk7.1.0, libmgl-fltk7.2.0
-Conflicts: libmgl-fltk5, libmgl-fltk7.1.0, libmgl-fltk7.2.0
+Replaces: libmgl-fltk5, libmgl-fltk7.1.0, libmgl-fltk7.2.0, libmgl-fltk7.4.0
+Conflicts: libmgl-fltk5, libmgl-fltk7.1.0, libmgl-fltk7.2.0, libmgl-fltk7.4.0
Description: library for scientific graphs (fltk interface for windows)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
This package contains the fltk interface shared object files for window
opening.
-Package: libmgl-wx7.4.0
+Package: libmgl-wx7.4.1
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, ${misc:Depends}, libmgl-data
-Replaces: libmgl-wx5, libmgl-wx7.1.0, libmgl-wx7.2.0
-Conflicts: libmgl-wx5, libmgl-wx7.1.0, libmgl-wx7.2.0
+Replaces: libmgl-wx5, libmgl-wx7.1.0, libmgl-wx7.2.0, libmgl-wx7.4.0
+Conflicts: libmgl-wx5, libmgl-wx7.1.0, libmgl-wx7.2.0, libmgl-wx7.4.0
Description: library for scientific graphs (wx interface for windows)
A free cross-platform library of fast C++ routines for plotting data in up
to 3 dimensions. It can export plots to bitmaps and vector EPS, SVG, IDTF
Package: libmgl-dev
Architecture: any
Section: libdevel
-Depends: libmgl7.4.0 (= ${binary:Version}), libmgl-wnd7.4.0 (= ${binary:Version}),
- libmgl-wx7.4.0 (= ${binary:Version}), libmgl-fltk7.4.0 (= ${binary:Version}),
- libmgl-qt7.4.0 (= ${binary:Version}), libmgl-glut7.4.0 (= ${binary:Version}),
- libmgl-mpi7.4.0 (= ${binary:Version}), ${misc:Depends}, libgsl-dev,
+Depends: libmgl7.4.1 (= ${binary:Version}), libmgl-wnd7.4.1 (= ${binary:Version}),
+ libmgl-wx7.4.1 (= ${binary:Version}), libmgl-fltk7.4.1 (= ${binary:Version}),
+ libmgl-qt5-7.4.1 (= ${binary:Version}), libmgl-glut7.4.1 (= ${binary:Version}),
+ libmgl-mpi7.4.1 (= ${binary:Version}), ${misc:Depends}, libgsl-dev,
libgl1-mesa-dev | libgl-dev, libpng-dev
Description: library for scientific graphs (development files)
A free cross-platform library of fast C++ routines for plotting data in up
MathGL can also be used in the console. There are interfaces to a set of
languages, such as, C, Fortran, Pascal, Forth, Python, Octave.
.
- This package provides the Python module for mathgl.
\ No newline at end of file
+ This package provides the Python module for mathgl.