[gnumeric] Solver: move handling of input_cells to GnmSolver.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] Solver: move handling of input_cells to GnmSolver.
- Date: Sat, 25 Apr 2015 17:55:22 +0000 (UTC)
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]