static void gnm_nlsolve_set_solution (GnmNlsolve *nl) { GnmSolver *sol = nl->parent; GnmSolverResult *result = g_object_new (GNM_SOLVER_RESULT_TYPE, NULL); const int n = nl->vars->len; int i; result->quality = GNM_SOLVER_RESULT_FEASIBLE; result->value = nl->maximize ? 0 - nl->yk : nl->yk; result->solution = value_new_array_empty (nl->input_width, nl->input_height); for (i = 0; i < n; i++) { GnmCell *cell = g_ptr_array_index (nl->vars, i); value_array_set (result->solution, cell->pos.col - nl->origin.col, cell->pos.row - nl->origin.row, value_new_float (nl->xk[i])); } g_object_set (sol, "result", result, NULL); g_object_unref (result); if (!gnm_solver_check_constraints (sol)) { g_printerr ("Infeasible solution set\n"); } }
static GnmSolverResult * gnm_lpsolve_start_solution (GnmLPSolve *lp) { g_return_val_if_fail (lp->result == NULL, NULL); lp->result = g_object_new (GNM_SOLVER_RESULT_TYPE, NULL); lp->result->solution = value_new_array_empty (range_width (&lp->srinput.range), range_height (&lp->srinput.range)); return lp->result; }
static GnmValue * new_gnm_value_from_xloper (const XLOPER*x) { GnmValue * g = NULL; if (NULL != x) { switch (x->xltype & xltypeType) { case xltypeNum: g = value_new_float (x->val.num); break; case xltypeStr: { char *o = NULL; const char *s = x->val.str; if (NULL != s) { guint m = ((unsigned char)s[0]) + 1U; o = g_new (char, m); g_strlcpy (o, s + 1, m); } g = value_new_string_nocopy (o); break; } case xltypeBool: g = value_new_bool (x->val.boolean); break; case xltypeRef: unsupported_xloper_type (x); break; case xltypeErr: g = value_new_error_std (NULL, gnm_value_error_from_xloper (x)); break; case xltypeFlow: unsupported_xloper_type (x); break; case xltypeMulti: { guint m = x->val.array.columns; guint n = x->val.array.rows; if (m > 0 && n > 0) { guint i; g = value_new_array_empty (m,n); for (i = 0; i < m; ++i) { guint j; for (j = 0; j < n; ++j) { g->v_array.vals[i][j] = new_gnm_value_from_xloper (x->val.array.lparray + i + j * m); } } } else { g = value_new_error_std (NULL, GNM_ERROR_VALUE); } break; } case xltypeMissing: break; case xltypeNil: g = value_new_empty (); break; case xltypeSRef: unsupported_xloper_type (x); break; case xltypeInt: g = value_new_int (x->val.w); break; default: unsupported_xloper_type (x); } } else {