[gnumeric] solver: clean up constraint structure.
- From: Morten Welinder <mortenw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnumeric] solver: clean up constraint structure.
- Date: Thu, 29 Oct 2009 02:15:07 +0000 (UTC)
commit a6c53582b36c1fbb1fb98b485fef9bf9d10ee2b0
Author: Morten Welinder <terra gnome org>
Date: Wed Oct 28 22:14:40 2009 -0400
solver: clean up constraint structure.
ChangeLog | 5 +++
NEWS | 1 +
plugins/mps/mps.c | 4 --
src/dialogs/dialog-solver.c | 51 +++++++++++-----------------
src/solver.h | 8 +---
src/tools/solver/ChangeLog | 4 ++
src/tools/solver/reports-write.c | 7 +++-
src/tools/solver/solver.c | 68 ++++++++-----------------------------
8 files changed, 52 insertions(+), 96 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 57d46d4..55e1164 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-28 Morten Welinder <terra gnome org>
+
+ * src/solver.h (SolverConstraint): Remove redundant str member.
+ All users changed to gnm_solver_constraint_as_str calls.
+
2009-10-28 Andreas J. Guelzow <aguelzow pyrshep ca>
* src/commands.h (cmd_autofilter_add_remove): new
diff --git a/NEWS b/NEWS
index f2cd3e2..3afb1a6 100644
--- a/NEWS
+++ b/NEWS
@@ -31,6 +31,7 @@ Morten:
* Make DATE work for pre-1900 dates. [#599365]
* Add lpsolve output format.
* Plug solver leaks.
+ * Some solver cleanups.
Yaacov Zamir:
* Hebrew Calendar functions. [#153738]
diff --git a/plugins/mps/mps.c b/plugins/mps/mps.c
index 7908d70..8b7864c 100644
--- a/plugins/mps/mps.c
+++ b/plugins/mps/mps.c
@@ -405,10 +405,6 @@ mps_write_coefficients (MpsInputContext *ctxt, Sheet *sh,
c->type = type_map[row->type]; /* const_cast */
c->cols = 1;
c->rows = 1;
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols,
- c->rows);
param->constraints = g_slist_append (param->constraints, c);
i++;
diff --git a/src/dialogs/dialog-solver.c b/src/dialogs/dialog-solver.c
index 82f76f5..02ae342 100644
--- a/src/dialogs/dialog-solver.c
+++ b/src/dialogs/dialog-solver.c
@@ -269,40 +269,32 @@ constraint_fill_row (SolverState *state, GtkListStore *store, GtkTreeIter *iter)
{
char *text;
constraint_t *the_constraint = g_new (constraint_t, 1);
+ SolverConstraint c;
+ GnmCellRef a, b;
the_constraint->lhs_value = gnm_expr_entry_parse_as_value
(state->lhs.entry, state->sheet);
the_constraint->type = gtk_combo_box_get_active
(state->type_combo);
- if ((the_constraint->type != SolverINT) &&
- (the_constraint->type != SolverBOOL)) {
+ a = the_constraint->lhs_value->v_range.cell.a;
+ b = the_constraint->lhs_value->v_range.cell.b;
+ c.type = the_constraint->type;
+ c.lhs.col = a.col;
+ c.lhs.row = a.row;
+ c.rows = b.row - c.lhs.row + 1;
+ c.cols = b.col - c.lhs.col + 1;
+ if (c.type != SolverINT && c.type != SolverBOOL) {
the_constraint->rhs_value = gnm_expr_entry_parse_as_value
(state->rhs.entry, state->sheet);
-
-/* FIXME: We are dropping cross sheet references!! */
- text = write_constraint_str
- (the_constraint->lhs_value->v_range.cell.a.col,
- the_constraint->lhs_value->v_range.cell.a.row,
- the_constraint->rhs_value->v_range.cell.a.col,
- the_constraint->rhs_value->v_range.cell.a.row,
- the_constraint->type,
- the_constraint->lhs_value->v_range.cell.b.col -
- the_constraint->lhs_value->v_range.cell.a.col + 1,
- the_constraint->lhs_value->v_range.cell.b.row -
- the_constraint->lhs_value->v_range.cell.a.row + 1);
+ a = the_constraint->rhs_value->v_range.cell.a;
+ c.rhs.col = a.col;
+ c.rhs.row = a.row;
} else {
the_constraint->rhs_value = NULL;
-/* FIXME: We are dropping cross sheet references!! */
- text = write_constraint_str
- (the_constraint->lhs_value->v_range.cell.a.col,
- the_constraint->lhs_value->v_range.cell.a.row,
- 0, 0,
- the_constraint->type,
- the_constraint->lhs_value->v_range.cell.b.col -
- the_constraint->lhs_value->v_range.cell.a.col + 1,
- the_constraint->lhs_value->v_range.cell.b.row -
- the_constraint->lhs_value->v_range.cell.a.row + 1);
+ c.rhs.col = c.rhs.row = 0;
}
+/* FIXME: We are dropping cross sheet references!! */
+ text = gnm_solver_constraint_as_str (&c);
gtk_list_store_set (store, iter, 0, text, 1, the_constraint, -1);
g_free (text);
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (state->constraint_list), iter);
@@ -595,12 +587,6 @@ convert_constraint_format (constraint_conversion_t *conv)
engine_constraint->rhs.row =
a_constraint->rhs_value->v_range.cell.a.row;
}
- engine_constraint->str = write_constraint_str (
- engine_constraint->lhs.col, engine_constraint->lhs.row,
- engine_constraint->rhs.col, engine_constraint->rhs.row,
- a_constraint->type,
- engine_constraint->cols,
- engine_constraint->rows);
conv->c_list = g_slist_append (conv->c_list, engine_constraint);
} while (gtk_tree_model_iter_next (store, &iter));
}
@@ -624,6 +610,7 @@ revert_constraint_format (constraint_conversion_t * conv)
engine_constraint_list->data;
GnmRange r;
constraint_t *a_constraint = g_new (constraint_t, 1);
+ char *str;
r.start.col = engine_constraint->lhs.col;
r.start.row = engine_constraint->lhs.row;
@@ -641,7 +628,9 @@ revert_constraint_format (constraint_conversion_t * conv)
a_constraint->type = engine_constraint->type;
gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter, 0, engine_constraint->str, 1, a_constraint, -1);
+ str = gnm_solver_constraint_as_str (engine_constraint);
+ gtk_list_store_set (store, &iter, 0, str, 1, a_constraint, -1);
+ g_free (str);
engine_constraint_list = engine_constraint_list->next;
}
}
diff --git a/src/solver.h b/src/solver.h
index 0ea1c9a..1782f1a 100644
--- a/src/solver.h
+++ b/src/solver.h
@@ -71,11 +71,12 @@ typedef struct {
gint rows; /* number of rows */
gint cols; /* number of columns */
SolverConstraintType type; /* <=, =, >=, int, bool */
- char *str; /* the same in string form */
} SolverConstraint;
#ifdef GNM_ENABLE_SOLVER
+char *gnm_solver_constraint_as_str (SolverConstraint const *c);
+
typedef enum {
SolverRunning, SolverOptimal, SolverUnbounded, SolverInfeasible,
SolverFailure, SolverMaxIterExc, SolverMaxTimeExc
@@ -211,11 +212,6 @@ gchar * solver_reports (WorkbookControl *wbc, Sheet *sheet,
gboolean limits, gboolean performance,
gboolean program, gboolean dual);
-char *write_constraint_str (int lhs_col, int lhs_row,
- int rhs_col, int rhs_row,
- SolverConstraintType type,
- int cols, int rows);
-
/* Initializes the Solver's data structure containing the parameters.
* Each sheet can currently have one copy of this data structure. */
SolverParameters *solver_param_new (void);
diff --git a/src/tools/solver/ChangeLog b/src/tools/solver/ChangeLog
index a8c8980..d693454 100644
--- a/src/tools/solver/ChangeLog
+++ b/src/tools/solver/ChangeLog
@@ -1,3 +1,7 @@
+2009-10-28 Morten Welinder <terra gnome org>
+
+ * solver.c (gnm_solver_constraint_as_str): New function.
+
2009-10-27 Morten Welinder <terra gnome org>
* solver.c (solver_insert_rows, solver_insert_cols,
diff --git a/src/tools/solver/reports-write.c b/src/tools/solver/reports-write.c
index 42b625d..620e8c8 100644
--- a/src/tools/solver/reports-write.c
+++ b/src/tools/solver/reports-write.c
@@ -133,7 +133,8 @@ solver_answer_report (WorkbookControl *wbc,
dao_set_bold (&dao, 0, 15 + vars, 6, 15 + vars);
for (i = 0; i < res->param->n_total_constraints; i++) {
- SolverConstraint *c = res->constraints_array[i];
+ SolverConstraint const *c = res->constraints_array[i];
+ char *str = gnm_solver_constraint_as_str (c);
/* Set `Cell' column */
dao_set_cell (&dao, 1, 16 + vars + i,
@@ -147,7 +148,7 @@ solver_answer_report (WorkbookControl *wbc,
dao_set_cell_float (&dao, 3, 16 + vars + i, res->lhs[i]);
/* Set `Formula' column */
- dao_set_cell (&dao, 4, 16 + vars + i, c->str);
+ dao_set_cell (&dao, 4, 16 + vars + i, str);
if (c->type == SolverINT || c->type == SolverBOOL) {
dao_set_cell (&dao, 5, 16 + vars + i, _("Binding"));
@@ -162,6 +163,8 @@ solver_answer_report (WorkbookControl *wbc,
/* Set `Slack' column */
dao_set_cell_float (&dao, 6, 16 + vars + i, res->slack [i]);
+
+ g_free (str);
}
/*
diff --git a/src/tools/solver/solver.c b/src/tools/solver/solver.c
index b716f40..1c02f94 100644
--- a/src/tools/solver/solver.c
+++ b/src/tools/solver/solver.c
@@ -119,11 +119,6 @@ solver_constr_start (GsfXMLIn *xin, xmlChar const **attrs)
default: c->type = SolverLE; break;
}
-#ifdef GNM_ENABLE_SOLVER
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols, c->rows);
-#endif
sp->constraints = g_slist_append (sp->constraints, c);
}
@@ -268,7 +263,6 @@ solver_get_constraint (SolverResults *res, int n)
void
solver_constraint_destroy (SolverConstraint *c)
{
- g_free (c->str);
g_free (c);
}
@@ -288,48 +282,36 @@ create_solver_constraint (int lhs_col, int lhs_row, int rhs_col, int rhs_row,
c->rows = 1;
c->cols = 1;
c->type = type;
- c->str = write_constraint_str (lhs_col, lhs_row, rhs_col,
- rhs_row, type, 1, 1);
return c;
}
char *
-write_constraint_str (int lhs_col, int lhs_row, int rhs_col,
- int rhs_row, SolverConstraintType type,
- int cols, int rows)
+gnm_solver_constraint_as_str (SolverConstraint const *c)
{
- GString *buf = g_string_new (NULL);
+ GString *buf = g_string_new (NULL);
const char *type_str[] = { "\xe2\x89\xa4" /* "<=" */,
"\xe2\x89\xa5" /* ">=" */,
"=", "Int", "Bool" };
- if (cols == 1 && rows == 1)
- g_string_append_printf (buf, "%s %s ",
- cell_coord_name (lhs_col, lhs_row),
- type_str[type]);
- else {
- g_string_append (buf, cell_coord_name (lhs_col, lhs_row));
+ g_string_append (buf, cell_coord_name (c->lhs.col, c->lhs.row));
+ if (c->cols > 1 || c->rows > 1) {
g_string_append_c (buf, ':');
g_string_append (buf,
- cell_coord_name (lhs_col + cols - 1,
- lhs_row + rows - 1));
- g_string_append_c (buf, ' ');
- g_string_append (buf, type_str[type]);
- g_string_append_c (buf, ' ');
+ cell_coord_name (c->lhs.col + c->cols - 1,
+ c->lhs.row + c->rows - 1));
}
+ g_string_append_c (buf, ' ');
+ g_string_append (buf, type_str[c->type]);
+ g_string_append_c (buf, ' ');
- if (type != SolverINT && type != SolverBOOL) {
- if (cols == 1 && rows == 1)
- g_string_append (buf, cell_coord_name (rhs_col,
- rhs_row));
- else {
- g_string_append (buf, cell_coord_name (rhs_col,
- rhs_row));
+ if (c->type != SolverINT && c->type != SolverBOOL) {
+ g_string_append (buf, cell_coord_name (c->rhs.col, c->rhs.row));
+ if (c->cols > 1 || c->rows > 1) {
g_string_append_c (buf, ':');
g_string_append (buf,
- cell_coord_name (rhs_col + cols - 1,
- rhs_row + rows - 1));
+ cell_coord_name (c->rhs.col + c->cols - 1,
+ c->rhs.row + c->rows - 1));
}
}
@@ -834,11 +816,7 @@ solver_lp_copy (const SolverParameters *src_param, Sheet *new_sheet)
for (constraints = src_param->constraints; constraints;
constraints = constraints->next) {
SolverConstraint *old = constraints->data;
- SolverConstraint *new;
-
- new = g_new (SolverConstraint, 1);
- *new = *old;
- new->str = g_strdup (old->str);
+ SolverConstraint *new = g_memdup (old, sizeof (*old));
dst_param->constraints =
g_slist_prepend (dst_param->constraints, new);
@@ -902,10 +880,6 @@ solver_insert_rows (Sheet *sheet, int row, int count)
c->lhs.row += count;
if (c->rhs.row >= row)
c->rhs.row += count;
- g_free (c->str);
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols, c->rows);
}
}
@@ -943,10 +917,6 @@ solver_insert_cols (Sheet *sheet, int col, int count)
c->lhs.col += count;
if (c->rhs.col >= col)
c->rhs.col += count;
- g_free (c->str);
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols, c->rows);
}
}
@@ -987,10 +957,6 @@ solver_delete_rows (Sheet *sheet, int row, int count)
c->lhs.row -= count;
if (c->rhs.row >= row)
c->rhs.row -= count;
- g_free (c->str);
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols, c->rows);
}
}
@@ -1035,9 +1001,5 @@ solver_delete_cols (Sheet *sheet, int col, int count)
c->lhs.col -= count;
if (c->rhs.col >= col)
c->rhs.col -= count;
- g_free (c->str);
- c->str = write_constraint_str (c->lhs.col, c->lhs.row,
- c->rhs.col, c->rhs.row,
- c->type, c->cols, c->rows);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]