aGrUM  0.14.2
O3prmBNReader_tpl.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2005 by Christophe GONZALES and Pierre-Henri WUILLEMIN *
3  * {prenom.nom}_at_lip6.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
27 // to ease Parser
29 
30 namespace gum {
31  template < typename GUM_SCALAR >
32  INLINE std::string
34  const std::string& type,
35  const std::string& name,
36  const std::string& toRemove) {
37  auto res = path + name; // path ends up with a "."
38  if (toRemove != "") {
39  if (res.substr(0, toRemove.size()) == toRemove) {
40  res = res.substr(toRemove.size());
41  }
42  }
43  return res;
44  }
45 
46  template < typename GUM_SCALAR >
47  std::string
48  O3prmBNReader< GUM_SCALAR >::__getInstanceName(const std::string& classname) {
49  auto res = classname.substr(0, 4);
50  std::transform(res.begin(), res.end(), res.begin(), ::tolower);
51  return res;
52  }
53 
54  template < typename GUM_SCALAR >
55  std::string
56  O3prmBNReader< GUM_SCALAR >::__getEntityName(const std::string& filename) {
57  auto b = filename.find_last_of("/\\");
58  auto e = filename.find_last_of(".") - 1;
59  GUM_ASSERT(e > b); // we are waiting ../../basename.o3prm
60  return filename.substr(b + 1, e - b);
61  }
62 
63  template < typename GUM_SCALAR >
65  const std::string& filename,
66  const std::string& entityName,
67  const std::string& classpath) :
68  BNReader< GUM_SCALAR >(bn, filename) {
69  GUM_CONSTRUCTOR(O3prmBNReader);
70  __bn = bn;
71  __filename = filename;
72  __entityName = entityName == "" ? __getEntityName(filename) : entityName;
73  __classpath = classpath;
74  }
75 
76  template < typename GUM_SCALAR >
78  GUM_DESTRUCTOR(O3prmBNReader);
79  }
80 
84  template < typename GUM_SCALAR >
87  if (__classpath != "") { reader.addClassPath(__classpath); }
88  reader.readFile(__filename);
89  gum::prm::PRM< GUM_SCALAR >* prm = reader.prm();
90  __errors = reader.errorsContainer();
91 
92 
93  if (errors() == 0) {
94  std::string instanceName = "";
95  if (prm->isSystem(__entityName)) {
97  } else {
98  if (prm->isClass(__entityName)) {
99  ParseError warn(
100  false,
101  "No system '" + __entityName
102  + "' found but class found. Generating unnamed instance.",
103  __filename,
104  0);
105  __errors.add(warn);
107  instanceName = __getInstanceName(__entityName);
109  instanceName, prm->getClass(__entityName));
110  s.add(i);
111  __generateBN(s);
112  instanceName += "."; // to be removed in __getVariableName
113  } else {
114  ParseError err(true,
115  "Neither system nor class '" + __entityName + "'.",
116  __filename,
117  0);
118  __errors.add(err);
119  }
120  }
121 
122  // renaming variables in th BN
123 
125  for (auto node : __bn->nodes()) {
126  // keeping the complete name in description
127  const std::string& nn = __bn->variable(node).name();
128  __bn->variable(node).setDescription(nn);
129 
130  // trying to simplify the
131  auto start = nn.find_first_of('(');
132  auto end = nn.find_first_of(')');
133  if (0 < start && start < end && end < nn.size()) {
134  auto path = nn.substr(0, start);
135  auto type = nn.substr(start + 1, end - start - 1);
136  auto name = nn.substr(end + 1, std::string::npos);
137 
138  std::string newNameRadical =
139  __getVariableName(path, type, name, instanceName);
140 
141  std::string newName = newNameRadical;
142  // forcing newName to be unique
143  int num = 0;
144  while (names.contains(newName)) {
145  newName = newNameRadical + std::to_string(++num);
146  }
147 
148  names.insert(newName);
149  __bn->changeVariableName(node, newName);
150  } else {
151  ParseError warn(
152  false, "Name " + nn + " cannot be simplified.", __filename, 0);
153  __errors.add(warn);
154  }
155  }
156  }
157 
158  delete prm;
159 
160  return errors();
161  }
162 
163 
164  template < typename GUM_SCALAR >
167  system.instantiate();
169  system.groundedBN(factory);
170  }
171 } // namespace gum
bool contains(const Key &k) const
Indicates whether a given elements belong to the set.
Definition: set_tpl.h:578
Class representing a Bayesian Network.
Definition: BayesNet.h:76
bool isClass(const std::string &name) const
Definition: PRM_tpl.h:76
std::string __entityName
static std::string __getEntityName(const std::string &filename)
Size readFile(const std::string &file, const std::string &module="")
Read file and load its content using a PRMFactory. The package parameter set the file&#39;s content packa...
Inline implementation of O3prBNmReader : reader for BN using o3prm syntaxt.
static std::string __getVariableName(const std::string &path, const std::string &type, const std::string &name, const std::string &toRemove="")
std::string __filename
An PRMInstance is a Bayesian Network fragment defined by a Class and used in a PRMSystem.
Definition: PRMInstance.h:60
gum::prm::PRM< GUM_SCALAR > * prm()
Definition: O3prmReader.h:108
This class is used to represent parsing errors for the different parser implemented in aGrUM...
ErrorsContainer __errors
O3prmBNReader(BayesNet< GUM_SCALAR > *bn, const std::string &filename, const std::string &entityName="", const std::string &classPath="")
const ErrorsContainer & errorsContainer() const
publishing Errors API
void add(ParseError error)
Add an error object to the container.
gum is the global namespace for all aGrUM entities
Definition: agrum.h:25
Pure virtual class for reading a BN from a file.
Definition: BNReader.h:52
This class read O3PRM files and creates the corresponding gum::prm::PRM.
Definition: O3prmReader.h:67
void __generateBN(prm::PRMSystem< GUM_SCALAR > &system)
NodeId add(PRMInstance< GUM_SCALAR > *i)
Add an PRMInstance to this system.
Definition: PRMSystem_tpl.h:56
std::string to_string(const Formula &f)
Definition: formula_inl.h:479
std::string __classpath
void groundedBN(BayesNetFactory< GUM_SCALAR > &factory) const
Returns the grounded Bayesian Network of this system.
Definition: PRMSystem_tpl.h:79
bool isSystem(const std::string &name) const
Definition: PRM_tpl.h:86
PRMSystem< GUM_SCALAR > & getSystem(const std::string &name)
Returns a constant reference on a PRMSystem<GUM_SCALAR> given it&#39;s name.
Definition: PRM_tpl.h:143
A PRMSystem is a container of PRMInstance and describe a relational skeleton.
Definition: PRMObject.h:226
static std::string __getInstanceName(const std::string &classname)
void instantiate()
Instantiate all the PRMInstance in this PRMSystem.
void addClassPath(const std::string &class_path)
Add a list of paths to look for o3prm files.
This class represents a Probabilistic Relational PRMSystem<GUM_SCALAR>.
Definition: PRM.h:63
PRMClass< GUM_SCALAR > & getClass(const std::string &name)
Returns a constant reference on a Class<GUM_SCALAR> given it&#39;s name.
Definition: PRM_tpl.h:107
Size errors()
publishing Errors API
Definition: O3prmBNReader.h:72
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:45
void insert(const Key &k)
Inserts a new element into the set.
Definition: set_tpl.h:610
Read an O3PRM and transform the gum::prm::PRMSystem into gum::BayesNet.
Definition: O3prmBNReader.h:54
Size proceed()
parse the file
A factory class to ease BayesNet construction.
Definition: BayesNet.h:43
BayesNet< GUM_SCALAR > * __bn