gnumeric r16826 - in trunk: . src/dialogs src/tools
- From: guelzow svn gnome org
- To: svn-commits-list gnome org
- Subject: gnumeric r16826 - in trunk: . src/dialogs src/tools
- Date: Thu, 25 Sep 2008 16:04:22 +0000 (UTC)
Author: guelzow
Date: Thu Sep 25 16:04:22 2008
New Revision: 16826
URL: http://svn.gnome.org/viewvc/gnumeric?rev=16826&view=rev
Log:
2008-09-25 Andreas J. Guelzow <aguelzow pyrshep ca>
* analysis-tools.h (analysis_tools_data_exponential_smoothing_t):
add fields
(analysis_tool_exponential_smoothing_engine_run): rewrite completely
(analysis_tool_exponential_smoothing_engine): add two rows
2008-09-25 Andreas J. Guelzow <aguelzow pyrshep ca>
* exp-smoothing.glade: add controls and reformat
* dialog-analysis-tools.c (ExpSmoothToolState): add fields
(exp_smoothing_tool_ok_clicked_cb): handle new fields
(exp_smoothing_tool_update_sensitivity_cb): use warning
field in the dialog
(exp_smoothing_tool_check_error_cb): new
(dialog_exp_smoothing_tool): setup new controls
Modified:
trunk/NEWS
trunk/src/dialogs/ChangeLog
trunk/src/dialogs/dialog-analysis-tools.c
trunk/src/dialogs/exp-smoothing.glade
trunk/src/tools/ChangeLog
trunk/src/tools/analysis-tools.c
trunk/src/tools/analysis-tools.h
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Thu Sep 25 16:04:22 2008
@@ -18,6 +18,7 @@
* Improve moving averages tool. [#527489]
* Add weighted and cumulative moving averages.
* Add Spencer's 15-point moving average.
+ * Fix and improve exponential smoothing tool. [#553267]
Jean:
* Fix printing of rotated text. [#539734]
Modified: trunk/src/dialogs/dialog-analysis-tools.c
==============================================================================
--- trunk/src/dialogs/dialog-analysis-tools.c (original)
+++ trunk/src/dialogs/dialog-analysis-tools.c Thu Sep 25 16:04:22 2008
@@ -205,6 +205,11 @@
typedef struct {
GenericToolState base;
GtkWidget *damping_fact_entry;
+ GtkWidget *show_std_errors;
+ GtkWidget *n_button;
+ GtkWidget *nm1_button;
+ GtkWidget *nm2_button;
+ GtkWidget *graph_button;
} ExpSmoothToolState;
typedef struct {
@@ -2301,8 +2306,9 @@
err = entry_to_float (GTK_ENTRY (state->damping_fact_entry), &data->damp_fact, TRUE);
- w = glade_xml_get_widget (state->base.gui, "std_errors_button");
- data->std_error_flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (w));
+ data->std_error_flag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state->show_std_errors));
+ data->show_graph = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (state->graph_button));
+ data->df = gnumeric_glade_group_value (state->base.gui, n_group);
if (!cmd_analysis_tool (WORKBOOK_CONTROL (state->base.wbcg), state->base.sheet,
dao, data, analysis_tool_exponential_smoothing_engine))
@@ -2324,22 +2330,44 @@
exp_smoothing_tool_update_sensitivity_cb (G_GNUC_UNUSED GtkWidget *dummy,
ExpSmoothToolState *state)
{
- gboolean ready = FALSE;
int err;
gnm_float damp_fact;
GSList *input_range;
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);
+
err = entry_to_float (GTK_ENTRY (state->damping_fact_entry), &damp_fact, FALSE);
+ if (err!= 0 || damp_fact < 0 || damp_fact > 1) {
+ gtk_label_set_text (GTK_LABEL (state->base.warning),
+ _("The given damping factor is invalid."));
+ gtk_widget_set_sensitive (state->base.ok_button, FALSE);
+ return;
+ }
- ready = ((input_range != NULL) &&
- (err == 0 && damp_fact >= 0 && damp_fact <= 1) &&
- gnm_dao_is_ready (GNM_DAO (state->base.gdao)));
+ 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;
+ }
- if (input_range != NULL) range_list_destroy (input_range);
+ gtk_label_set_text (GTK_LABEL (state->base.warning), "");
+ gtk_widget_set_sensitive (state->base.ok_button, TRUE);
+}
- gtk_widget_set_sensitive (state->base.ok_button, ready);
+static void
+exp_smoothing_tool_check_error_cb (G_GNUC_UNUSED GtkToggleButton *togglebutton, gpointer user_data)
+{
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (user_data), TRUE);
}
@@ -2380,15 +2408,32 @@
return 0;
state->damping_fact_entry = glade_xml_get_widget (state->base.gui,
- "damping-fact-entry");
+ "damping-fact-spin");
float_to_entry (GTK_ENTRY (state->damping_fact_entry), 0.2);
+
+ state->n_button = glade_xml_get_widget (state->base.gui, "n-button");
+ state->nm1_button = glade_xml_get_widget (state->base.gui, "nm1-button");
+ state->nm2_button = glade_xml_get_widget (state->base.gui, "nm2-button");
+
+ state->show_std_errors = glade_xml_get_widget (state->base.gui, "std-errors-button");
+ state->graph_button = glade_xml_get_widget (state->base.gui, "graph-check");
+
+ g_signal_connect_after (G_OBJECT (state->n_button),
+ "toggled",
+ G_CALLBACK (exp_smoothing_tool_check_error_cb), state->show_std_errors);
+ g_signal_connect_after (G_OBJECT (state->nm1_button),
+ "toggled",
+ G_CALLBACK (exp_smoothing_tool_check_error_cb), state->show_std_errors);
+ g_signal_connect_after (G_OBJECT (state->nm2_button),
+ "toggled",
+ G_CALLBACK (exp_smoothing_tool_check_error_cb), state->show_std_errors);
g_signal_connect_after (G_OBJECT (state->damping_fact_entry),
"changed",
G_CALLBACK (exp_smoothing_tool_update_sensitivity_cb), state);
gnumeric_editable_enters (GTK_WINDOW (state->base.dialog),
GTK_WIDGET (state->damping_fact_entry));
- gnm_dao_set_put (GNM_DAO (state->base.gdao), FALSE, FALSE);
+ gnm_dao_set_put (GNM_DAO (state->base.gdao), TRUE, TRUE);
exp_smoothing_tool_update_sensitivity_cb (NULL, state);
tool_load_selection ((GenericToolState *)state, TRUE);
@@ -2663,7 +2708,6 @@
return 1;
}
-
/* Only pop up one copy per workbook */
if (gnumeric_dialog_raise_if_exists (wbcg, AVERAGE_KEY))
return 0;
Modified: trunk/src/dialogs/exp-smoothing.glade
==============================================================================
--- trunk/src/dialogs/exp-smoothing.glade (original)
+++ trunk/src/dialogs/exp-smoothing.glade Thu Sep 25 16:04:22 2008
@@ -1,377 +1,486 @@
-<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
-
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--*- mode: xml -*-->
<glade-interface>
-
-<widget class="GtkDialog" id="ExpSmoothing">
- <property name="border_width">5</property>
- <property name="title" translatable="yes">Exponential Smoothing</property>
- <property name="type">GTK_WINDOW_TOPLEVEL</property>
- <property name="window_position">GTK_WIN_POS_NONE</property>
- <property name="modal">False</property>
- <property name="resizable">True</property>
- <property name="destroy_with_parent">False</property>
- <property name="has_separator">False</property>
-
- <child internal-child="vbox">
- <widget class="GtkVBox" id="vbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">2</property>
-
- <child internal-child="action_area">
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
-
- <child>
- <widget class="GtkButton" id="helpbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-help</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="cancelbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-cancel</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="okbutton">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-ok</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="response_id">0</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack_type">GTK_PACK_END</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkNotebook" id="notebook1">
- <property name="border_width">5</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="show_tabs">True</property>
- <property name="show_border">True</property>
- <property name="tab_pos">GTK_POS_TOP</property>
- <property name="scrollable">False</property>
- <property name="enable_popup">False</property>
-
- <child>
- <widget class="GtkTable" id="input-table">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">4</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="var1-label">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Input range:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label1">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Grouped by:</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_CENTER</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="grouped_by_col">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Columns</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">True</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</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="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkRadioButton" id="grouped_by_row">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Rows</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <property name="group">grouped_by_col</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="labels_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Labels</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Input</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkTable" id="table1">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="n_rows">2</property>
- <property name="n_columns">2</property>
- <property name="homogeneous">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
-
- <child>
- <widget class="GtkLabel" id="label3">
- <property name="visible">True</property>
- <property name="label" translatable="yes">_Damping factor:</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_RIGHT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="mnemonic_widget">damping-fact-entry</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">1</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkEntry" id="damping-fact-entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="editable">True</property>
- <property name="visibility">True</property>
- <property name="max_length">0</property>
- <property name="text" translatable="yes">0.2</property>
- <property name="has_frame">True</property>
- <property name="invisible_char" translatable="yes">*</property>
- <property name="activates_default">False</property>
- </widget>
- <packing>
- <property name="left_attach">1</property>
- <property name="right_attach">2</property>
- <property name="top_attach">0</property>
- <property name="bottom_attach">1</property>
- <property name="y_options"></property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkCheckButton" id="std_errors_button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">_Standard errors</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- </widget>
- <packing>
- <property name="left_attach">0</property>
- <property name="right_attach">2</property>
- <property name="top_attach">1</property>
- <property name="bottom_attach">2</property>
- <property name="x_options">fill</property>
- <property name="y_options"></property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Options</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHBox" id="dao">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label5">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Output</property>
- <property name="use_underline">True</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
-</widget>
-
+ <widget class="GtkDialog" id="ExpSmoothing">
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">Exponential Smoothing</property>
+ <property name="type_hint">GDK_WINDOW_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="GtkVBox" id="vbox2">
+ <property name="visible">True</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="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkTable" id="input-table">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="labels_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Labels</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Grouped by:</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="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>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkRadioButton" id="grouped_by_col">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">C_olumns</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="grouped_by_row">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Rows</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">grouped_by_col</property>
+ </widget>
+ <packing>
+ <property name="position">1</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="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkTable" id="table4">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="n_rows">4</property>
+ <property name="n_columns">1</property>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="wma-button">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Double exponential smoothing</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">ses-h-button</property>
+ </widget>
+ <packing>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="ses-r-button">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Simple exponential smoothing (Roberts, 1959)</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">ses-h-button</property>
+ </widget>
+ <packing>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="ses-h-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Simple exponential smoothing (Hunter, 1986)</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Input</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkVBox" id="vbox4">
+ <property name="visible">True</property>
+ <child>
+ <widget class="GtkTable" id="table3">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="n_rows">1</property>
+ <property name="n_columns">2</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <widget class="GtkSpinButton" id="damping-fact-spin">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="xalign">1</property>
+ <property name="adjustment">0.20000000000000001 0 1 0.01 0.10000000000000001 0.10000000000000001</property>
+ <property name="digits">3</property>
+ <property name="numeric">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Damping Factor:</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator3">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">4</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <widget class="GtkRadioButton" id="nm2-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">nâ2</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">n-button</property>
+ </widget>
+ <packing>
+ <property name="left_attach">3</property>
+ <property name="right_attach">4</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="nm1-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">nâ1</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ <property name="group">n-button</property>
+ </widget>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="right_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkRadioButton" id="n-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">n</property>
+ <property name="response_id">0</property>
+ <property name="active">True</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Denominator:</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"></property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkCheckButton" id="std-errors-button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">_Standard errors</property>
+ <property name="use_underline">True</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="right_attach">4</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <widget class="GtkTable" id="table5">
+ <property name="visible">True</property>
+ <property name="border_width">12</property>
+ <property name="n_rows">1</property>
+ <property name="n_columns">1</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <widget class="GtkCheckButton" id="graph-check">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Include chart</property>
+ <property name="response_id">0</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">6</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Options</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">1</property>
+ <property name="tab_fill">False</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="label5">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Output</property>
+ <property name="use_underline">True</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ <property name="position">2</property>
+ <property name="tab_fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="warnings">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <child>
+ <widget class="GtkButton" id="helpbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="label">gtk-help</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkButton" id="cancelbutton">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="okbutton">
+ <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="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="response_id">0</property>
+ </widget>
+ <packing>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
</glade-interface>
Modified: trunk/src/tools/analysis-tools.c
==============================================================================
--- trunk/src/tools/analysis-tools.c (original)
+++ trunk/src/tools/analysis-tools.c Thu Sep 25 16:04:22 2008
@@ -3811,92 +3811,205 @@
*
* F(t+1) = F(t) + (1 - damp_fact) * ( A(t) - F(t) )
*
- * The results are given in a table which can be printed out in
- * a new sheet, in a new workbook, or simply into an existing sheet.
- *
- * The stanard errors are calculated using the following formula:
- *
- * ((A(t-3)-F(t-3))^2 + (A(t-2)-F(t-2))^2 + (A(t-1)-F(t-1))^2))
- * e(t) = SQRT (----------------------------------------------------------)
- * ( 3 )
- *
*/
static gboolean
analysis_tool_exponential_smoothing_engine_run (data_analysis_output_t *dao,
analysis_tools_data_exponential_smoothing_t *info)
{
- GPtrArray *data;
- guint dataset;
-
- /* TODO: Standard error output */
-
- data = new_data_set_list (info->base.input, info->base.group_by,
- TRUE, info->base.labels, dao->sheet);
+ GSList *l;
+ gint col = 0;
+ gint source;
+ SheetObject *so = NULL;
+ GogPlot *plot = NULL;
+ GnmFunc *fd_index;
+ GnmFunc *fd_offset;
+ GnmFunc *fd_sqrt = NULL;
+ GnmFunc *fd_sumxmy2 = NULL;
+ GnmExpr const *expr_alpha;
+
+ if (info->std_error_flag) {
+ fd_sqrt = gnm_func_lookup ("SQRT", NULL);
+ gnm_func_ref (fd_sqrt);
+ fd_sumxmy2 = gnm_func_lookup ("SUMXMY2", NULL);
+ gnm_func_ref (fd_sumxmy2);
+ }
+ fd_index = gnm_func_lookup ("INDEX", NULL);
+ gnm_func_ref (fd_index);
+ fd_offset = gnm_func_lookup ("OFFSET", NULL);
+ gnm_func_ref (fd_offset);
+
+ if (info->show_graph) {
+ GogGraph *graph;
+ GogChart *chart;
+
+ graph = g_object_new (GOG_GRAPH_TYPE, NULL);
+ chart = GOG_CHART (gog_object_add_by_name (GOG_OBJECT (graph), "Chart", NULL));
+ plot = gog_plot_new_by_name ("GogLinePlot");
+ gog_object_add_by_name (GOG_OBJECT (chart), "Plot", GOG_OBJECT (plot));
+ so = sheet_object_graph_new (graph);
+ g_object_unref (graph);
+ }
+
+
+ dao_set_italic (dao, 0, 0, 0, 0);
+ dao_set_cell (dao, 0, 0, _("Exponential Smoothing"));
+ dao_set_format (dao, 0, 1, 0, 1, _("\"\xce\xb1 =\" * 0.000"));
+ dao_set_cell_expr (dao, 0, 1, gnm_expr_new_constant (value_new_float (info->damp_fact)));
+ expr_alpha = dao_get_cellref (dao, 0, 1);
+ dao->offset_row = 2;
+
+ for (l = info->base.input, source = 1; l; l = l->next, col++, source++) {
+ GnmValue *val = value_dup ((GnmValue *)l->data);
+ GnmValue *val_c = NULL;
+ GnmExpr const *expr_title = NULL;
+ GnmExpr const *expr_input = NULL;
+ char const *format = NULL;
+ gint height;
+ gint x = 1;
+ gint y = 1;
+ gint *mover;
+ guint delta_x = 1;
+ guint delta_y = 1;
+ gint row, base;
+ Sheet *sheet;
+
+ if (info->base.labels) {
+ val_c = value_dup (val);
+ switch (info->base.group_by) {
+ case GROUPED_BY_ROW:
+ val->v_range.cell.a.col++;
+ break;
+ default:
+ val->v_range.cell.a.row++;
+ break;
+ }
+ expr_title = gnm_expr_new_funcall1 (fd_index,
+ gnm_expr_new_constant (val_c));
- for (dataset = 0; dataset < data->len; dataset++) {
- data_set_t *current;
- gnm_float a, f, F[2] = { 0, 0 }, A[2] = { 0, 0 };
- guint row;
+ dao_set_italic (dao, col, 0, col, 0);
+ dao_set_cell_expr (dao, col, 0, expr_title);
+ } else {
+ switch (info->base.group_by) {
+ case GROUPED_BY_ROW:
+ format = _("Row %d");
+ break;
+ default:
+ format = _("Column %d");
+ break;
+ }
+ dao_set_cell_printf (dao, col, 0, format, source);
+ }
+
+ switch (info->base.group_by) {
+ case GROUPED_BY_ROW:
+ height = value_area_get_width (val, NULL);
+ mover = &x;
+ break;
+ default:
+ height = value_area_get_height (val, NULL);
+ mover = &y;
+ break;
+ }
+
+ sheet = val->v_range.cell.a.sheet;
+ expr_input = gnm_expr_new_constant (val);
+
+ if (plot != NULL) {
+ GogSeries *series;
+
+ series = gog_plot_new_series (plot);
+ gog_series_set_dim (series, 1,
+ gnm_go_data_vector_new_expr (sheet,
+ gnm_expr_top_new (gnm_expr_copy (expr_input))),
+ NULL);
+
+ series = gog_plot_new_series (plot);
+ gog_series_set_dim (series, 1,
+ dao_go_data_vector (dao, col, 1, col, height),
+ NULL);
+ }
+
+ { /* F(t+1) = F(t) + (1 - damp_fact) * ( A(t) - F(t) ) */
+
+ dao_set_cell_expr (dao, col, 1,
+ gnm_expr_new_funcall1 (fd_index,
+ gnm_expr_copy (expr_input)));
+ (*mover) = 1;
+ for (row = 2; row <= height; row++, (*mover)++) {
+ GnmExpr const *A;
+ GnmExpr const *F;
+
+ A = gnm_expr_new_binary (gnm_expr_new_binary (gnm_expr_new_constant
+ (value_new_int (1)),
+ GNM_EXPR_OP_SUB,
+ gnm_expr_copy (expr_alpha)),
+ GNM_EXPR_OP_MULT,
+ gnm_expr_new_funcall3
+ (fd_index,
+ gnm_expr_copy (expr_input),
+ gnm_expr_new_constant(value_new_int(y)),
+ gnm_expr_new_constant(value_new_int(x))));
+ F = gnm_expr_new_binary (gnm_expr_copy (expr_alpha),
+ GNM_EXPR_OP_MULT,
+ make_cellref (0, -1));
+ dao_set_cell_expr (dao, col, row, gnm_expr_new_binary (A, GNM_EXPR_OP_ADD, F));
+ }
+ base = 1;
- current = g_ptr_array_index (data, dataset);
- dao_set_cell_printf (dao, dataset, 0, current->label);
- a = f = 0;
- for (row = 0; row < current->data->len; row++) {
- if (row == 0) {
- /* Cannot forecast for the first data element.
- */
-
- dao_set_cell_na (dao, dataset, row + 1);
- if (info->std_error_flag)
- dao_set_cell_na (dao, dataset + 1,
- row + 1);
- } else if (row == 1) {
- /* The second forecast is always the first
- * data element. */
- dao_set_cell_float (dao, dataset, row + 1, a);
- f = a;
- if (info->std_error_flag)
- dao_set_cell_na (dao, dataset + 1,
- row + 1);
- } else {
- if (info->std_error_flag) {
- gnm_float m1 = a - f;
- gnm_float m2 = A[0] - F[0];
- gnm_float m3 = A[1] - F[1];
-
- if (row < 4)
- dao_set_cell_na (dao,
- dataset + 1,
- row + 1);
- else
- dao_set_cell_float
- (dao, dataset + 1,
- row + 1,
- sqrt ((m1*m1 + m2*m2 +
- m3*m3) / 3));
- A[1] = A[0];
- A[0] = a;
- F[1] = F[0];
- F[0] = f;
- }
+ }
- /*
- * F(t+1) = F(t) + (1 - damp_fact) *
- * ( A(t) - F(t) ),
- * where A(t) is the t'th data element.
- */
- f = f + (1.0 - info->damp_fact) * (a - f);
- dao_set_cell_float (dao, dataset, row + 1, f);
+ if (info->std_error_flag) {
+ col++;
+ dao_set_italic (dao, col, 0, col, 0);
+ dao_set_cell (dao, col, 0, _("Standard Error"));
+ y = 0;
+ x = 0;
+ (*mover) = base;
+ for (row = 1; row <= height; row++) {
+ if (row > base && row <= height && (row - base - info->df) > 0) {
+ GnmExpr const *expr_offset;
+
+ if (info->base.group_by == GROUPED_BY_ROW)
+ delta_x = row - base;
+ else
+ delta_y = row - base;
+
+ expr_offset = analysis_tool_moving_average_funcall5
+ (fd_offset, expr_input, y, x, delta_y, delta_x);
+ dao_set_cell_expr (dao, col, row,
+ gnm_expr_new_funcall1
+ (fd_sqrt,
+ gnm_expr_new_binary
+ (gnm_expr_new_funcall2
+ (fd_sumxmy2,
+ expr_offset,
+ make_rangeref (-1, - row + base + 1, -1, 0)),
+ GNM_EXPR_OP_DIV,
+ gnm_expr_new_constant (value_new_int
+ (row - base - info->df)))));
+ } else
+ dao_set_cell_na (dao, col, row);
}
- a = g_array_index (current->data, gnm_float, row);
}
+
+ gnm_expr_free (expr_input);
}
- dao_set_italic (dao, 0, 0, data->len - 1, 0);
- destroy_data_set_list (data);
+ if (so != NULL)
+ dao_set_sheet_object (dao, 0, 1, so);
+
+ gnm_expr_free (expr_alpha);
+ if (fd_sqrt != NULL)
+ gnm_func_unref (fd_sqrt);
+ if (fd_sumxmy2 != NULL)
+ gnm_func_unref (fd_sumxmy2);
+ gnm_func_unref (fd_offset);
+ gnm_func_unref (fd_index);
+
+ dao_redraw_respan (dao);
return FALSE;
}
@@ -3917,7 +4030,7 @@
prepare_input_range (&info->base.input, info->base.group_by);
dao_adjust (dao, (info->std_error_flag ? 2 : 1) *
g_slist_length (info->base.input),
- 1 + analysis_tool_calc_length (specs));
+ 3 + analysis_tool_calc_length (specs));
return FALSE;
case TOOL_ENGINE_CLEAN_UP:
return analysis_tool_generic_clean (specs);
Modified: trunk/src/tools/analysis-tools.h
==============================================================================
--- trunk/src/tools/analysis-tools.h (original)
+++ trunk/src/tools/analysis-tools.h Thu Sep 25 16:04:22 2008
@@ -113,6 +113,8 @@
analysis_tools_data_generic_t base;
gnm_float damp_fact;
int std_error_flag;
+ int df;
+ gboolean show_graph;
} analysis_tools_data_exponential_smoothing_t;
gboolean analysis_tool_exponential_smoothing_engine (data_analysis_output_t *dao, gpointer specs,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]