[gnumeric] Solver: move handling of input_cells to GnmSolver.



commit dff69abcbe27968c471b041f422ca3bdff6ea8db
Author: Morten Welinder <terra gnome org>
Date:   Sat Apr 25 13:55:11 2015 -0400

    Solver: move handling of input_cells to GnmSolver.

 plugins/glpk/glpk-write.c       |   14 ++++++++------
 plugins/lpsolve/lpsolve-write.c |   16 ++++++++--------
 plugins/nlsolve/gnm-nlsolve.c   |    4 +---
 src/tools/gnm-solver.c          |   16 +++++++++++-----
 src/tools/gnm-solver.h          |    1 +
 5 files changed, 29 insertions(+), 22 deletions(-)
---
diff --git a/plugins/glpk/glpk-write.c b/plugins/glpk/glpk-write.c
index a9b9a73..05984b2 100644
--- a/plugins/glpk/glpk-write.c
+++ b/plugins/glpk/glpk-write.c
@@ -85,13 +85,15 @@ glpk_var_name (GnmSubSolver *ssol, GnmCell const *cell)
 static gboolean
 glpk_affine_func (GString *dst, GnmCell *target, GnmSubSolver *ssol,
                  gboolean zero_too,
-                 gnm_float cst, GPtrArray *input_cells, GError **err)
+                 gnm_float cst, GError **err)
 {
+       GnmSolver *sol = GNM_SOLVER (ssol);
        unsigned ui;
        gboolean any = FALSE;
        gnm_float y;
        GPtrArray *old_values;
        gboolean ok = TRUE;
+       GPtrArray *input_cells = sol->input_cells;
 
        if (!target) {
                gnm_string_add_number (dst, cst);
@@ -164,6 +166,7 @@ static GString *
 glpk_create_program (Sheet *sheet, GOIOContext *io_context,
                     GnmSubSolver *ssol, GError **err)
 {
+       GnmSolver *sol = GNM_SOLVER (ssol);
        GnmSolverParameters *sp = sheet->solver_parameters;
        GString *prg = NULL;
        GString *constraints = g_string_new (NULL);
@@ -172,7 +175,7 @@ glpk_create_program (Sheet *sheet, GOIOContext *io_context,
        GString *objfunc = g_string_new (NULL);
        GSList *l;
        GnmCell *target_cell = gnm_solver_param_get_target_cell (sp);
-       GPtrArray *input_cells = gnm_solver_param_get_input_cells (sp);
+       GPtrArray *input_cells = sol->input_cells;
        gsize progress;
 
        /* ---------------------------------------- */
@@ -223,7 +226,7 @@ glpk_create_program (Sheet *sheet, GOIOContext *io_context,
 
        g_string_append (objfunc, " obj: ");
        if (!glpk_affine_func (objfunc, target_cell, ssol,
-                              TRUE, 0, input_cells, err))
+                              TRUE, 0, err))
                goto fail;
        g_string_append (objfunc, "\n");
        go_io_count_progress_update (io_context, 1);
@@ -294,7 +297,7 @@ glpk_create_program (Sheet *sheet, GOIOContext *io_context,
 
                                ok = glpk_affine_func
                                        (constraints, lhs, ssol,
-                                        FALSE, cl, input_cells, err);
+                                        FALSE, cl, err);
                                if (!ok)
                                        goto fail;
 
@@ -304,7 +307,7 @@ glpk_create_program (Sheet *sheet, GOIOContext *io_context,
 
                                ok = glpk_affine_func
                                        (constraints, rhs, ssol,
-                                        FALSE, cr, input_cells, err);
+                                        FALSE, cr, err);
                                if (!ok)
                                        goto fail;
 
@@ -339,7 +342,6 @@ fail:
        g_string_free (constraints, TRUE);
        g_string_free (integers, TRUE);
        g_string_free (binaries, TRUE);
-       g_ptr_array_free (input_cells, TRUE);
 
        return prg;
 }
diff --git a/plugins/lpsolve/lpsolve-write.c b/plugins/lpsolve/lpsolve-write.c
index cb9cee9..54aaf74 100644
--- a/plugins/lpsolve/lpsolve-write.c
+++ b/plugins/lpsolve/lpsolve-write.c
@@ -88,13 +88,15 @@ lpsolve_var_name (GnmSubSolver *ssol, GnmCell const *cell)
 
 static gboolean
 lpsolve_affine_func (GString *dst, GnmCell *target, GnmSubSolver *ssol,
-                    gnm_float cst, GPtrArray *input_cells, GError **err)
+                    gnm_float cst, GError **err)
 {
+       GnmSolver *sol = GNM_SOLVER (ssol);
        unsigned ui;
        gboolean any = FALSE;
        gnm_float y;
        GPtrArray *old_values;
        gboolean ok = TRUE;
+       GPtrArray *input_cells = sol->input_cells;
 
        if (!target) {
                gnm_string_add_number (dst, cst);
@@ -167,6 +169,7 @@ static GString *
 lpsolve_create_program (Sheet *sheet, GOIOContext *io_context,
                        GnmSubSolver *ssol, GError **err)
 {
+       GnmSolver *sol = GNM_SOLVER (ssol);
        GnmSolverParameters *sp = sheet->solver_parameters;
        GString *prg = NULL;
        GString *constraints = g_string_new (NULL);
@@ -174,7 +177,7 @@ lpsolve_create_program (Sheet *sheet, GOIOContext *io_context,
        GString *objfunc = g_string_new (NULL);
        GSList *l;
        GnmCell *target_cell = gnm_solver_param_get_target_cell (sp);
-       GPtrArray *input_cells = gnm_solver_param_get_input_cells (sp);
+       GPtrArray *input_cells = sol->input_cells;
        gsize progress;
 
        /* ---------------------------------------- */
@@ -211,7 +214,7 @@ lpsolve_create_program (Sheet *sheet, GOIOContext *io_context,
        go_io_count_progress_update (io_context, 1);
 
        if (!lpsolve_affine_func (objfunc, target_cell, ssol,
-                                 0, input_cells, err))
+                                 0, err))
                goto fail;
        g_string_append (objfunc, ";\n");
        go_io_count_progress_update (io_context, 1);
@@ -283,8 +286,7 @@ lpsolve_create_program (Sheet *sheet, GOIOContext *io_context,
                                gboolean ok;
 
                                ok = lpsolve_affine_func
-                                       (constraints, lhs, ssol,
-                                        cl, input_cells, err);
+                                       (constraints, lhs, ssol, cl, err);
                                if (!ok)
                                        goto fail;
 
@@ -293,8 +295,7 @@ lpsolve_create_program (Sheet *sheet, GOIOContext *io_context,
                                g_string_append_c (constraints, ' ');
 
                                ok = lpsolve_affine_func
-                                       (constraints, rhs, ssol,
-                                        cr, input_cells, err);
+                                       (constraints, rhs, ssol, cr, err);
                                if (!ok)
                                        goto fail;
 
@@ -323,7 +324,6 @@ fail:
        g_string_free (objfunc, TRUE);
        g_string_free (constraints, TRUE);
        g_string_free (declarations, TRUE);
-       g_ptr_array_free (input_cells, TRUE);
 
        return prg;
 }
diff --git a/plugins/nlsolve/gnm-nlsolve.c b/plugins/nlsolve/gnm-nlsolve.c
index fbe2140..97ba2fc 100644
--- a/plugins/nlsolve/gnm-nlsolve.c
+++ b/plugins/nlsolve/gnm-nlsolve.c
@@ -75,8 +75,6 @@ gnm_nlsolve_final (GnmNlsolve *nl)
 
        rosenbrock_tentative_end (nl, FALSE);
 
-       if (nl->vars)
-               g_ptr_array_free (nl->vars, TRUE);
        g_free (nl->xk);
        g_free (nl->x0);
        if (nl->xi) {
@@ -726,7 +724,7 @@ nlsolve_solver_factory (GnmSolverFactory *factory, GnmSolverParameters *params)
        nl->debug = gnm_solver_debug ();
        nl->min_factor = 1e-10;
 
-       nl->vars = gnm_solver_param_get_input_cells (params);
+       nl->vars = GNM_SOLVER (res)->input_cells;
        n = nl->vars->len;
 
        nl->x0 = g_new (gnm_float, n);
diff --git a/src/tools/gnm-solver.c b/src/tools/gnm-solver.c
index 722e45c..21cb8dd 100644
--- a/src/tools/gnm-solver.c
+++ b/src/tools/gnm-solver.c
@@ -811,6 +811,11 @@ gnm_solver_dispose (GObject *obj)
                sol->params = NULL;
        }
 
+       if (sol->input_cells) {
+               g_ptr_array_free (sol->input_cells, TRUE);
+               sol->input_cells = NULL;
+       }
+
        gnm_solver_parent_class->dispose (obj);
 }
 
@@ -819,7 +824,10 @@ gnm_solver_constructed (GObject *obj)
 {
        GnmSolver *sol = GNM_SOLVER (obj);
        GnmSolverParameters *params = sol->params;
+
        sol->target = gnm_solver_param_get_target_cell (params);
+       sol->input_cells = gnm_solver_param_get_input_cells (params);
+
        gnm_solver_parent_class->constructed (obj);
 }
 
@@ -1147,12 +1155,11 @@ gnm_solver_check_constraints (GnmSolver *solver)
 
        if (sp->options.assume_non_negative ||
            sp->options.assume_discrete) {
-               GPtrArray *input_cells = gnm_solver_param_get_input_cells (sp);
                unsigned ui;
                gboolean bad;
 
-               for (ui = 0; ui < input_cells->len; ui++) {
-                       GnmCell *cell = g_ptr_array_index (input_cells, ui);
+               for (ui = 0; ui < solver->input_cells->len; ui++) {
+                       GnmCell *cell = g_ptr_array_index (solver->input_cells, ui);
                        gnm_float val;
 
                        gnm_cell_eval (cell);
@@ -1163,8 +1170,7 @@ gnm_solver_check_constraints (GnmSolver *solver)
                            val != gnm_floor (val))
                                break;
                }
-               bad = (ui < input_cells->len);
-               g_ptr_array_free (input_cells, TRUE);
+               bad = (ui < solver->input_cells->len);
 
                if (bad)
                        return FALSE;
diff --git a/src/tools/gnm-solver.h b/src/tools/gnm-solver.h
index 90e8a4c..d1b627d 100644
--- a/src/tools/gnm-solver.h
+++ b/src/tools/gnm-solver.h
@@ -203,6 +203,7 @@ typedef struct {
 
        /* Derived information */
        GnmCell *target;
+       GPtrArray *input_cells;
 } GnmSolver;
 
 typedef struct {


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