00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 #ifndef NETLOADER_H
00019 #define NETLOADER_H
00020 
00021 using namespace std;
00022 #include <amygdala/types.h>
00023 #if GCC_VERSION >= 30000
00024     #include <ext/hash_map>
00025 #else
00026     #include <hash_map>
00027 #endif
00028 #include <string>
00029 #include <strings.h>
00030 #include <stdio.h>
00031 
00032 
00033 #include <amygdala/neuron.h>
00034 
00035 class Layer;
00036 
00037 class NeuronFactoryBase {
00038 public:
00039     NeuronFactoryBase() {}
00040     virtual Neuron * NewNeuron(AmIdInt id) = 0;
00041     virtual string GetType() = 0;
00042 };
00043 
00051 template<class neuron>
00052 class NeuronFactory : public NeuronFactoryBase {
00053 public:
00054     NeuronFactory(){
00055     }
00056     virtual ~NeuronFactory(){}
00057 
00058     virtual Neuron * NewNeuron(AmIdInt id){
00059         neuron *n = new neuron(id);
00060         return n;
00061     }
00063     virtual string GetType() {
00064         
00065         
00066         neuron n(0);
00067         return n.ClassId();
00068     }
00069 };
00070 
00071 
00082 class NetLoader {
00083 public:
00084     NetLoader(Network *_net);
00085     ~NetLoader();
00087     void RegisterNeuronClass(NeuronFactoryBase *factory);
00090     void LoadXML(const char *filename);
00093     void SaveXML(string filename);
00095     Layer* BuildLayer(int size, int startNrnId, LayerConstants layerConst, string neuronType);
00096 
00098     void SAXStartElement1(const char *name, const char **attrs);
00100     void SAXEndElement1(const char *name);
00101 
00103     void SAXStartElement2(const char *name, const char **attrs);
00105     void SAXEndElement2(const char *name);
00107     void SAXError();
00108 
00109 protected: 
00110     struct eqstr {
00111         bool operator()(const char* s1, const char* s2) const {
00112             return strcmp(s1, s2) == 0;
00113         }
00114     };
00117     hash_map <const char*, NeuronFactoryBase*, hash<const char*>, eqstr > registry;
00118 
00120     Network* net;
00121     Layer *currLayer;
00122     AmIdInt currNeuron;
00123     unsigned int saxErrors;
00124 
00125 private: 
00127     NetLoader();
00128 
00129 
00130 protected: 
00132     void WriteSynapses(FILE *netFile, Neuron* preNrn);
00134     void SaveLayers(FILE *netFile);
00136     string LayerTypeStr(LayerType lType);
00139     void SAXPass(const char* filename, int pass);
00140 
00141 
00142     void ParseLayerConstants(LayerConstants *layerConst, char **name, const char **attrs);
00143 };
00144 
00145 #endif