[gnumeric] Add non-parametric sign test



commit 0c4fe9348c8c9cdfbfb343291084731a591fd617
Author: Andreas J. Guelzow <aguelzow pyrshep ca>
Date:   Fri Dec 11 17:59:49 2009 -0700

    Add non-parametric sign test
    
    2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* POTFILES.in: added src/dialogs/dialog-analysis-tool-sign-test.c,
    	  src/tools/analysis-sign-test.c and src/dialogs/sign-test.glade
    
    2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* POTFILES.in: added src/dialogs/dialog-analysis-tool-sign-test.c
    	  and src/tools/analysis-sign-test.c
    	* POTFILES.skip: added src/dialogs/sign-test.glade
    
    2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* component/Gnumeric-embed.xml.in: add sign test
    	* src/HILDON_Gnumeric-gtk.xml.in: add sign test
    	* src/GNOME_Gnumeric-gtk.xml.in: add sign test
    	* src/wbc-gtk-actions.c: add sign test action
    
    2009-12-11 Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* analysis-sign-test.c: new
    	* analysis-sign-test.h: new
    	* Makefile.am: add the above
    
    2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
    
    	* dialog-analysis-tool-sign-test.c: new
    	* sign-test.glade: new
    	* Makefile.am: add the above
    	* dialogs.h (dialog_sign_test_tool): new
    	* help.h: add GNUMERIC_HELP_LINK_SIGN_TEST

 ChangeLog                                    |    7 +
 component/Gnumeric-embed.xml.in              |    1 +
 po-functions/ChangeLog                       |    6 +
 po-functions/POTFILES.in                     |    2 +
 po-functions/POTFILES.skip                   |    1 +
 po/ChangeLog                                 |    5 +
 po/POTFILES.in                               |    3 +
 src/GNOME_Gnumeric-gtk.xml.in                |    1 +
 src/HILDON_Gnumeric-gtk.xml.in               |    3 +-
 src/dialogs/ChangeLog                        |    8 +
 src/dialogs/Makefile.am                      |    2 +
 src/dialogs/dialog-analysis-tool-sign-test.c |  239 +++++++++++++++++
 src/dialogs/dialogs.h                        |    1 +
 src/dialogs/help.h                           |    3 +
 src/dialogs/sign-test.glade                  |  372 ++++++++++++++++++++++++++
 src/tools/ChangeLog                          |    6 +
 src/tools/Makefile.am                        |    2 +
 src/tools/analysis-sign-test.c               |  189 +++++++++++++
 src/tools/analysis-sign-test.h               |   47 ++++
 src/wbc-gtk-actions.c                        |    4 +
 20 files changed, 901 insertions(+), 1 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c4f5aa5..2bfb813 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* component/Gnumeric-embed.xml.in: add sign test
+	* src/HILDON_Gnumeric-gtk.xml.in: add sign test
+	* src/GNOME_Gnumeric-gtk.xml.in: add sign test
+	* src/wbc-gtk-actions.c: add sign test action
+
 2009-12-11  Morten Welinder  <terra gnome org>
 
 	* src/value.c (criteria_inspect_values): Fix bool issues.
diff --git a/component/Gnumeric-embed.xml.in b/component/Gnumeric-embed.xml.in
index 60a921a..8fcd5f4 100644
--- a/component/Gnumeric-embed.xml.in
+++ b/component/Gnumeric-embed.xml.in
@@ -187,6 +187,7 @@
         <menuitem action="ToolsRanking"/>
         <menuitem action="ToolsRegression"/>
         <menuitem action="ToolsSampling"/>
+        <menuitem action="ToolsOneMedianSignTest"/>
         <menu name="ToolTTest" action="MenuToolTTest">
           <menuitem action="ToolTTestPaired"/>
           <menuitem action="ToolTTestEqualVar"/>
diff --git a/po-functions/ChangeLog b/po-functions/ChangeLog
index ffbb427..e9392a9 100644
--- a/po-functions/ChangeLog
+++ b/po-functions/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* POTFILES.in: added src/dialogs/dialog-analysis-tool-sign-test.c
+	  and src/tools/analysis-sign-test.c
+	* POTFILES.skip: added src/dialogs/sign-test.glade
+
 2009-11-29  Morten Welinder <terra gnome org>
 
 	* Release 1.9.16
diff --git a/po-functions/POTFILES.in b/po-functions/POTFILES.in
index b9ae069..a9b7463 100644
--- a/po-functions/POTFILES.in
+++ b/po-functions/POTFILES.in
@@ -77,6 +77,7 @@ src/dialogs/dialog-analysis-tool-chi-squared.c
 src/dialogs/dialog-analysis-tool-frequency.c
 src/dialogs/dialog-analysis-tool-kaplan-meier.c
 src/dialogs/dialog-analysis-tool-normality.c
+src/dialogs/dialog-analysis-tool-sign-test.c
 src/dialogs/dialog-analysis-tools.c
 src/dialogs/dialog-autofilter.c
 src/dialogs/dialog-autoformat.c
@@ -196,6 +197,7 @@ src/tools/analysis-frequency.c
 src/tools/analysis-histogram.c
 src/tools/analysis-kaplan-meier.c
 src/tools/analysis-normality.c
+src/tools/analysis-sign-test.c
 src/tools/analysis-tools.c
 src/tools/dao.c
 src/tools/data-shuffling.c
diff --git a/po-functions/POTFILES.skip b/po-functions/POTFILES.skip
index 51e21fc..8b1991c 100644
--- a/po-functions/POTFILES.skip
+++ b/po-functions/POTFILES.skip
@@ -128,6 +128,7 @@ src/dialogs/sheet-order.glade
 src/dialogs/sheet-resize.glade
 src/dialogs/shuffle.glade
 src/dialogs/simulation.glade
+src/dialogs/sign-test.glade
 src/dialogs/so-button.glade
 src/dialogs/so-checkbox.glade
 src/dialogs/so-frame.glade
diff --git a/po/ChangeLog b/po/ChangeLog
index 72c3864..5de3bb1 100644
--- a/po/ChangeLog
+++ b/po/ChangeLog
@@ -1,3 +1,8 @@
+2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* POTFILES.in: added src/dialogs/dialog-analysis-tool-sign-test.c,
+	  src/tools/analysis-sign-test.c and src/dialogs/sign-test.glade
+
 2009-11-29  Morten Welinder <terra gnome org>
 
 	* Release 1.9.16
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ba72dc0..1b116de 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -157,6 +157,7 @@ src/dialogs/dialog-analysis-tool-chi-squared.c
 src/dialogs/dialog-analysis-tool-frequency.c
 src/dialogs/dialog-analysis-tool-kaplan-meier.c
 src/dialogs/dialog-analysis-tool-normality.c
+src/dialogs/dialog-analysis-tool-sign-test.c
 src/dialogs/dialog-analysis-tools.c
 src/dialogs/dialog-autofilter.c
 src/dialogs/dialog-autoformat.c
@@ -252,6 +253,7 @@ src/dialogs/sheet-order.glade
 src/dialogs/sheet-resize.glade
 src/dialogs/shuffle.glade
 src/dialogs/simulation.glade
+src/dialogs/sign-test.glade
 src/dialogs/so-button.glade
 src/dialogs/so-checkbox.glade
 src/dialogs/so-frame.glade
@@ -327,6 +329,7 @@ src/tools/analysis-frequency.c
 src/tools/analysis-histogram.c
 src/tools/analysis-kaplan-meier.c
 src/tools/analysis-normality.c
+src/tools/analysis-sign-test.c
 src/tools/analysis-tools.c
 src/tools/dao.c
 src/tools/data-shuffling.c
diff --git a/src/GNOME_Gnumeric-gtk.xml.in b/src/GNOME_Gnumeric-gtk.xml.in
index 0365a3a..b6d11b7 100644
--- a/src/GNOME_Gnumeric-gtk.xml.in
+++ b/src/GNOME_Gnumeric-gtk.xml.in
@@ -186,6 +186,7 @@
         <menuitem action="ToolsRanking"/>
         <menuitem action="ToolsRegression"/>
         <menuitem action="ToolsSampling"/>
+        <menuitem action="ToolsOneMedianSignTest"/>
         <menu name="ToolTTest" action="MenuToolTTest">
           <menuitem action="ToolTTestPaired"/>
           <menuitem action="ToolTTestEqualVar"/>
diff --git a/src/HILDON_Gnumeric-gtk.xml.in b/src/HILDON_Gnumeric-gtk.xml.in
index 2206317..b7c9a17 100644
--- a/src/HILDON_Gnumeric-gtk.xml.in
+++ b/src/HILDON_Gnumeric-gtk.xml.in
@@ -192,7 +192,8 @@
         <menuitem action="ToolsRanking"/>
         <menuitem action="ToolsRegression"/>
         <menuitem action="ToolsSampling"/>
-        <menu name="ToolTTest" action="MenuToolTTest">
+	<menuitem action="ToolsOneMedianSignTest"/>
+         <menu name="ToolTTest" action="MenuToolTTest">
           <menuitem action="ToolTTestPaired"/>
           <menuitem action="ToolTTestEqualVar"/>
           <menuitem action="ToolTTestUnequalVar"/>
diff --git a/src/dialogs/ChangeLog b/src/dialogs/ChangeLog
index b454478..516c568 100644
--- a/src/dialogs/ChangeLog
+++ b/src/dialogs/ChangeLog
@@ -1,3 +1,11 @@
+2009-12-11  Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* dialog-analysis-tool-sign-test.c: new
+	* sign-test.glade: new
+	* Makefile.am: add the above
+	* dialogs.h (dialog_sign_test_tool): new
+	* help.h: add GNUMERIC_HELP_LINK_SIGN_TEST
+
 2009-12-10  Morten Welinder  <terra gnome org>
 
 	* dialog-goal-seek.c (dialog_init): Force sheets in cell
diff --git a/src/dialogs/Makefile.am b/src/dialogs/Makefile.am
index acff8d7..37f9df1 100644
--- a/src/dialogs/Makefile.am
+++ b/src/dialogs/Makefile.am
@@ -30,6 +30,7 @@ base_files =					\
 	dialog-analysis-tool-frequency.c	\
 	dialog-analysis-tool-kaplan-meier.c	\
 	dialog-analysis-tool-normality.c	\
+	dialog-analysis-tool-sign-test.c	\
 	dialog-autofilter.c			\
 	dialog-autoformat.c			\
 	dialog-autosave.c			\
@@ -136,6 +137,7 @@ glade_DATA = 				\
 	merge.glade			\
 	moving-averages.glade		\
 	normality-tests.glade		\
+	sign-test.glade		\
 	paste-names.glade		\
 	plugin-manager.glade		\
 	preferences.glade 		\
diff --git a/src/dialogs/dialog-analysis-tool-sign-test.c b/src/dialogs/dialog-analysis-tool-sign-test.c
new file mode 100644
index 0000000..87cde91
--- /dev/null
+++ b/src/dialogs/dialog-analysis-tool-sign-test.c
@@ -0,0 +1,239 @@
+/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * dialog-analysis-tool-sign-test.c:
+ *
+ * Authors:
+  *  Andreas J. Guelzow  <aguelzow taliesin ca>
+ *
+ * (C) Copyright 2009 by Andreas J. Guelzow  <aguelzow pyrshep ca>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <gnumeric-config.h>
+#include <glib/gi18n-lib.h>
+#include <gnumeric.h>
+#include "dialogs.h"
+#include "analysis-sign-test.h"
+#include "analysis-tools.h"
+
+#include <workbook.h>
+#include <workbook-control.h>
+#include <wbc-gtk.h>
+#include <workbook-view.h>
+#include <gui-util.h>
+#include <parse-util.h>
+#include <gnm-format.h>
+#include <tool-dialogs.h>
+#include <dao-gui-utils.h>
+#include <sheet.h>
+#include <expr.h>
+#include <number-match.h>
+#include <ranges.h>
+#include <selection.h>
+#include <value.h>
+#include <commands.h>
+#include "help.h"
+
+#include <widgets/gnm-dao.h>
+#include <widgets/gnumeric-expr-entry.h>
+
+#include <glade/glade.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#define SIGN_TEST_KEY      "analysistools-sign-test-dialog"
+
+static char const * const grouped_by_group[] = {
+	"grouped_by_row",
+	"grouped_by_col",
+	"grouped_by_area",
+	NULL
+};
+
+typedef struct {
+	GenericToolState base;
+	GtkWidget *alpha_entry;
+	GtkWidget *median_entry;
+} SignTestToolState;
+
+/**
+ * sign_test_tool_update_sensitivity_cb:
+ * @dummy:
+ * @state:
+ *
+ * Update the dialog widgets sensitivity
+ **/
+static void
+sign_test_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget *dummy,
+				      SignTestToolState *state)
+{
+	gnm_float alpha;
+	gnm_float median;
+        GSList *input_range;
+	gboolean err;
+
+        input_range = gnm_expr_entry_parse_as_list
+		(GNM_EXPR_ENTRY (state->base.input_entry),
+		 state->base.sheet);
+	if (input_range == NULL) {
+		gtk_label_set_text (GTK_LABEL (state->base.warning),
+				    _("The input range is invalid."));
+		gtk_widget_set_sensitive (state->base.ok_button, FALSE);
+		return;
+	} else
+		range_list_destroy (input_range);
+
+	/* Checking Median*/
+	err = entry_to_float
+		(GTK_ENTRY (state->median_entry), &median, FALSE);
+	if (err) {
+		gtk_label_set_text (GTK_LABEL (state->base.warning),
+				    _("The predicted median should be a number."));
+		gtk_widget_set_sensitive (state->base.ok_button, FALSE);
+		return;
+	}
+
+	/* Checking Alpha*/
+	alpha = gtk_spin_button_get_value
+		(GTK_SPIN_BUTTON (state->alpha_entry));
+	if (!(alpha > 0 && alpha < 1)) {
+		gtk_label_set_text (GTK_LABEL (state->base.warning),
+				    _("The alpha value should "
+				      "be a number between 0 and 1."));
+		gtk_widget_set_sensitive (state->base.ok_button, FALSE);
+		return;
+	}
+
+	/* Checking Output Page */
+	if (!gnm_dao_is_ready (GNM_DAO (state->base.gdao))) {
+		gtk_label_set_text (GTK_LABEL (state->base.warning),
+				    _("The output specification "
+				      "is invalid."));
+		gtk_widget_set_sensitive (state->base.ok_button, FALSE);
+		return;
+	}
+
+	gtk_label_set_text (GTK_LABEL (state->base.warning), "");
+	gtk_widget_set_sensitive (state->base.ok_button, TRUE);
+
+}
+
+
+/**
+ * sign_test_tool_ok_clicked_cb:
+ * @button:
+ * @state:
+ *
+ * Retrieve the information from the dialog and call the sign_test_tool.
+ * Note that we assume that the ok_button is only active if the entry fields
+ * contain sensible data.
+ **/
+static void
+sign_test_tool_ok_clicked_cb (G_GNUC_UNUSED GtkWidget *button,
+			      SignTestToolState *state)
+{
+	data_analysis_output_t  *dao;
+	GtkWidget *w;
+	analysis_tools_data_sign_test_t *data;
+	gboolean err;
+
+	data = g_new0 (analysis_tools_data_sign_test_t, 1);
+	dao  = parse_output ((GenericToolState *)state, NULL);
+
+	data->base.input = gnm_expr_entry_parse_as_list (
+		GNM_EXPR_ENTRY (state->base.input_entry), state->base.sheet);
+	data->base.group_by = gnumeric_glade_group_value (state->base.gui, grouped_by_group);
+
+	w = glade_xml_get_widget (state->base.gui, "labels_button");
+        data->base.labels = gtk_toggle_button_get_active 
+		(GTK_TOGGLE_BUTTON (w));
+	
+	data->median = 0.;
+	err = entry_to_float
+		(GTK_ENTRY (state->median_entry), &data->median, FALSE);
+
+	data->alpha = gtk_spin_button_get_value
+		(GTK_SPIN_BUTTON (state->alpha_entry));
+
+	if (!cmd_analysis_tool (WORKBOOK_CONTROL (state->base.wbcg), state->base.sheet,
+				dao, data, analysis_tool_sign_test_engine))
+		gtk_widget_destroy (state->base.dialog);
+
+	return;
+}
+
+/**
+ * dialog_sign_test_tool:
+ * @wbcg:
+ * @sheet:
+ *
+ * Show the dialog (guru).
+ *
+ **/
+int
+dialog_sign_test_tool (WBCGtk *wbcg, Sheet *sheet, G_GNUC_UNUSED int n_median)
+{
+        SignTestToolState *state;
+	char const * plugins[] = { "Gnumeric_fnstat",
+				   "Gnumeric_fnlogical",
+				   "Gnumeric_fnmath",
+				   NULL};
+
+	if ((wbcg == NULL) ||
+	    gnm_check_for_plugins_missing (plugins, wbcg_toplevel (wbcg)))
+		return 1;
+
+	/* Only pop up one copy per workbook */
+	if (gnumeric_dialog_raise_if_exists (wbcg, SIGN_TEST_KEY))
+		return 0;
+
+	state = g_new0 (SignTestToolState, 1);
+
+	if (dialog_tool_init (&state->base, wbcg, sheet,
+			      GNUMERIC_HELP_LINK_SIGN_TEST,
+			      "sign-test.glade", "Sign-Test",
+			      _("Could not create the Sign Test Tool dialog."),
+			      SIGN_TEST_KEY,
+			      G_CALLBACK (sign_test_tool_ok_clicked_cb), NULL,
+			      G_CALLBACK (sign_test_tool_update_sensitivity_cb),
+			      0))
+		return 0;
+
+
+	state->alpha_entry = glade_xml_get_widget (state->base.gui,
+						   "alpha-entry");
+	float_to_entry (GTK_ENTRY (state->alpha_entry), 0.05);
+	g_signal_connect_after (G_OBJECT (state->alpha_entry),
+		"changed",
+		G_CALLBACK (sign_test_tool_update_sensitivity_cb), state);
+	gnumeric_editable_enters (GTK_WINDOW (state->base.dialog),
+				  GTK_WIDGET (state->alpha_entry));
+
+	state->median_entry = glade_xml_get_widget (state->base.gui,
+						    "median-entry");
+	int_to_entry (GTK_ENTRY (state->median_entry), 0);
+	g_signal_connect_after (G_OBJECT (state->median_entry),
+		"changed",
+		G_CALLBACK (sign_test_tool_update_sensitivity_cb), state);
+	gnumeric_editable_enters (GTK_WINDOW (state->base.dialog),
+				  GTK_WIDGET (state->median_entry));
+
+	gnm_dao_set_put (GNM_DAO (state->base.gdao), TRUE, TRUE);
+	sign_test_tool_update_sensitivity_cb (NULL, state);
+	tool_load_selection ((GenericToolState *)state, TRUE);
+
+        return 0;
+}
diff --git a/src/dialogs/dialogs.h b/src/dialogs/dialogs.h
index 5fa9adf..f866596 100644
--- a/src/dialogs/dialogs.h
+++ b/src/dialogs/dialogs.h
@@ -93,6 +93,7 @@ int dialog_frequency_tool	 (WBCGtk *wbcg, Sheet *sheet);
 int dialog_kaplan_meier_tool	 (WBCGtk *wbcg, Sheet *sheet);
 int dialog_normality_tool	 (WBCGtk *wbcg, Sheet *sheet);
 int dialog_chi_square_tool       (WBCGtk *wbcg, Sheet *sheet, gboolean independence);
+int dialog_sign_test_tool        (WBCGtk *wbcg, Sheet *sheet, int n_medians);
 
 typedef enum {
 	TTEST_PAIRED = 1,
diff --git a/src/dialogs/help.h b/src/dialogs/help.h
index 856329b..f7005c8 100644
--- a/src/dialogs/help.h
+++ b/src/dialogs/help.h
@@ -158,6 +158,9 @@
 /* dialog-analysis-tool-normality.c */
 #define GNUMERIC_HELP_LINK_NORMALITY "sect-analysis-statistical"
 
+/* dialog-analysis-tool-sign-test.c */
+#define GNUMERIC_HELP_LINK_SIGN_TEST "sect-analysis-statistical"
+
 /* dialog-consolidate.c     */
 #define GNUMERIC_HELP_LINK_CONSOLIDATE ""
 
diff --git a/src/dialogs/sign-test.glade b/src/dialogs/sign-test.glade
new file mode 100644
index 0000000..917f766
--- /dev/null
+++ b/src/dialogs/sign-test.glade
@@ -0,0 +1,372 @@
+<?xml version="1.0"?>
+<glade-interface>
+  <!-- interface-requires gtk+ 2.6 -->
+  <!-- interface-naming-policy toplevel-contextual -->
+  <widget class="GtkDialog" id="Sign-Test">
+    <property name="border_width">5</property>
+    <property name="title" translatable="yes">Sign Test</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="vbox1">
+        <property name="visible">True</property>
+        <property name="spacing">2</property>
+        <child>
+          <widget class="GtkNotebook" id="notebook1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="border_width">5</property>
+            <child>
+              <widget class="GtkTable" id="input-table">
+                <property name="visible">True</property>
+                <property name="border_width">12</property>
+                <property name="n_rows">6</property>
+                <property name="n_columns">2</property>
+                <property name="column_spacing">12</property>
+                <property name="row_spacing">6</property>
+                <child>
+                  <widget class="GtkLabel" id="var1-label">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">_Input range:</property>
+                    <property name="use_underline">True</property>
+                    <property name="justify">right</property>
+                  </widget>
+                  <packing>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkCheckButton" id="labels_button">
+                    <property name="label" translatable="yes">_Labels</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="use_underline">True</property>
+                    <property name="draw_indicator">True</property>
+                  </widget>
+                  <packing>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_SHRINK | GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <widget class="GtkHBox" id="vbox2">
+                    <property name="visible">True</property>
+                    <property name="homogeneous">True</property>
+                    <child>
+                      <widget class="GtkRadioButton" id="grouped_by_col">
+                        <property name="label" translatable="yes">_Columns</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkRadioButton" id="grouped_by_row">
+                        <property name="label" translatable="yes">_Rows</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">grouped_by_col</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkRadioButton" id="grouped_by_area">
+                        <property name="label" translatable="yes">_Areas</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="receives_default">False</property>
+                        <property name="use_underline">True</property>
+                        <property name="draw_indicator">True</property>
+                        <property name="group">grouped_by_col</property>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">False</property>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label2">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="xpad">5</property>
+                    <property name="label" translatable="yes">Grouped by:</property>
+                    <property name="justify">center</property>
+                  </widget>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label5">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Input</property>
+              </widget>
+              <packing>
+                <property name="tab_fill">False</property>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="vbox3">
+                <property name="visible">True</property>
+                <child>
+                  <widget class="GtkTable" id="table2">
+                    <property name="visible">True</property>
+                    <property name="border_width">12</property>
+                    <property name="n_rows">4</property>
+                    <property name="n_columns">2</property>
+                    <property name="column_spacing">12</property>
+                    <property name="row_spacing">6</property>
+                    <child>
+                      <widget class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">_Alpha:</property>
+                        <property name="use_underline">True</property>
+                        <property name="justify">right</property>
+                        <property name="mnemonic_widget">alpha-entry</property>
+                      </widget>
+                      <packing>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkSpinButton" id="alpha-entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="adjustment">0.050000000000000003 0 1 0.01 10 0</property>
+                        <property name="climb_rate">0.01</property>
+                        <property name="digits">2</property>
+                        <property name="numeric">True</property>
+                        <property name="update_policy">if-valid</property>
+                      </widget>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkLabel" id="median-entry-label">
+                        <property name="visible">True</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">_Predicted Median:</property>
+                        <property name="use_underline">True</property>
+                      </widget>
+                      <packing>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkEntry" id="median-entry">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="invisible_char">&#x2022;</property>
+                        <property name="text">0</property>
+                        <property name="caps_lock_warning">False</property>
+                      </widget>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="right_attach">2</property>
+                        <property name="x_options">GTK_FILL</property>
+                        <property name="y_options"></property>
+                      </packing>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                    <child>
+                      <placeholder/>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label6">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Test</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+                <property name="tab_fill">False</property>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkHBox" id="dao">
+                <property name="visible">True</property>
+                <child>
+                  <placeholder/>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="label7">
+                <property name="visible">True</property>
+                <property name="label" translatable="yes">Output</property>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+                <property name="tab_fill">False</property>
+                <property name="type">tab</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="GtkLabel" id="warnings">
+            <property name="visible">True</property>
+            <property name="use_markup">True</property>
+            <property name="wrap">True</property>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="hbuttonbox1">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <widget class="GtkButton" id="helpbutton">
+                <property name="label">gtk-help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_stock">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkButton" id="cancelbutton">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_stock">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkButton" id="okbutton">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_stock">True</property>
+              </widget>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>
diff --git a/src/tools/ChangeLog b/src/tools/ChangeLog
index 250ed1d..204e707 100644
--- a/src/tools/ChangeLog
+++ b/src/tools/ChangeLog
@@ -1,3 +1,9 @@
+2009-12-11 Andreas J. Guelzow <aguelzow pyrshep ca>
+
+	* analysis-sign-test.c: new
+	* analysis-sign-test.h: new
+	* Makefile.am: add the above
+
 2009-11-29  Morten Welinder <terra gnome org>
 
 	* Release 1.9.16
diff --git a/src/tools/Makefile.am b/src/tools/Makefile.am
index 663a2af..0d42936 100644
--- a/src/tools/Makefile.am
+++ b/src/tools/Makefile.am
@@ -29,6 +29,8 @@ libtools_la_SOURCES =					\
 	analysis-kaplan-meier.h				\
 	analysis-normality.c				\
 	analysis-normality.h				\
+	analysis-sign-test.c				\
+	analysis-sign-test.h				\
 	analysis-tools.c				\
 	analysis-tools.h				\
 	random-generator.c				\
diff --git a/src/tools/analysis-sign-test.c b/src/tools/analysis-sign-test.c
new file mode 100644
index 0000000..a3ff752
--- /dev/null
+++ b/src/tools/analysis-sign-test.c
@@ -0,0 +1,189 @@
+/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * analysis-sign-test.c:
+ *
+ * Author:
+ *   Andreas J. Guelzow  <aguelzow pyrshep ca>
+ *
+ * (C) Copyright 2009 by Andreas J. Guelzow  <aguelzow pyrshep ca>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <gnumeric-config.h>
+#include <glib/gi18n-lib.h>
+#include "gnumeric.h"
+#include "analysis-sign-test.h"
+#include "analysis-tools.h"
+#include "value.h"
+#include "ranges.h"
+#include "expr.h"
+#include "func.h"
+#include "numbers.h"
+
+static gboolean
+analysis_tool_sign_test_engine_run (data_analysis_output_t *dao,
+				      analysis_tools_data_sign_test_t *info)
+{
+	guint     col;
+	GSList *data = info->base.input;
+	gboolean first = TRUE;
+
+	GnmExpr const *expr;
+	GnmExpr const *expr_neg;
+	GnmExpr const *expr_pos;
+
+	GnmFunc *fd_median;
+	GnmFunc *fd_if;
+	GnmFunc *fd_sum;
+	GnmFunc *fd_min;
+	GnmFunc *fd_binomdist;
+
+	fd_median = gnm_func_lookup_or_add_placeholder ("MEDIAN", dao->sheet ? dao->sheet->workbook : NULL, FALSE);
+	gnm_func_ref (fd_median);
+	fd_if = gnm_func_lookup_or_add_placeholder ("IF", dao->sheet ? dao->sheet->workbook : NULL, FALSE);
+	gnm_func_ref (fd_if);
+	fd_sum = gnm_func_lookup_or_add_placeholder ("SUM", dao->sheet ? dao->sheet->workbook : NULL, FALSE);
+	gnm_func_ref (fd_sum);
+	fd_min = gnm_func_lookup_or_add_placeholder ("MIN", dao->sheet ? dao->sheet->workbook : NULL, FALSE);
+	gnm_func_ref (fd_min);
+	fd_binomdist = gnm_func_lookup_or_add_placeholder ("BINOMDIST", dao->sheet ? dao->sheet->workbook : NULL, FALSE);
+	gnm_func_ref (fd_binomdist);
+
+	dao_set_italic (dao, 0, 0, 0, 9);
+	set_cell_text_col (dao, 0, 0, _("/Sign Test"
+					"/Median:"
+					"/Predicted Median:"
+					"/Test Statistic:"
+					"/N:"
+					"/\xce\xb1:"
+					"/P(T\xe2\x89\xa4t) one-tailed:"
+					"/P(T\xe2\x89\xa4t) two-tailed:"));
+
+	for (col = 0; data != NULL; data = data->next, col++) {
+		GnmValue *val_org = value_dup (data->data);
+
+		/* Note that analysis_tools_write_label may modify val_org */
+		dao_set_italic (dao, col + 1, 0, col+1, 0);
+		analysis_tools_write_label (val_org, dao, &info->base, col + 1, 0, col + 1);
+
+		if (first) {
+			dao_set_cell_float (dao, col + 1, 2, info->median);
+			dao_set_cell_float (dao, col + 1, 5, info->alpha);
+			first = FALSE;
+		} else {
+			dao_set_cell_expr (dao, col + 1, 2, make_cellref (-1,0));
+			dao_set_cell_expr (dao, col + 1, 5, make_cellref (-1,0));
+		}
+
+		expr = gnm_expr_new_funcall1
+			(fd_median,
+			 gnm_expr_new_constant (value_dup (val_org)));
+		dao_set_cell_expr (dao, col + 1, 1, expr);
+
+		expr_neg = gnm_expr_new_funcall1
+			(fd_sum,
+			 gnm_expr_new_funcall3
+			 (fd_if, gnm_expr_new_binary (gnm_expr_new_constant (value_dup (val_org)), 
+						      GNM_EXPR_OP_LT, make_cellref (0,-1)), 
+			  gnm_expr_new_constant (value_new_int (1)), 
+			  gnm_expr_new_constant (value_new_int (0))));
+		expr_pos = gnm_expr_new_funcall1
+			(fd_sum,
+			 gnm_expr_new_funcall3
+			 (fd_if, gnm_expr_new_binary (gnm_expr_new_constant (value_dup (val_org)), 
+						      GNM_EXPR_OP_GT, make_cellref (0,-1)), 
+			  gnm_expr_new_constant (value_new_int (1)), 
+			  gnm_expr_new_constant (value_new_int (0))));
+		expr = gnm_expr_new_funcall2
+			(fd_min, expr_neg, expr_pos);
+		dao_set_cell_array_expr (dao, col + 1, 3, expr);
+		
+		expr_neg = gnm_expr_new_funcall1
+			(fd_sum,
+			 gnm_expr_new_funcall3
+			 (fd_if, gnm_expr_new_binary (gnm_expr_new_constant (value_dup (val_org)), 
+						      GNM_EXPR_OP_LT, make_cellref (0,-2)), 
+			  gnm_expr_new_constant (value_new_int (1)), 
+			  gnm_expr_new_constant (value_new_int (0))));
+		expr_pos = gnm_expr_new_funcall1
+			(fd_sum,
+			 gnm_expr_new_funcall3
+			 (fd_if, gnm_expr_new_binary (gnm_expr_new_constant (val_org), 
+						      GNM_EXPR_OP_GT, make_cellref (0,-2)), 
+			  gnm_expr_new_constant (value_new_int (1)), 
+			  gnm_expr_new_constant (value_new_int (0))));
+		expr = gnm_expr_new_funcall2
+			(fd_sum, expr_neg, expr_pos);
+		dao_set_cell_array_expr (dao, col + 1, 4, expr);
+
+		expr = gnm_expr_new_funcall4 (fd_binomdist, make_cellref (0,-3), make_cellref (0,-2), 
+					      gnm_expr_new_constant (value_new_float (0.5)), 
+					      gnm_expr_new_constant (value_new_bool (TRUE)));
+		dao_set_cell_array_expr (dao, col + 1, 6, expr);
+
+		expr = gnm_expr_new_binary (gnm_expr_new_constant (value_new_int (2)), 
+					    GNM_EXPR_OP_MULT, make_cellref (0,-1));
+		dao_set_cell_array_expr (dao, col + 1, 7, expr);
+		
+	}
+
+	gnm_func_unref (fd_median);
+	gnm_func_unref (fd_if);
+	gnm_func_unref (fd_min);
+	gnm_func_unref (fd_sum);
+	gnm_func_unref (fd_binomdist);
+
+	dao_redraw_respan (dao);
+
+	return FALSE;
+}
+
+
+gboolean
+analysis_tool_sign_test_engine (data_analysis_output_t *dao, gpointer specs,
+			      analysis_tool_engine_t selector, gpointer result)
+{
+	analysis_tools_data_sign_test_t *info = specs;
+
+	switch (selector) {
+	case TOOL_ENGINE_UPDATE_DESCRIPTOR:
+		return (dao_command_descriptor
+			(dao, _("Sign Test (%s)"), result)
+			== NULL);
+	case TOOL_ENGINE_UPDATE_DAO:
+		prepare_input_range (&info->base.input, info->base.group_by);
+		dao_adjust (dao, 1 + g_slist_length (info->base.input), 8);
+		return FALSE;
+	case TOOL_ENGINE_CLEAN_UP:
+		return analysis_tool_generic_clean (specs);
+	case TOOL_ENGINE_LAST_VALIDITY_CHECK:
+		return FALSE;
+	case TOOL_ENGINE_PREPARE_OUTPUT_RANGE:
+		dao_prepare_output (NULL, dao, _("Sign Test"));
+		return FALSE;
+	case TOOL_ENGINE_FORMAT_OUTPUT_RANGE:
+		return dao_format_output (dao, _("Sign Test"));
+	case TOOL_ENGINE_PERFORM_CALC:
+	default:
+		return analysis_tool_sign_test_engine_run (dao, specs);
+	}
+	return TRUE;
+}
+
+
+
+
diff --git a/src/tools/analysis-sign-test.h b/src/tools/analysis-sign-test.h
new file mode 100644
index 0000000..e93ace0
--- /dev/null
+++ b/src/tools/analysis-sign-test.h
@@ -0,0 +1,47 @@
+/* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * analysis-sign-test.h:
+ *
+ * Author:
+ *   Andreas J. Guelzow  <aguelzow pyrshep ca>
+ *
+ * (C) Copyright 2009 by Andreas J. Guelzow  <aguelzow pyrshep ca>
+ *
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef ANALYSIS_SIGN_TEST_H
+#define ANALYSIS_SIGN_TEST_H
+
+#include "gnumeric.h"
+#include "numbers.h"
+#include "dao.h"
+#include "tools.h"
+#include "analysis-tools.h"
+#include "sheet.h"
+
+typedef struct {
+	analysis_tools_data_generic_t base;
+	gnm_float        median;
+	gnm_float        alpha;
+} analysis_tools_data_sign_test_t;
+
+gboolean analysis_tool_sign_test_engine (data_analysis_output_t *dao, gpointer specs,
+					   analysis_tool_engine_t selector, gpointer result);
+
+
+#endif
diff --git a/src/wbc-gtk-actions.c b/src/wbc-gtk-actions.c
index 5f70238..42d02b1 100644
--- a/src/wbc-gtk-actions.c
+++ b/src/wbc-gtk-actions.c
@@ -883,6 +883,7 @@ static GNM_ACTION_DEF (cb_tools_normality_tests){ dialog_normality_tool (wbcg, w
 static GNM_ACTION_DEF (cb_tools_ranking)	{ dialog_ranking_tool (wbcg, wbcg_cur_sheet (wbcg)); }
 static GNM_ACTION_DEF (cb_tools_regression)	{ dialog_regression_tool (wbcg, wbcg_cur_sheet (wbcg)); }
 static GNM_ACTION_DEF (cb_tools_sampling)	{ dialog_sampling_tool (wbcg, wbcg_cur_sheet (wbcg)); }
+static GNM_ACTION_DEF (cb_tools_sign_test_one_mean)	{ dialog_sign_test_tool (wbcg, wbcg_cur_sheet (wbcg), 1); }
 static GNM_ACTION_DEF (cb_tools_ttest_paired)	{ dialog_ttest_tool (wbcg, wbcg_cur_sheet (wbcg), TTEST_PAIRED); }
 static GNM_ACTION_DEF (cb_tools_ttest_equal_var) { dialog_ttest_tool (wbcg, wbcg_cur_sheet (wbcg), TTEST_UNPAIRED_EQUALVARIANCES); }
 static GNM_ACTION_DEF (cb_tools_ttest_unequal_var) { dialog_ttest_tool (wbcg, wbcg_cur_sheet (wbcg), TTEST_UNPAIRED_UNEQUALVARIANCES); }
@@ -2140,6 +2141,9 @@ static GtkActionEntry const actions[] = {
 	{ "ToolsNormalityTests", NULL, N_("_Normality Tests..."),
 		NULL, N_("Testing a sample for normality"),
 		G_CALLBACK (cb_tools_normality_tests) },
+	{ "ToolsOneMedianSignTest", NULL, N_("One M_edian Sign Test..."),
+		NULL, N_("Testing the value of a median"),
+		G_CALLBACK (cb_tools_sign_test_one_mean) },
 
 /* Data */
 	{ "DataSort", GTK_STOCK_SORT_ASCENDING, N_("_Sort..."),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]