Paradiseo-eo sources added
git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@40 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
parent
bc1f453978
commit
c3aec878e5
3609 changed files with 342772 additions and 0 deletions
472
trunk/paradiseo-eo/doc/html/mlp_8h-source.html
Normal file
472
trunk/paradiseo-eo/doc/html/mlp_8h-source.html
Normal file
|
|
@ -0,0 +1,472 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
||||
<title>EO: mlp.h Source File</title>
|
||||
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
||||
</head><body>
|
||||
<!-- Generated by Doxygen 1.3.9.1 -->
|
||||
<div class="qindex"> <form class="search" action="search.php" method="get">
|
||||
<a class="qindex" href="main.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="pages.html">Related Pages</a> | <span class="search"><u>S</u>earch for <input class="search" type="text" name="query" value="" size="20" accesskey="s"/></span></form></div>
|
||||
<div class="nav">
|
||||
<a class="el" href="dir_000020.html">app</a> / <a class="el" href="dir_000023.html">gprop</a></div>
|
||||
<h1>mlp.h</h1><div class="fragment"><pre class="fragment">00001 <span class="comment">//-----------------------------------------------------------------------------</span>
|
||||
00002 <span class="comment">// mlp.h</span>
|
||||
00003 <span class="comment">//-----------------------------------------------------------------------------</span>
|
||||
00004
|
||||
00005 <span class="preprocessor">#ifndef mlp_h</span>
|
||||
00006 <span class="preprocessor"></span><span class="preprocessor">#define mlp_h</span>
|
||||
00007 <span class="preprocessor"></span>
|
||||
00008 <span class="preprocessor">#include <algorithm></span> <span class="comment">// generate</span>
|
||||
00009 <span class="preprocessor">#include <cmath></span> <span class="comment">// exp</span>
|
||||
00010 <span class="preprocessor">#include <iostream></span>
|
||||
00011 <span class="preprocessor">#include <iterator></span>
|
||||
00012 <span class="preprocessor">#include <numeric></span>
|
||||
00013 <span class="preprocessor">#include <stdexcept></span> <span class="comment">// invalid_argument</span>
|
||||
00014 <span class="preprocessor">#include <utility></span>
|
||||
00015 <span class="preprocessor">#include <vector></span>
|
||||
00016 <span class="preprocessor">#include <utils/eoRNG.h></span> <span class="comment">// eoRng</span>
|
||||
00017 <span class="preprocessor">#include <utils/rnd_generators.h></span> <span class="comment">// normal_generator</span>
|
||||
00018 <span class="preprocessor">#include <vecop.h></span> <span class="comment">// *</span>
|
||||
00019
|
||||
00020
|
||||
00021
|
||||
00022
|
||||
00023 <span class="keyword">namespace </span>mlp
|
||||
00024 {
|
||||
00025 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
|
||||
00026
|
||||
00027 <span class="keyword">typedef</span> <span class="keywordtype">double</span> real;
|
||||
00028 <span class="keyword">typedef</span> std::vector<real> vector;
|
||||
00029 }
|
||||
00030
|
||||
00031
|
||||
00032 <span class="keyword">namespace </span>std {
|
||||
00033 ostream& operator<<(ostream& os, <span class="keyword">const</span> mlp::vector& v)
|
||||
00034 {
|
||||
00035 ostream_iterator<mlp::real> oi(os, <span class="stringliteral">" "</span>);
|
||||
00036 copy(v.begin(), v.end(), oi);
|
||||
00037 <span class="keywordflow">return</span> os;
|
||||
00038 }
|
||||
00039
|
||||
00040 istream& operator>>(istream& is, mlp::vector& v)
|
||||
00041 {
|
||||
00042 <span class="keywordflow">for</span> (mlp::vector::iterator vi = v.begin() ; vi != v.end() ; vi++) {
|
||||
00043 is >> *vi;
|
||||
00044 }
|
||||
00045 <span class="keywordflow">return</span> is;
|
||||
00046 }
|
||||
00047 }
|
||||
00048
|
||||
00049 <span class="keyword">namespace </span>mlp
|
||||
00050 {
|
||||
00051 <span class="keyword">using</span> <span class="keyword">namespace </span>std;
|
||||
00052
|
||||
00053 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00054 <span class="comment">// useful typedefs</span>
|
||||
00055 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00056
|
||||
00057
|
||||
00058 <span class="keyword">const</span> real max_real = std::numeric_limits<real>::max();
|
||||
00059 <span class="keyword">const</span> real min_real = std::numeric_limits<real>::min();
|
||||
00060
|
||||
00061
|
||||
00062 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00063 <span class="comment">// sigmoid</span>
|
||||
00064 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00065
|
||||
00066 real sigmoid(<span class="keyword">const</span> real& x)
|
||||
00067 {
|
||||
00068 <span class="keywordflow">return</span> 1.0 / (1.0 + exp(-x));
|
||||
00069 }
|
||||
00070
|
||||
00071
|
||||
00072 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00073 <span class="comment">// neuron</span>
|
||||
00074 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00075
|
||||
00076 <span class="keyword">struct </span>neuron
|
||||
00077 {
|
||||
00078 real bias;
|
||||
00079 vector weight;
|
||||
00080
|
||||
00081 neuron(<span class="keyword">const</span> <span class="keywordtype">unsigned</span>& num_inputs = 0): weight(num_inputs) {}
|
||||
00082
|
||||
00083 <span class="keywordtype">void</span> reset()
|
||||
00084 {
|
||||
00085 <a class="code" href="classnormal__generator.html">normal_generator<real></a> rnd(1.0);
|
||||
00086 bias = rnd();
|
||||
00087 generate(weight.begin(), weight.end(), rnd);
|
||||
00088 }
|
||||
00089
|
||||
00090 real operator()(<span class="keyword">const</span> vector& input)<span class="keyword"> const</span>
|
||||
00091 <span class="keyword"> </span>{
|
||||
00092 <span class="keywordflow">return</span> sigmoid(bias + weight * input);
|
||||
00093 }
|
||||
00094
|
||||
00095 <span class="keywordtype">unsigned</span> length()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> weight.size() + 1; }
|
||||
00096
|
||||
00097 <span class="keywordtype">void</span> normalize()
|
||||
00098 {
|
||||
00099 real n = sqrt(bias * bias + weight * weight);
|
||||
00100 bias /= n;
|
||||
00101 weight /= n;
|
||||
00102 }
|
||||
00103
|
||||
00104 <span class="keywordtype">void</span> desaturate()
|
||||
00105 {
|
||||
00106 bias = -5.0 + 10.0 / (1.0 + exp(bias / -5.0));
|
||||
00107
|
||||
00108 <span class="keywordflow">for</span> (vector::iterator w = weight.begin(); w != weight.end(); ++w)
|
||||
00109 *w = -5.0 + 10.0 / (1.0 + exp(*w / -5.0));
|
||||
00110 }
|
||||
00111
|
||||
00112 <span class="keywordtype">void</span> perturb_num(<span class="keywordtype">double</span> &num, <span class="keywordtype">double</span> magnitude) {
|
||||
00113 <span class="keywordtype">double</span> scale = max(num, 0.05) * magnitude;
|
||||
00114 <span class="keywordtype">double</span> perturbation = scale * (drand48() - 0.5);
|
||||
00115 num += perturbation;
|
||||
00116 }
|
||||
00117
|
||||
00118 <span class="keywordtype">void</span> perturb(<span class="keywordtype">double</span> magnitude = 0.3, <span class="keywordtype">double</span> probability = 1.0)
|
||||
00119 {
|
||||
00120
|
||||
00121 <span class="keywordflow">for</span> (vector::iterator w = weight.begin(); w != weight.end(); ++w)
|
||||
00122 <span class="keywordflow">if</span> ( probability >= 1.0 || drand48() < probability)
|
||||
00123 perturb_num(*w, magnitude);
|
||||
00124 <span class="keywordflow">if</span> ( probability >= 1.0 || drand48() < probability)
|
||||
00125 perturb_num(bias, magnitude);
|
||||
00126 }
|
||||
00127 };
|
||||
00128 }
|
||||
00129
|
||||
00130 <span class="keyword">namespace </span>std {
|
||||
00131
|
||||
00132 ostream& operator<<(ostream& os, <span class="keyword">const</span> mlp::neuron& n)
|
||||
00133 {
|
||||
00134 <span class="keywordflow">return</span> os << n.bias << <span class="stringliteral">" "</span> << n.weight;
|
||||
00135 }
|
||||
00136
|
||||
00137 istream& operator>>(istream& is, mlp::neuron& n)
|
||||
00138 {
|
||||
00139 <span class="keywordflow">return</span> is >> n.bias >> n.weight;
|
||||
00140 }
|
||||
00141
|
||||
00142 }
|
||||
00143
|
||||
00144 <span class="keyword">namespace </span>mlp {
|
||||
00145
|
||||
00146 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00147 <span class="comment">// layer</span>
|
||||
00148 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00149
|
||||
00150 <span class="keyword">class </span>layer: <span class="keyword">public</span> std::vector<neuron>
|
||||
00151 {
|
||||
00152 <span class="keyword">public</span>:
|
||||
00153 layer(<span class="keyword">const</span> <span class="keywordtype">unsigned</span>& num_inputs = 0, <span class="keyword">const</span> <span class="keywordtype">unsigned</span>& num_neurons = 0):
|
||||
00154 std::vector<neuron>(num_neurons, neuron(num_inputs)) {}
|
||||
00155
|
||||
00156 <span class="keywordtype">void</span> reset()
|
||||
00157 {
|
||||
00158 <a class="code" href="classnormal__generator.html">normal_generator<real></a> rnd(1.0);
|
||||
00159 <span class="keywordflow">for</span>(iterator n = begin(); n != end(); ++n)
|
||||
00160 n->reset();
|
||||
00161 }
|
||||
00162
|
||||
00163 vector operator()(<span class="keyword">const</span> vector& input)<span class="keyword"> const</span>
|
||||
00164 <span class="keyword"> </span>{
|
||||
00165 vector output(size());
|
||||
00166
|
||||
00167 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> i = 0; i < output.size(); ++i)
|
||||
00168 output[i] = (*this)[i](input);
|
||||
00169
|
||||
00170 <span class="keywordflow">return</span> output;
|
||||
00171 }
|
||||
00172
|
||||
00173 <span class="keywordtype">unsigned</span> length()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> front().length() * size(); }
|
||||
00174
|
||||
00175 <span class="keywordtype">void</span> normalize()
|
||||
00176 {
|
||||
00177 <span class="keywordflow">for</span>(iterator n = begin(); n != end(); ++n)
|
||||
00178 n->normalize();
|
||||
00179 }
|
||||
00180
|
||||
00181 <span class="keywordtype">void</span> desaturate()
|
||||
00182 {
|
||||
00183 <span class="keywordflow">for</span>(iterator n = begin(); n != end(); ++n)
|
||||
00184 n->desaturate();
|
||||
00185 }
|
||||
00186
|
||||
00187 <span class="keywordtype">void</span> perturb(<span class="keywordtype">double</span> magnitude = 0.3, <span class="keywordtype">double</span> probability = 1.0)
|
||||
00188 {
|
||||
00189 <span class="keywordflow">for</span>(iterator n = begin(); n != end(); ++n)
|
||||
00190 n->perturb();
|
||||
00191 }
|
||||
00192
|
||||
00193 };
|
||||
00194
|
||||
00195 }
|
||||
00196
|
||||
00197 <span class="keyword">namespace </span>std {
|
||||
00198
|
||||
00199 ostream& operator<<(ostream& os, <span class="keyword">const</span> mlp::layer& l)
|
||||
00200 {
|
||||
00201 ostream_iterator<mlp::neuron> oi(os, <span class="stringliteral">" "</span>);
|
||||
00202 copy(l.begin(), l.end(), oi);
|
||||
00203 <span class="keywordflow">return</span> os;
|
||||
00204 }
|
||||
00205
|
||||
00206 istream& operator>>(istream& is, mlp::layer& l)
|
||||
00207 {
|
||||
00208 <span class="keywordflow">for</span> (mlp::layer::iterator li = l.begin() ; li != l.end() ; li++) {
|
||||
00209 is >> *li;
|
||||
00210 }
|
||||
00211 <span class="keywordflow">return</span> is;
|
||||
00212 }
|
||||
00213
|
||||
00214 }
|
||||
00215
|
||||
00216 <span class="keyword">namespace </span>mlp {
|
||||
00217
|
||||
00218
|
||||
00219 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00220 <span class="comment">// net</span>
|
||||
00221 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00222
|
||||
00223 <span class="keyword">class </span>net: <span class="keyword">public</span> std::vector<layer>
|
||||
00224 {
|
||||
00225 <span class="keyword">public</span>:
|
||||
00226 net(<span class="keyword">const</span> <span class="keywordtype">unsigned</span>& num_inputs = 0,
|
||||
00227 <span class="keyword">const</span> <span class="keywordtype">unsigned</span>& num_outputs = 0,
|
||||
00228 <span class="keyword">const</span> std::vector<unsigned>& hidden = std::vector<unsigned>())
|
||||
00229 {
|
||||
00230 init(num_inputs,num_outputs,hidden);
|
||||
00231 }
|
||||
00232
|
||||
00233
|
||||
00234 net(istream &is) {
|
||||
00235 load(is);
|
||||
00236 }
|
||||
00237
|
||||
00239 <span class="keyword">virtual</span> ~net() {};
|
||||
00240
|
||||
00241 <span class="keywordtype">void</span> load(istream &is) {
|
||||
00242 <span class="keywordtype">unsigned</span> num_inputs;
|
||||
00243 <span class="keywordtype">unsigned</span> num_outputs;
|
||||
00244 <span class="keywordtype">unsigned</span> num_hidden_layers;
|
||||
00245
|
||||
00246 is >> num_inputs >> num_outputs >> num_hidden_layers;
|
||||
00247
|
||||
00248 std::vector<unsigned> layer_sizes;
|
||||
00249 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0; i<num_hidden_layers;i++) {
|
||||
00250 <span class="keywordtype">unsigned</span> layer_size;
|
||||
00251 is >> layer_size;
|
||||
00252 layer_sizes.push_back(layer_size);
|
||||
00253 }
|
||||
00254 <span class="keywordtype">unsigned</span> check_outputs;
|
||||
00255 is >> check_outputs;
|
||||
00256 assert (check_outputs == num_outputs);
|
||||
00257 init (num_inputs,num_outputs,layer_sizes);
|
||||
00258 <span class="comment">// skip forward to pass up opening '<' char</span>
|
||||
00259 <span class="keywordtype">char</span> c=<span class="charliteral">' '</span>;
|
||||
00260 <span class="keywordflow">while</span> (c!=<span class="charliteral">'<'</span> && !is.eof()) { is >> c;}
|
||||
00261 <span class="keywordflow">for</span> (iterator l =begin() ; l != end(); l++) {
|
||||
00262 is >> *l;
|
||||
00263 }
|
||||
00264 <span class="keywordflow">do</span> { is >> c; } <span class="keywordflow">while</span> (c == <span class="charliteral">' '</span> && !is.eof());
|
||||
00265 assert(c == <span class="charliteral">'>'</span>);
|
||||
00266 }
|
||||
00267
|
||||
00268 <span class="keywordtype">void</span> init( <span class="keywordtype">unsigned</span> num_inputs,
|
||||
00269 <span class="keywordtype">unsigned</span> num_outputs,
|
||||
00270 <span class="keyword">const</span> std::vector<unsigned>& hidden ) {
|
||||
00271 clear();
|
||||
00272 <span class="keywordflow">switch</span>(hidden.size())
|
||||
00273 {
|
||||
00274 <span class="keywordflow">case</span> 0:
|
||||
00275 push_back(layer(num_inputs, num_outputs));
|
||||
00276 <span class="keywordflow">break</span>;
|
||||
00277 <span class="keywordflow">default</span>:
|
||||
00278 push_back(layer(num_inputs, hidden.front()));
|
||||
00279 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < hidden.size() - 1; ++i)
|
||||
00280 push_back(layer(hidden[i], hidden[i + 1]));
|
||||
00281 push_back(layer(hidden.back(), num_outputs));
|
||||
00282 <span class="keywordflow">break</span>;
|
||||
00283 }
|
||||
00284 }
|
||||
00285
|
||||
00286 <span class="keywordtype">void</span> reset()
|
||||
00287 {
|
||||
00288 <a class="code" href="classnormal__generator.html">normal_generator<real></a> rnd(1.0);
|
||||
00289 <span class="keywordflow">for</span>(iterator l = begin(); l != end(); ++l)
|
||||
00290 l->reset();
|
||||
00291 }
|
||||
00292
|
||||
00293 <span class="keyword">virtual</span> vector operator()(<span class="keyword">const</span> vector& input) <span class="keyword">const </span>;
|
||||
00294
|
||||
00295 <span class="keywordtype">unsigned</span> winner(<span class="keyword">const</span> vector& input)<span class="keyword"> const</span>
|
||||
00296 <span class="keyword"> </span>{
|
||||
00297 vector tmp = (*this)(input);
|
||||
00298 <span class="keywordflow">return</span> (max_element(tmp.begin(), tmp.end()) - tmp.begin());
|
||||
00299 }
|
||||
00300
|
||||
00301 <span class="keywordtype">void</span> save(ostream &os)<span class="keyword"> const </span>{
|
||||
00302 <span class="comment">// Save the number of inputs, number of outputs, and number of hidden layers</span>
|
||||
00303 os << num_inputs() << <span class="stringliteral">"\n"</span> << num_outputs() << <span class="stringliteral">"\n"</span> << num_hidden_layers() << <span class="stringliteral">"\n"</span>;
|
||||
00304 <span class="keywordflow">for</span>(const_iterator l = begin(); l != end(); ++l)
|
||||
00305 os << l->size() << <span class="stringliteral">" "</span>;
|
||||
00306 os << <span class="stringliteral">"\n"</span>;
|
||||
00307 os << *<span class="keyword">this</span>;
|
||||
00308 os << <span class="stringliteral">"\n"</span>;
|
||||
00309 }
|
||||
00310
|
||||
00311 <span class="keywordtype">unsigned</span> num_inputs()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> front().front().length() - 1; }
|
||||
00312 <span class="keywordtype">unsigned</span> num_outputs()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> back().size(); }
|
||||
00313 <span class="keywordtype">unsigned</span> num_hidden_layers()<span class="keyword"> const </span>{
|
||||
00314 <span class="keywordtype">signed</span> s = (signed) size() -1;
|
||||
00315 <span class="keywordflow">return</span> (s<0) ? 0 : s ;
|
||||
00316 }
|
||||
00317
|
||||
00318
|
||||
00319 <span class="keywordtype">unsigned</span> length()
|
||||
00320 {
|
||||
00321 <span class="keywordtype">unsigned</span> sum = 0;
|
||||
00322
|
||||
00323 <span class="keywordflow">for</span>(iterator l = begin(); l != end(); ++l)
|
||||
00324 sum += l->length();
|
||||
00325
|
||||
00326 <span class="keywordflow">return</span> sum;
|
||||
00327 }
|
||||
00328
|
||||
00329 <span class="keywordtype">void</span> normalize()
|
||||
00330 {
|
||||
00331 <span class="keywordflow">for</span>(iterator l = begin(); l != end(); ++l)
|
||||
00332 l->normalize();
|
||||
00333 }
|
||||
00334
|
||||
00335 <span class="keywordtype">void</span> desaturate()
|
||||
00336 {
|
||||
00337 <span class="keywordflow">for</span>(iterator l = begin(); l != end(); ++l)
|
||||
00338 l->desaturate();
|
||||
00339 }
|
||||
00340
|
||||
00341 <span class="keywordtype">void</span> perturb(<span class="keywordtype">double</span> magnitude = 0.3, <span class="keywordtype">double</span> probability = 1.0)
|
||||
00342 {
|
||||
00343 <span class="keywordflow">for</span>(iterator l = begin(); l != end(); ++l)
|
||||
00344 l->perturb();
|
||||
00345 }
|
||||
00346 };
|
||||
00347
|
||||
00348 <span class="preprocessor">#ifndef NO_MLP_VIRTUALS</span>
|
||||
00349 <span class="preprocessor"></span> vector net::operator()(<span class="keyword">const</span> vector& input)<span class="keyword"> const</span>
|
||||
00350 <span class="keyword"> </span>{
|
||||
00351 vector tmp = input;
|
||||
00352
|
||||
00353 <span class="keywordflow">for</span>(const_iterator l = begin(); l != end(); ++l)
|
||||
00354 tmp = (*l)(tmp);
|
||||
00355
|
||||
00356 <span class="keywordflow">return</span> tmp;
|
||||
00357 }
|
||||
00358 <span class="preprocessor">#endif</span>
|
||||
00359 <span class="preprocessor"></span>
|
||||
00360
|
||||
00361 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00362 <span class="comment">// sample</span>
|
||||
00363 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00364
|
||||
00365 <span class="keyword">struct </span>sample
|
||||
00366 {
|
||||
00367 vector input, output;
|
||||
00368
|
||||
00369 sample(<span class="keywordtype">unsigned</span> input_size = 0, <span class="keywordtype">unsigned</span> output_size = 0):
|
||||
00370 input(input_size), output(output_size) {}
|
||||
00371 };
|
||||
00372
|
||||
00373 istream& operator>>(istream& is, sample& s)
|
||||
00374 {
|
||||
00375 <span class="keywordflow">return</span> is >> s.input >> s.output;
|
||||
00376 }
|
||||
00377
|
||||
00378 ostream& operator<<(ostream& os, <span class="keyword">const</span> sample& s)
|
||||
00379 {
|
||||
00380 <span class="keywordflow">return</span> os << s.input << <span class="stringliteral">" "</span> << s.output;
|
||||
00381 }
|
||||
00382
|
||||
00383
|
||||
00384 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00385 <span class="comment">// set</span>
|
||||
00386 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00387
|
||||
00388 <span class="keyword">class </span>set: <span class="keyword">public</span> std::vector<sample>
|
||||
00389 {
|
||||
00390 <span class="keyword">public</span>:
|
||||
00391 set(<span class="keywordtype">unsigned</span> input_size = 0, <span class="keywordtype">unsigned</span> output_size = 0,
|
||||
00392 <span class="keywordtype">unsigned</span> num_samples = 0):
|
||||
00393 std::vector<sample>(num_samples, sample(input_size, output_size)) {}
|
||||
00394
|
||||
00395 set(istream& is) : std::vector<sample>(0, sample(0, 0)) {
|
||||
00396 clear();
|
||||
00397 load(is);
|
||||
00398 }
|
||||
00399
|
||||
00400 <span class="keywordtype">void</span> load(istream &is) {
|
||||
00401 <span class="keywordtype">unsigned</span> input_size, output_size;
|
||||
00402 is >> input_size >> output_size;
|
||||
00403 sample samp(input_size, output_size);;
|
||||
00404 <span class="keywordflow">while</span> (is >> samp) { push_back(samp); }
|
||||
00405 }
|
||||
00406
|
||||
00407 <span class="keywordtype">void</span> save(ostream &os)<span class="keyword"> const </span>{
|
||||
00408 os << front().input.size() << <span class="stringliteral">" "</span> << front().output.size() << endl;
|
||||
00409 copy(begin(), end(), ostream_iterator<sample>(os,<span class="stringliteral">"\n"</span>));
|
||||
00410 }
|
||||
00411 };
|
||||
00412
|
||||
00413 ostream& operator<<(ostream& os, <span class="keyword">const</span> set& s)
|
||||
00414 {
|
||||
00415 os << <span class="stringliteral">"<"</span> << endl;
|
||||
00416 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i = 0; i < s.size(); ++i)
|
||||
00417 os << s[i] << endl;
|
||||
00418 <span class="keywordflow">return</span> os << <span class="stringliteral">">"</span>;
|
||||
00419 }
|
||||
00420
|
||||
00421 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00422 <span class="comment">// euclidean_distance</span>
|
||||
00423 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00424
|
||||
00425 real euclidean_distance(<span class="keyword">const</span> net& n1, <span class="keyword">const</span> net& n2)
|
||||
00426 {
|
||||
00427 real sum = 0;
|
||||
00428
|
||||
00429 <span class="keywordflow">for</span>(net::const_reverse_iterator l1 = n1.rbegin(), l2 = n2.rbegin();
|
||||
00430 l1 != n1.rend() && l2 != n2.rend(); ++l1, ++l2)
|
||||
00431 <span class="keywordflow">for</span>(layer::const_iterator n1 = l1->begin(), n2 = l2->begin();
|
||||
00432 n1 != l1->end() && n2 != l2->end(); ++n1, ++n2)
|
||||
00433 {
|
||||
00434 real b = n1->bias - n2->bias;
|
||||
00435 vector w = n1->weight - n2->weight;
|
||||
00436 sum += b * b + w * w;
|
||||
00437 }
|
||||
00438 <span class="comment">/*</span>
|
||||
00439 <span class="comment"> #include <fstream></span>
|
||||
00440 <span class="comment"> std::ofstream file("dist.stat", ios::app);</span>
|
||||
00441 <span class="comment"> file << sqrt(sum) << endl;</span>
|
||||
00442 <span class="comment"> */</span>
|
||||
00443 <span class="keywordflow">return</span> sqrt(sum);
|
||||
00444 }
|
||||
00445
|
||||
00446 <span class="comment">//---------------------------------------------------------------------------</span>
|
||||
00447
|
||||
00448 } <span class="comment">// namespace mlp</span>
|
||||
00449
|
||||
00450
|
||||
00451
|
||||
00452 <span class="preprocessor">#endif // mlp_h</span>
|
||||
00453 <span class="preprocessor"></span>
|
||||
00454
|
||||
00455 <span class="comment">// Local Variables:</span>
|
||||
00456 <span class="comment">// mode:C++</span>
|
||||
00457 <span class="comment">// c-file-style: "Stroustrup"</span>
|
||||
00458 <span class="comment">// End:</span>
|
||||
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Oct 19 05:06:41 2006 for EO by
|
||||
<a href="http://www.doxygen.org/index.html">
|
||||
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue