[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [labplot] src: added fit model for hypergeometric distribution
From:       Stefan Gerlach <null () kde ! org>
Date:       2017-05-31 21:15:25
Message-ID: E1dGAxh-00010R-Cg () code ! kde ! org
[Download RAW message or body]

Git commit 55b1da8ed789b925a5566c6bee19c5767cd3c152 by Stefan Gerlach.
Committed on 31/05/2017 at 21:15.
Pushed by sgerlach into branch 'master'.

added fit model for hypergeometric distribution

M  +16   -0    src/backend/nsl/nsl_fit.c
M  +1    -0    src/backend/nsl/nsl_fit.h
M  +17   -1    src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
M  +4    -2    src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
M  +-    --    src/pics/gsl_distributions/hypergeometric.jpg

https://commits.kde.org/labplot/55b1da8ed789b925a5566c6bee19c5767cd3c152

diff --git a/src/backend/nsl/nsl_fit.c b/src/backend/nsl/nsl_fit.c
index be69838e..2888f6fc 100644
--- a/src/backend/nsl/nsl_fit.c
+++ b/src/backend/nsl/nsl_fit.c
@@ -617,6 +617,22 @@ double nsl_fit_model_geometric_param_deriv(int param, double k, \
double p, double  
 	return 0;
 }
+double nsl_fit_model_hypergeometric_param_deriv(int param, double k, double n1, \
double n2, double t, double A, double weight) { +	if (t > n1 + n2)
+		return 0;
+
+	double norm = weight * gsl_ran_hypergeometric_pdf(k, n1, n2, t);
+	if (param == 0)
+		return A * norm * (gsl_sf_psi(n1+1.) - gsl_sf_psi(n1-k+1.) - gsl_sf_psi(n1+n2+1.) \
+ gsl_sf_psi(n1+n2-t+1.)); +	if (param == 1)
+		return A * norm * (gsl_sf_psi(n2+1.) - gsl_sf_psi(n2+k-t+1.) - \
gsl_sf_psi(n1+n2+1.) + gsl_sf_psi(n1+n2-t+1.)); +	if (param == 2)
+		return A * norm * (gsl_sf_psi(n2+k-t+1.) - gsl_sf_psi(n1+n2-t+1.) - \
gsl_sf_psi(t-k+1.) + gsl_sf_psi(t+1.)); +	if (param == 3)
+		return norm;
+
+	return 0;
+}
 double nsl_fit_model_logarithmic_param_deriv(int param, double k, double p, double \
A, double weight) {  if (param == 0)
 		return A * weight * pow(1.-p, k-2.) * (1.-k*p);
diff --git a/src/backend/nsl/nsl_fit.h b/src/backend/nsl/nsl_fit.h
index 7b006cd1..78e52a64 100644
--- a/src/backend/nsl/nsl_fit.h
+++ b/src/backend/nsl/nsl_fit.h
@@ -118,6 +118,7 @@ double nsl_fit_model_binomial_param_deriv(int param, double x, \
double p, double  double nsl_fit_model_negative_binomial_param_deriv(int param, \
double k, double p, double n, double A, double weight);  double \
nsl_fit_model_pascal_param_deriv(int param, double k, double p, double n, double A, \
double weight);  double nsl_fit_model_geometric_param_deriv(int param, double k, \
double p, double A, double weight); +double \
nsl_fit_model_hypergeometric_param_deriv(int param, double k, double n1, double n2, \
double t, double A, double weight);  double nsl_fit_model_logarithmic_param_deriv(int \
param, double k, double p, double A, double weight);  
 double nsl_fit_model_maxwell_param_deriv(int param, double x, double a, double c, \
                double weight);
diff --git a/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp \
b/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp index 8283b699..96559535 \
                100644
--- a/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
+++ b/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
@@ -888,12 +888,28 @@ int func_df(const gsl_vector* paramValues, void* params, \
gsl_matrix* J) {  }
 			break;
 		}
+		case nsl_sf_stats_hypergeometric: {
+			double n1 = nsl_fit_map_bound(gsl_vector_get(paramValues, 0), min[0], max[0]);
+			double n2 = nsl_fit_map_bound(gsl_vector_get(paramValues, 1), min[1], max[1]);
+			double t = nsl_fit_map_bound(gsl_vector_get(paramValues, 2), min[2], max[2]);
+			double a = nsl_fit_map_bound(gsl_vector_get(paramValues, 3), min[3], max[3]);
+			for (size_t i = 0; i < n; i++) {
+				x = xVector[i];
+
+				for (int j = 0; j < 4; j++) {
+					if (fixed[j])
+						gsl_matrix_set(J, i, j, 0.);
+					else
+						gsl_matrix_set(J, i, j, nsl_fit_model_hypergeometric_param_deriv(j, x, n1, n2, \
t, a, weight[i])); +				}
+			}
+			break;
+		}
 		// TODO: not implemented yet:
 		case nsl_sf_stats_levy_alpha_stable:
 		case nsl_sf_stats_levy_skew_alpha_stable:
 		case nsl_sf_stats_fdist:
 		case nsl_sf_stats_bernoulli:
-		case nsl_sf_stats_hypergeometric:
 			break;
 		}
 		break;
diff --git a/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp \
b/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp index f2d7a06f..aeed2280 100644
--- a/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
+++ b/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
@@ -416,7 +416,7 @@ void XYFitCurveDock::categoryChanged(int index) {
 		for(int i = 1; i < NSL_SF_STATS_DISTRIBUTION_COUNT; i++) {
 			//TODO: not implemented yet:
 			if (i == nsl_sf_stats_levy_alpha_stable || i == \
                nsl_sf_stats_levy_skew_alpha_stable ||
-				i == nsl_sf_stats_fdist || i == nsl_sf_stats_bernoulli || i == \
nsl_sf_stats_hypergeometric) { +				i == nsl_sf_stats_fdist || i == \
nsl_sf_stats_bernoulli) {  QStandardItem* item = model->item(i);
 					item->setFlags(item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled));
 			}
@@ -855,7 +855,9 @@ void XYFitCurveDock::updateModelEquation() {
 			m_fitData.paramNames << "p" << "a";
 			m_fitData.paramNamesUtf8 << "p" << "A";
 			break;
-		case nsl_sf_stats_hypergeometric:	// TODO
+		case nsl_sf_stats_hypergeometric:
+			m_fitData.paramNames << "n1" << "n2" << "t" << "a";
+			m_fitData.paramNamesUtf8 << "n" + QString::fromUtf8("\u2081") << "n" + \
QString::fromUtf8("\u2082") << "t" << "A";  break;
 		case nsl_sf_stats_maxwell_boltzmann:
 			m_fitData.paramNames << "s" << "a";
diff --git a/src/pics/gsl_distributions/hypergeometric.jpg \
b/src/pics/gsl_distributions/hypergeometric.jpg index 7f24fab2..005161c9 100644
Binary files a/src/pics/gsl_distributions/hypergeometric.jpg and \
b/src/pics/gsl_distributions/hypergeometric.jpg differ


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic