1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
Jip J. Dekker f2a1c4e389 Squashed 'software/mza/' content from commit f970a59b17
git-subtree-dir: software/mza
git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
2021-07-11 16:34:30 +10:00

118 lines
3.8 KiB
C++

#ifndef __MINIZINC_NL_READ_SOL_HH__
#define __MINIZINC_NL_READ_SOL_HH__
#include <minizinc/solns2out.hh>
#include <minizinc/solvers/nl/nl_file.hh>
#include <cstring>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
// Reading a .sol file.
// Note: I did not find any description of the format, so I did a bit of reverse engineering.
// A sol file looks like this (first line is the 'message...' line)
/*
message from the solver
Options
3
1
1
0
1
0
2
2
1
2
objno 0 0
*/
// A sol file does not contains comments, and the blank line between the message and 'Options' is
// meaningfull. Now, with our own comments.
/*
message from the solver # Starts on first line. Can span several line as long as their is no
blank line <blank line> # the blank line marks the end of the message Options # Inform
about option used by the solver (?). May be absent. 3 # Number of options.
1 # opt 1 Note: I did not fully understand this, but reading
"hooking your solver" 1 # opt 2 suggests that we can
(probably) ignore that. 0 # opt 3 1 # Number A of
dual before "suf_sos()" (before solving ?) 0 # Number of dual after. Seems
to be either A or 0. Will probably always be 0 (???) 2 # Number B of primal
before "suf_sos()" (before solving ?) 2 # Number of primal after. Seems to
be either B or 0 1 # No dual. So this is the result for the first primal
(variable indice 0) 2 # result for variable indice 1 objno 0 0 # Objectif 0
<result code>
*/
// Result code can be :
// (from https://github.com/ampl/mp/blob/master/include/mp/common.h)
// UNKNOWN = -1,
// SOLVED = 0, // Optimal sol found for an optim problem or a feasible solution found for a
// satisfaction problem. UNCERTAIN = 100, // Solution returned but it can be non-optimal or even
// infeasible. INFEASIBLE = 200, UNBOUNDED = 300, // Problem is unbounded. LIMIT = 400,
// // Stopped by a limit, e.g. on iterations or time. FAILURE = 500, // A solver error.
// INTERRUPTED = 600 // Interrupted by the user.
namespace MiniZinc {
/** Declaration of the exit codes. */
enum NL_Solver_Status {
PARSE_ERROR = -2, // We are adding our own error code for parsing
UNKNOWN = -1,
SOLVED = 0, // Optimal sol found for an optim problem or a feasible solution found for a
// satisfaction problem.
UNCERTAIN = 100, // Solution returned but it can be non-optimal or even infeasible.
INFEASIBLE = 200,
UNBOUNDED = 300, // Problem is unbounded.
LIMIT = 400, // Stopped by a limit, e.g. on iterations or time.
FAILURE = 500, // A solver error.
INTERRUPTED = 600 // Interrupted by the user.
};
/** Represent a solution read from a file '.sol'. */
class NLSol {
public:
// --- --- --- Fields
string message;
NL_Solver_Status status;
vector<double> values;
// --- --- --- Constructors
NLSol() = default;
NLSol(string mes, NL_Solver_Status st, vector<double> res)
: message(mes), status(st), values(res) {}
// --- --- --- Static functions
static NLSol parse_sol(std::istream& in);
};
/** Our version of Solns2Out **/
class NLSolns2Out {
private:
Solns2Out* out;
NLFile& nl_file;
std::ofstream dummy_ofstream;
// Controls for feedRawDataChunk
bool in_line;
bool verbose;
public:
NLSolns2Out(Solns2Out* out0, NLFile& nl_file0, bool verbose0)
: out(out0), nl_file(nl_file0), in_line(false), verbose(verbose0) {}
void parse_sol(const string& filename);
bool feedRawDataChunk(const char* data);
std::ostream& getLog(void);
};
} // namespace MiniZinc
#endif