00001 00005 #ifndef _PHYSICALMODEL_H_ 00006 #define _PHYSICALMODEL_H_ 00007 00008 #include <map> 00009 #include <string> 00010 #include "csimerror.h" 00011 #include "csimclass.h" 00012 #include "advanceable.h" 00013 #include "modelinput.h" 00014 #include "analogsynapse.h" 00015 #include "readout.h" 00016 00017 using namespace std; 00018 00020 class PhysicalModel : public Advancable { 00021 00022 public: 00026 PhysicalModel(int input_channels = 0, int output_channels = 0); 00027 00028 virtual ~PhysicalModel(void); 00029 00031 virtual int advance(void); 00032 00034 virtual int addIncoming(Advancable *Incoming) { 00035 return 0; 00036 } 00037 00040 virtual int addInput(Advancable *Incoming, char *inputname); 00041 00043 virtual int addOutgoing(Advancable *Outgoing) { 00044 return 0; 00045 } 00046 00049 virtual int addOutput(Advancable *Outgoing, char *outputname); 00050 00051 00056 virtual int transform(double** I, double* O) = 0; 00057 00059 virtual void reset() {}; 00060 00062 virtual int updateInternal(); 00063 00064 inline uint32 nInChannels(void) { return nIncoming; } 00065 inline uint32 nOutChannels(void) { return nOutputChannels; } 00066 inline uint32 nOutputs(int i) { return nOutgoing[i]; } 00067 uint32* getInputs(int index); 00068 uint32* getOutputs(int index); 00069 00071 const char* getInputChannelName(int index); 00072 const char* getOutputChannelName(int index); 00073 00074 protected: 00075 00079 int register_input_channel(const char *name); 00080 00084 int register_output_channel(const char *name); 00085 00087 Advancable **incoming; 00088 00090 int nIncoming; 00091 00093 int nIncomingAlloc; 00094 00096 AnalogSynapse ***outgoing; 00097 00099 int *nOutgoing; 00100 00102 int *nOutgoingAlloc; 00103 00105 int nOutputChannels; 00106 00108 map<string, int> input_channel_names; 00109 00111 map<string, int> output_channel_names; 00112 00113 private: 00115 double **inputs; 00116 00118 double *outputs; 00119 00121 int last_input_index; 00123 int last_output_index; 00124 }; 00125 00126 #endif