Lattice Land Parsing Library
Loading...
Searching...
No Matches
solver_output.hpp
Go to the documentation of this file.
1//
2// Created by falque on 05/06/24.
3//
4
5#ifndef OUTPUT_H
6#define OUTPUT_H
7
8
9namespace lala {
10
11enum class OutputType {
12 XCSP,
14};
15
16
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>;
23
24 bvector<bstring> output_vars;
25 // For each array, we store its output dimension characteristics and the list of the variables in the array.
26 bvector<battery::tuple<bstring, array_dim_t, bvector<bstring>>> output_arrays;
27
28 OutputType type;
29 std::string join_str(const bvector<bstring>& vec, const std::string& separator, std::function<std::string(const bstring&)> toString) const {
30 std::string result;
31 for (size_t i = 0; i < vec.size(); ++i) {
32 result += toString(vec[i]);
33 if (i < vec.size() - 1) {
34 result += separator;
35 }
36 }
37 return result;
38 }
39
40
41public:
42 template <class Alloc2>
43 friend class SolverOutput;
44
45 CUDA SolverOutput(const Allocator& alloc)
46 : output_vars(alloc)
47 , output_arrays(alloc),type(OutputType::FLATZINC)
48 {}
49
50 CUDA SolverOutput(const Allocator& alloc,OutputType outputType)
51 : output_vars(alloc)
52 , output_arrays(alloc),type(outputType)
53 {}
54
57
58 template <class Alloc>
60 output_vars = other.output_vars;
61 output_arrays = other.output_arrays;
62 type = other.type;
63 return *this;
64 }
65
66 template<class Alloc2>
67 CUDA SolverOutput(const SolverOutput<Alloc2>& other, const Allocator& allocator = Allocator{})
68 : output_vars(other.output_vars, allocator)
69 , output_arrays(other.output_arrays, allocator),type(other.type)
70 {}
71
72 void add_array_var(const std::string& name, const bstring& var_name, const peg::SemanticValues& sv) {
73 int idx = -1;
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) {
77 idx = i;
78 break;
79 }
80 }
81 if(idx == -1) {
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;
84 // Add the dimension of the array.
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()));
90 }
91 }
92 }
93 battery::get<2>(output_arrays[idx]).push_back(var_name);
94 }
95
96 void add_var(const bstring& var_name) {
97 output_vars.push_back(var_name);
98 }
99 bvector<bstring> getOutputVars(){
100 return output_vars;
101 }
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]));
107 }
108 };
109
110 template <class Env, class A, class S>
111 CUDA void print_solution_flat_zinc(const Env& env, const A& sol, const S& simplifier = SimplifierIdentity{}) const {
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);
115 printf(";\n");
116 }
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]));
123 }
124 printf("[");
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()) {
128 printf(",");
129 }
130 }
131 printf("]);\n");
132 }
133 }
134
135 template<class Env, class A, class S>
136 CUDA void print_solution_xml(const Env& env, const A& sol, const S& simplifier = SimplifierIdentity{}) const {
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()) {
142 printf(" ");
143 }
144 }
145 printf("</values> </instantiation>\n");
146 }
147
148
149
150 template <class Env, class A, class S>
151 CUDA void print_solution(const Env& env, const A& sol, const S& simplifier = SimplifierIdentity{}) const {
152 if(type == OutputType::FLATZINC) {
153 print_solution_flat_zinc(env, sol, simplifier);
154 }else{
155 print_solution_xml(env, sol, simplifier);
156 }
157 }
158
159};
160
161} // namespace lala
162#endif //OUTPUT_H
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