[gnumeric] solver: clean up constraint structure.



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]