17template<
class Allocator>
19 using bstring = battery::string<Allocator>;
20 template<
class T>
using bvector = battery::vector<T, Allocator>;
21 using array_dim_t = bvector<battery::tuple<size_t,size_t>>;
22 using F = TFormula<Allocator>;
24 bvector<bstring> output_vars;
26 bvector<battery::tuple<bstring, array_dim_t, bvector<bstring>>> output_arrays;
29 std::string join_str(
const bvector<bstring>& vec,
const std::string& separator, std::function<std::string(
const bstring&)> toString)
const {
31 for (
size_t i = 0; i < vec.size(); ++i) {
32 result += toString(vec[i]);
33 if (i < vec.size() - 1) {
42 template <
class Alloc2>
52 , output_arrays(alloc),type(outputType)
58 template <
class Alloc>
60 output_vars = other.output_vars;
61 output_arrays = other.output_arrays;
66 template<
class Alloc2>
68 : output_vars(other.output_vars, allocator)
69 , output_arrays(other.output_arrays, allocator),type(other.type)
72 void add_array_var(
const std::string& name,
const bstring& var_name,
const peg::SemanticValues& sv) {
74 auto array_name = bstring(name.data());
75 for(
int i = 0; i < output_arrays.size(); ++i) {
76 if(battery::get<0>(output_arrays[i]) == array_name) {
82 output_arrays.push_back(battery::make_tuple<bstring, array_dim_t, bvector<bstring>>(bstring(array_name), {}, {}));
83 idx =
static_cast<int>(output_arrays.size()) - 1;
85 for(
int i = 0; i < sv.size(); ++i) {
86 auto range = std::any_cast<F>(sv[i]);
87 for(
int j = 0; j < range.s().size(); ++j) {
88 const auto& itv = range.s()[j];
89 battery::get<1>(output_arrays[idx]).push_back(battery::make_tuple(battery::get<0>(itv).z(), battery::get<1>(itv).z()));
93 battery::get<2>(output_arrays[idx]).push_back(var_name);
97 output_vars.push_back(var_name);
103 template <
class Alloc,
class B,
class Env>
104 CUDA
void print_variable(
const LVar<Alloc>& vname,
const Env& benv,
const B& b)
const {
105 const auto& x = *(benv.variable_of(vname));
106 x.sort.print_value(b.project(x.avars[0]));
110 template <
class Env,
class A,
class S>
112 for(
int i = 0; i < output_vars.size(); ++i) {
113 printf(
"%s=", output_vars[i].data());
114 simplifier.print_variable(output_vars[i], env, sol);
117 for(
int i = 0; i < output_arrays.size(); ++i) {
118 const auto& dims = battery::get<1>(output_arrays[i]);
119 const auto& array_vars = battery::get<2>(output_arrays[i]);
120 printf(
"%s=array%" PRIu64
"d(", battery::get<0>(output_arrays[i]).data(), dims.size());
121 for(
int j = 0; j < dims.size(); ++j) {
122 printf(
"%" PRIu64
"..%" PRIu64
",", battery::get<0>(dims[j]), battery::get<1>(dims[j]));
125 for(
int j = 0; j < array_vars.size(); ++j) {
126 simplifier.print_variable(array_vars[j], env, sol);
127 if(j+1 != array_vars.size()) {
135 template<
class Env,
class A,
class S>
137 auto vars = join_str(output_vars,
" ", [](
const bstring& s) -> std::string {
return s.data(); });
138 printf(
"v <instantiation> <list>%s</list> <values>", vars.c_str());
139 for (
int i = 0; i < output_vars.size(); ++i) {
140 simplifier.print_variable(output_vars[i], env, sol);
141 if(i+1 != output_vars.size()) {
145 printf(
"</values> </instantiation>\n");
150 template <
class Env,
class A,
class S>
Definition solver_output.hpp:102
Definition solver_output.hpp:18
CUDA SolverOutput(const SolverOutput< Alloc2 > &other, const Allocator &allocator=Allocator{})
Definition solver_output.hpp:67
CUDA SolverOutput(const Allocator &alloc, OutputType outputType)
Definition solver_output.hpp:50
void add_var(const bstring &var_name)
Definition solver_output.hpp:96
CUDA SolverOutput(const Allocator &alloc)
Definition solver_output.hpp:45
CUDA void print_solution(const Env &env, const A &sol, const S &simplifier=SimplifierIdentity{}) const
Definition solver_output.hpp:151
SolverOutput(SolverOutput &&)=default
CUDA SolverOutput< Allocator > & operator=(const SolverOutput< Alloc > &other)
Definition solver_output.hpp:59
CUDA void print_solution_xml(const Env &env, const A &sol, const S &simplifier=SimplifierIdentity{}) const
Definition solver_output.hpp:136
void add_array_var(const std::string &name, const bstring &var_name, const peg::SemanticValues &sv)
Definition solver_output.hpp:72
CUDA void print_solution_flat_zinc(const Env &env, const A &sol, const S &simplifier=SimplifierIdentity{}) const
Definition solver_output.hpp:111
bvector< bstring > getOutputVars()
Definition solver_output.hpp:99
SolverOutput< Allocator > & operator=(const SolverOutput< Allocator > &)=default
Definition flatzinc_parser.hpp:21
OutputType
Definition solver_output.hpp:11