aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
GeneralizedCNFWriter_tpl.h
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4  * info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 #ifndef DOXYGEN_SHOULD_SKIP_THIS
23 
24 // to ease parsing in IDE
25 # include <agrum/BN/io/cnf/GeneralizedCNFWriter.h>
26 
27 namespace gum {
28 
29  /* =========================================================================*/
30  /* === GUM_BN_WRITER === */
31  /* =========================================================================*/
32  // Default constructor.
33  template < typename GUM_SCALAR, template < class > class IApproximationPolicy >
34  INLINE GeneralizedCNFWriter< GUM_SCALAR, IApproximationPolicy >::GeneralizedCNFWriter() {
36  }
37 
38  // Default destructor.
39  template < typename GUM_SCALAR, template < class > class IApproximationPolicy >
42  }
43 
44  //
45  // Writes a Bayesian network in the output stream using the BN format.
46  //
47  // @param ouput The output stream.
48  // @param bn The Bayesian network writen in output.
49  // @throws Raised if an I/O error occurs.
50  template < typename GUM_SCALAR, template < class > class IApproximationPolicy >
52  std::ostream& output,
53  const IBayesNet< GUM_SCALAR >& bn) {
54  if (!output.good()) GUM_ERROR(IOError, "Stream states flags are not all unset.")
55 
57 
58  Size num = 0;
59  Size numparam = 0;
60 
61  for (auto node: bn.nodes())
63 
64  Idx clause = 0;
66  gum::HashTable< std::string, Idx > vartable; // key name::label val num;
68 
69  for (auto node: bn.nodes()) {
70  const auto& var = bn.variable(node);
71 
72  for (Idx i = 0; i < var.domainSize(); i++) {
74  str << var.name() << "_" << var.label(i);
75  vartable.insert(str.str(), ++num);
76  strfile << num << "::" << str.str() << "\n";
77  }
78 
79  const Potential< GUM_SCALAR >& cpt = bn.cpt(node);
80 
82 
83  for (inst.setFirst(); !inst.end(); ++inst) {
85  strinst << inst.toString();
86  strinst << "_val=" << this->fromExact(cpt[inst]);
87 
89  strfile2 << numparam << "::" << strinst.str() << "\n";
90  }
91  }
92 
93  for (auto node: bn.nodes()) {
94  const auto& var = bn.variable(node);
96 
97  for (Idx i = 0; i < var.domainSize(); i++) {
98  std::stringstream stri; //= bn.variable(iter).name()+"_"+
99  // bn.variable(iter).label( i ) ;
100  stri << var.name() << "_" << var.label(i);
101  str0 << vartable[stri.str()] << " ";
102 
103  for (Idx j = i + 1; j < var.domainSize(); j++) {
105  strj << var.name() << "_" << var.label(j);
106  str1 << "-" << vartable[stri.str()] << " -" << vartable[strj.str()] << " 0\n";
107  clause++;
108  }
109  }
110 
111  str0 << "0\n";
112  clause++;
113  clausstr << str0.str() << str1.str();
114  const Potential< GUM_SCALAR >& cpt = bn.cpt(node);
116 
117  for (inst.setFirst(); !inst.end(); ++inst) {
118  for (Idx i = 0; i < inst.nbrDim(); i++) {
120  str << inst.variable(i).name() << "_" << inst.val(inst.variable(i));
121  str2 << "-" << vartable[str.str()] << " ";
122  str3 << "-" << protable[inst.toString()] << " " << vartable[str.str()] << " 0\n";
123  clause++;
124  }
125 
126  str2 << protable[inst.toString()] << " 0\n";
127  clause++;
128  }
129 
130  clausstr << str2.str() << str3.str();
131  }
132 
133  output << "p cnf " << num + numparam << " " << clause << "\n" << clausstr.str() << std::endl;
134  output.flush();
135  }
136 
137  // Writes a Bayesian network in the referenced file using the BN format.
138  // If the file doesn't exists, it is created.
139  // If the file exists, it's content will be erased.
140  //
141  // @param filePath The path to the file used to write the Bayesian network.
142  // @param bn The Bayesian network writed in the file.
143  // @throws Raised if an I/O error occurs.
144  template < typename GUM_SCALAR, template < class > class IApproximationPolicy >
146  const std::string& filePath,
147  const IBayesNet< GUM_SCALAR >& bn) {
149  std::ofstream outputvar((filePath + ".var").c_str(), std::ios_base::trunc);
150 
151  if (!output.good()) GUM_ERROR(IOError, "Stream states flags are not all unset.")
152 
154 
155  if (!outputvar.good()) GUM_ERROR(IOError, "Stream states flags are not all unset.")
156 
157  Idx num = 0;
158  Idx numparam = 0;
159 
160  for (auto node: bn.nodes())
162 
163  Idx clause = 0;
165  gum::HashTable< std::string, Idx > vartable; // key name::label val num;
167 
168  for (auto node: bn.nodes()) {
169  const auto& var = bn.variable(node);
170 
171  for (Idx i = 0; i < var.domainSize(); i++) {
173  str << var.name() << "_" << var.label(i);
174  vartable.insert(str.str(), ++num);
175  strfile << num << "::" << str.str() << "\n";
176  }
177 
178  const Potential< GUM_SCALAR >& cpt = bn.cpt(node);
179 
181 
182  for (inst.setFirst(); !inst.end(); ++inst) {
184  strinst << inst.toString();
185  strinst << "_val=" << this->fromExact(cpt[inst]);
186 
188  strfile2 << numparam << "::" << strinst.str() << "\n";
189  }
190  }
191 
192  for (auto node: bn.nodes()) {
193  const auto& var = bn.variable(node);
195 
196  for (Idx i = 0; i < var.domainSize(); i++) {
197  std::stringstream stri; //= bn.variable(iter).name()+"_"+
198  // bn.variable(iter).label( i ) ;
199  stri << var.name() << "_" << var.label(i);
200  str0 << vartable[stri.str()] << " ";
201 
202  for (Idx j = i + 1; j < var.domainSize(); j++) {
204  strj << var.name() << "_" << var.label(j);
205  str1 << "-" << vartable[stri.str()] << " -" << vartable[strj.str()] << " 0\n";
206  clause++;
207  }
208  }
209 
210  str0 << "0\n";
211  clause++;
212  clausstr << str0.str() << str1.str();
213  const Potential< GUM_SCALAR >& cpt = bn.cpt(node);
215 
216  for (inst.setFirst(); !inst.end(); ++inst) {
217  for (Idx i = 0; i < inst.nbrDim(); i++) {
219  str << inst.variable(i).name() << "_" << inst.val(inst.variable(i));
220  str2 << "-" << vartable[str.str()] << " ";
221  str3 << "-" << protable[inst.toString()] << " " << vartable[str.str()] << " 0\n";
222  clause++;
223  }
224 
225  str2 << protable[inst.toString()] << " 0\n";
226  clause++;
227  }
228 
229  clausstr << str2.str() << str3.str();
230  }
231 
232  output << "p cnf " << num + numparam << " " << clause << "\n" << clausstr.str() << std::endl;
233  output.flush();
234  outputvar << strfile.str() << strfile2.str();
235  outputvar.flush();
236  outputvar.close();
237  output.close();
238 
239  if (outputvar.fail()) GUM_ERROR(IOError, "Writting in the ostream failed.")
240 
241  if (output.fail()) GUM_ERROR(IOError, "Writting in the ostream failed.")
242  }
243 
244  // Returns a bloc defining a variable's CPT in the BN format.
245  /*template<typename GUM_SCALAR, template<class> class IApproximationPolicy >
246  INLINE
247  std::string
248  CNFWriter<GUM_SCALAR>:: _variableCPT_( const Potential<GUM_SCALAR>& cpt ) {
249  std::stringstream str;
250  str << "";
251  return str.str();
252  }
253 
254  // Returns the header of the BN file.
255  template<typename GUM_SCALAR,> INLINE
256  std::string
257  CNFWriter<GUM_SCALAR>:: _header_( const IBayesNet<GUM_SCALAR>& ) {
258  std::stringstream str;
259  str << "";
260  return str.str();
261  }
262 
263  // Returns a bloc defining a variable in the BN format.
264  template<typename GUM_SCALAR> INLINE
265  std::string
266  CNFWriter<GUM_SCALAR>:: _variableBloc_( const DiscreteVariable& var ) {
267  std::stringstream str;
268  str << "" ;
269  return str.str();
270  }*/
271 
272  // Returns the modalities labels of the variables in varsSeq
273 
274 } /* namespace gum */
275 
276 #endif // DOXYGEN_SHOULD_SKIP_THIS
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643