1 /* This file is part of libDAI - http://www.libdai.org/
3 * libDAI is licensed under the terms of the GNU General Public License version
4 * 2, or (at your option) any later version. libDAI is distributed without any
5 * warranty. See the file COPYING for more details.
7 * Copyright (C) 2006-2009 Joris Mooij [joris dot mooij at libdai dot org]
8 * Copyright (C) 2006-2007 Radboud University Nijmegen, The Netherlands
13 #include <dai/alldai.h>
14 #include <dai/properties.h>
15 #include <dai/exceptions.h>
24 InfAlg
*newInfAlg( const std::string
&name
, const FactorGraph
&fg
, const PropertySet
&opts
) {
25 if( name
== ExactInf::Name
)
26 return new ExactInf (fg
, opts
);
28 if( name
== BP::Name
)
29 return new BP (fg
, opts
);
32 if( name
== FBP::Name
)
33 return new FBP (fg
, opts
);
36 if( name
== TRWBP::Name
)
37 return new TRWBP (fg
, opts
);
40 if( name
== MF::Name
)
41 return new MF (fg
, opts
);
44 if( name
== HAK::Name
)
45 return new HAK (fg
, opts
);
48 if( name
== LC::Name
)
49 return new LC (fg
, opts
);
51 #ifdef DAI_WITH_TREEEP
52 if( name
== TreeEP::Name
)
53 return new TreeEP (fg
, opts
);
56 if( name
== JTree::Name
)
57 return new JTree (fg
, opts
);
60 if( name
== MR::Name
)
61 return new MR (fg
, opts
);
64 if( name
== Gibbs::Name
)
65 return new Gibbs (fg
, opts
);
68 if( name
== CBP::Name
)
69 return new CBP (fg
, opts
);
71 DAI_THROWE(UNKNOWN_DAI_ALGORITHM
,"Unknown libDAI algorithm: " + name
);
75 InfAlg
*newInfAlgFromString( const std::string
&nameOpts
, const FactorGraph
&fg
) {
76 string::size_type pos
= nameOpts
.find_first_of('[');
79 if( pos
== string::npos
) {
82 name
= nameOpts
.substr(0,pos
);
85 ss
<< nameOpts
.substr(pos
,nameOpts
.length());
88 return newInfAlg(name
,fg
,opts
);
92 std::pair
<std::string
, PropertySet
> parseNameProperties( const std::string
&s
) {
93 string::size_type pos
= s
.find_first_of('[');
96 if( pos
== string::npos
) {
99 name
= s
.substr(0,pos
);
102 ss
<< s
.substr(pos
,s
.length());
105 return make_pair(name
,opts
);
109 std::pair
<std::string
, PropertySet
> parseNameProperties( const std::string
&s
, const std::map
<std::string
,std::string
> &aliases
) {
110 // break string into method[properties]
111 pair
<string
,PropertySet
> ps
= parseNameProperties(s
);
114 // as long as 'method' is an alias, update:
115 while( aliases
.find(ps
.first
) != aliases
.end() && !looped
) {
116 string astr
= aliases
.find(ps
.first
)->second
;
117 pair
<string
,PropertySet
> aps
= parseNameProperties(astr
);
118 if( aps
.first
== ps
.first
)
120 // override aps properties by ps properties
121 aps
.second
.Set( ps
.second
);
124 // repeat until method name == alias name ('looped'), or
125 // there is no longer an alias 'method'
132 std::map
<std::string
,std::string
> readAliasesFile( const std::string
&filename
) {
134 map
<string
,string
> result
;
136 infile
.open( filename
.c_str() );
137 if( infile
.is_open() ) {
140 getline( infile
,line
);
143 if( (!line
.empty()) && (line
[0] != '#') ) {
144 string::size_type pos
= line
.find(':',0);
145 if( pos
== string::npos
)
146 DAI_THROWE(INVALID_ALIAS
,"Invalid alias '" + line
+ "'");
148 string::size_type posl
= line
.substr(0, pos
).find_last_not_of(" \t");
149 string key
= line
.substr(0, posl
+ 1);
150 string::size_type posr
= line
.substr(pos
+ 1, line
.length()).find_first_not_of(" \t");
151 string val
= line
.substr(pos
+ 1 + posr
, line
.length());
158 DAI_THROWE(CANNOT_READ_FILE
,"Error opening aliases file " + filename
);
163 } // end of namespace dai