static gboolean gnm_glpk_start (GnmSolver *sol, WorkbookControl *wbc, GError **err, GnmGlpk *lp) { GnmSubSolver *subsol = GNM_SUB_SOLVER (sol); gboolean ok; gchar *argv[9]; int argc = 0; GnmSolverParameters *param = sol->params; const char *binary; g_return_val_if_fail (sol->status == GNM_SOLVER_STATUS_PREPARED, FALSE); binary = gnm_conf_get_plugin_glpk_glpsol_path (); if (binary == NULL || *binary == 0) binary = SOLVER_PROGRAM; argv[argc++] = (gchar *)binary; argv[argc++] = (gchar *)(param->options.automatic_scaling ? "--scale" : "--noscale"); argv[argc++] = (gchar *)"--write"; argv[argc++] = lp->result_filename; if (lp->ranges_filename) { argv[argc++] = (gchar *)"--ranges"; argv[argc++] = lp->ranges_filename; } argv[argc++] = (gchar *)"--cpxlp"; argv[argc++] = subsol->program_filename; argv[argc] = NULL; g_assert (argc < (int)G_N_ELEMENTS (argv)); ok = gnm_sub_solver_spawn (subsol, argv, cb_child_setup, NULL, NULL, NULL, NULL, NULL, err); if (!ok && err && g_error_matches (*err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) { g_clear_error (err); g_set_error (err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT, _("The %s program was not found. You can either " "install it or use another solver. " "For more information see %s"), SOLVER_PROGRAM, SOLVER_URL); } return ok; }
static gboolean write_program (GnmSolver *sol, WorkbookControl *wbc, GError **err) { GnmSubSolver *subsol = GNM_SUB_SOLVER (sol); GOFileSaver *fs; fs = go_file_saver_for_mime_type ("application/lpsolve"); if (!fs) { g_set_error (err, G_FILE_ERROR, 0, _("The LPSolve exporter is not available.")); return FALSE; } return gnm_solver_saveas (sol, wbc, fs, "program-XXXXXX.lp", &subsol->program_filename, err); }
void glpk_file_save (GOFileSaver const *fs, GOIOContext *io_context, WorkbookView const *wb_view, GsfOutput *output) { GError *err = NULL; GString *prg; GnmLocale *locale; GnmSolver *sol = NULL; GnmSubSolver *ssol = g_object_get_data (G_OBJECT (fs), "solver"); if (!ssol) { // Create a temporary solver just functional enough to // write the program Sheet *sheet = wb_view_cur_sheet (wb_view); sol = glpk_solver_create (sheet->solver_parameters); ssol = GNM_SUB_SOLVER (sol); } go_io_progress_message (io_context, _("Writing glpk file...")); locale = gnm_push_C_locale (); prg = glpk_create_program (ssol, io_context, &err); gnm_pop_C_locale (locale); gnm_app_recalc (); if (!prg) { go_cmd_context_error_import (GO_CMD_CONTEXT (io_context), err ? err->message : "?"); goto fail; } gsf_output_write (output, prg->len, prg->str); g_string_free (prg, TRUE); fail: go_io_progress_unset (io_context); if (err) g_error_free (err); if (sol) g_object_unref (sol); }
GnmSolver * glpk_solver_create (GnmSolverParameters *params) { GnmSolver *res = g_object_new (GNM_SUB_SOLVER_TYPE, "params", params, NULL); GnmGlpk *lp = g_new0 (GnmGlpk, 1); lp->parent = GNM_SUB_SOLVER (res); g_signal_connect (res, "prepare", G_CALLBACK (gnm_glpk_prepare), lp); g_signal_connect (res, "start", G_CALLBACK (gnm_glpk_start), lp); g_signal_connect (res, "stop", G_CALLBACK (gnm_glpk_stop), lp); g_signal_connect (res, "child-exit", G_CALLBACK (gnm_glpk_child_exit), lp); g_object_set_data_full (G_OBJECT (res), PRIVATE_KEY, lp, (GDestroyNotify)gnm_glpk_final); return res; }
static gboolean gnm_lpsolve_start (GnmSolver *sol, WorkbookControl *wbc, GError **err, GnmLPSolve *lp) { GnmSubSolver *subsol = GNM_SUB_SOLVER (sol); gboolean ok; gchar *argv[5]; int argc = 0; GnmSolverParameters *param = sol->params; g_return_val_if_fail (sol->status == GNM_SOLVER_STATUS_PREPARED, FALSE); argv[argc++] = (gchar *)SOLVER_PROGRAM; argv[argc++] = (gchar *)"-i"; argv[argc++] = (gchar *)(param->options.automatic_scaling ? "-s1" : "-s0"); argv[argc++] = subsol->program_filename; argv[argc] = NULL; g_assert (argc < (int)G_N_ELEMENTS (argv)); ok = gnm_sub_solver_spawn (subsol, argv, cb_child_setup, NULL, (GIOFunc)cb_read_stdout, lp, NULL, NULL, err); if (!ok && err && g_error_matches (*err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) { g_clear_error (err); g_set_error (err, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT, _("The %s program was not found. You can either " "install it or use another solver. " "For more information see %s"), SOLVER_PROGRAM, SOLVER_URL); } return ok; }
GnmSolver * lpsolve_solver_factory (GnmSolverFactory *factory, GnmSolverParameters *params) { GnmSolver *res = g_object_new (GNM_SUB_SOLVER_TYPE, "params", params, NULL); GnmLPSolve *lp = g_new0 (GnmLPSolve, 1); lp->parent = GNM_SUB_SOLVER (res); gnm_sheet_range_from_value (&lp->srinput, gnm_solver_param_get_input (params)); if (lp->srinput.sheet) lp->srinput.sheet = params->sheet; g_signal_connect (res, "prepare", G_CALLBACK (gnm_lpsolve_prepare), lp); g_signal_connect (res, "start", G_CALLBACK (gnm_lpsolve_start), lp); g_signal_connect (res, "stop", G_CALLBACK (gnm_lpsolve_stop), lp); g_signal_connect (res, "child-exit", G_CALLBACK (gnm_lpsolve_child_exit), lp); g_object_set_data_full (G_OBJECT (res), PRIVATE_KEY, lp, (GDestroyNotify)gnm_lpsolve_final); return res; }