/***************************************************************************
* Interconnection.h *
* ------------------- *
* copyright : (C) 2009 by Jesus Garrido and Richard Carrillo *
* email : jgarrido@atc.ugr.es *
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef INTERCONNECTION_H_
#define INTERCONNECTION_H_
/*!
* \file Interconnection.h
*
* \author Jesus Garrido
* \author Richard Carrido
* \date August 2008
*
* This file declares a class which abstracts a spiking neural network connection.
*/
#include "../simulation/PrintableObject.h"
class Neuron;
class LearningRule;
class ConnectionState;
/*!
* \class Interconnection
*
* \brief Spiking neural network connection
*
* This class abstract the behaviour of a spiking neural network connection.
* It is composed by source and target neuron, an index, a connection delay...
*
* \author Jesus Garrido
* \author Richard Carrillo
* \date August 2008
*/
class Interconnection : public PrintableObject {
private:
/*!
* \brief The target neuron of the connection
*/
Neuron* target;
/*!
* \brief The source neuron of the connection
*/
Neuron* source;
/*!
* \brief The index of the connection in the network connections.
*/
long int index;
/*!
* \brief The delay of the spike propagation.
*/
double delay;
/*!
* \brief The synaptic weight of the connection.
*/
float weight;
/*!
* \brief The maximum weight of the connection.
*/
float maxweight;
/*!
* \brief The learning (or weight change) rule of the connection.
*/
LearningRule* wchange_withPost;
/*!
* \brief The learning (or weight change) rule of the connection.
*/
LearningRule* wchange_withoutPost;
/*!
* \brief The connection type (excitatory, inhibitory, electrical coupling...)
*/
int type;
/*!
* \brief Index inside the Learning Rule.
*/
int LearningRuleIndex_withPost;
/*!
* \brief Index inside the Learning Rule.
*/
int LearningRuleIndex_withoutPost;
/*!
* \brief This connection is a trigger connection for the learning rule without post synpatic effect
*/
bool TriggerConnection;
public:
/*!
* \brief Default constructor.
*
* It creates a new interconnection object without source or target neuron.
*/
Interconnection();
/*!
* \brief Constructor with parameters.
*
* It creates and initializes a new interconnection object with the parameters.
*
* \param NewIndex The interconnection index in the network configuration file.
* \param NewSource Source neuron of this connection.
* \param NewTarget Target neuron of this connection.
* \param NewDelay Delay of this connection.
* \param NewType Connection type (excitatory, inhibitory, electrical coupling...) of this connection. The meaning of a value is depend on the neuron model.
* \param NewWeight Synaptic weight of this connection.
* \param NewMaxWeight Maximum synaptic weight of this connection.
* \param NewWeightChange Learning (or weight change) rule associated to this connection.
* \param NewLearningRuleIndex Current learning rule index.
*/
Interconnection(int NewIndex, Neuron * NewSource, Neuron * NewTarget, float NewDelay, int NewType, float NewWeight, float NewMaxWeight, LearningRule* NewWeightChange_withPost, unsigned int NewLearningRuleIndex_withPost, LearningRule* NewWeightChange_withoutPost, unsigned int NewLearningRuleIndex_withoutPost);
/*!
* \brief Object destructor.
*
* It remove an interconnetion object an releases the memory of the connection state.
*/
~Interconnection();
/*!
* \brief It gets the connection index.
*
* It gets the connection index in the network connections.
*
* \return The connection index.
*/
long int GetIndex() const;
/*!
* \brief It sets the connection index.
*
* It sets the connection index in the network connections.
*
* \param NewIndex The new index of the connection.
*/
void SetIndex(long int NewIndex);
/*!
* \brief It gets the source neuron.
*
* It gets the source neuron of the connection.
*
* \return The source neuron of the connection.
*/
//Neuron * GetSource() const;
inline Neuron * GetSource() const{
return this->source;
}
/*!
* \brief It sets the source neuron.
*
* It sets the source neuron of the connection.
*
* \param NewSource The new source neuron of the connection.
*/
void SetSource(Neuron * NewSource);
/*!
* \brief It gets the target neuron.
*
* It gets the target neuron of the connection.
*
* \return The target neuron of the connection.
*/
//Neuron * GetTarget() const;
inline Neuron * GetTarget() const{
return this->target;
}
/*!
* \brief It sets the target neuron.
*
* It sets the target neuron of the connection.
*
* \param NewTarget The new target neuron of the connection.
*/
void SetTarget(Neuron * NewTarget);
/*!
* \brief It gets the connection delay.
*
* It gets the delay in the spike propagation through this connection.
*
* \return The connection delay.
*/
//inline double GetDelay() const;
inline double GetDelay() const{
return delay;
}
/*!
* \brief It sets the connection delay.
*
* It sets the delay of the connection.
*
* \param NewDelay The new connection delay.
*/
void SetDelay(double NewDelay);
/*!
* \brief It gets the connection type.
*
* It gets the connection type (excitatory, inhibitory, electrical coupling...) of this connection. The meaning of a value is depend on the neuron model.
*
* \return The connection type.
*/
//int GetType() const;
inline int GetType() const{
return type;
}
/*!
* \brief It sets the connection type.
*
* It sets the connection type (excitatory, inhibitory, electrical coupling...) of this connection. The meaning of a value is depend on the neuron model.
*
* \param NewType The new connection type.
*/
void SetType(int NewType);
/*!
* \brief It gets the synaptic weight.
*
* It gets the synaptic weight of the connection.
*
* \return The synaptic weight.
*/
//float GetWeight() const;
inline float GetWeight() const{
return weight;
}
/*!
* \brief It sets the synaptic weight.
*
* It sets the synaptic weight of the connection.
*
* \param NewWeight The new synaptic weight of the connection.
*/
//void SetWeight(float NewWeight);
inline void SetWeight(float NewWeight){
this->weight = NewWeight;
}
/*!
* \brief It increment the synaptic weight and checks the final value is inside the limits.
*
* It increment the synaptic weight and checks the final value is inside the limits.
*
* \param Increment The synaptic weight increment of the connection.
*/
//void IncrementWeight(float Increment);
inline void IncrementWeight(float Increment){
this->weight += Increment;
if(this->weight > this->GetMaxWeight()){
this->weight = this->GetMaxWeight();
}else if(this->weight < 0.0f){
this->weight = 0.0f;
}
}
/*!
* \brief It gets the maximum synaptic weight.
*
* It gets the maximum synaptic weight of the connection.
*
* \return The maximum synaptic weight.
*/
//float GetMaxWeight() const;
inline float GetMaxWeight() const{
return this->maxweight;
}
/*!
* \brief It sets the maximum synaptic weight.
*
* It sets the maximum synaptic weight of the connection.
*
* \param NewMaxWeight The new maximum synaptic weight of the connection.
*/
void SetMaxWeight(float NewMaxWeight);
/*!
* \brief It gets the learning rule of this connection.
*
* It gets the learning rule of the connection.
*
* \return The learning rule of the connection. 0 if the connection hasn't learning rule.
*/
//LearningRule * GetWeightChange() const;
inline LearningRule * GetWeightChange_withPost() const{
return this->wchange_withPost;
}
/*!
* \brief It sets the learning rule of this connection.
*
* It sets the learning rule of the connection.
*
* \param NewWeightChange The new learning rule of the connection. 0 if the connection hasn't learning rule.
*/
void SetWeightChange_withPost(LearningRule * NewWeightChange_withPost);
/*!
* \brief It gets the learning rule of this connection.
*
* It gets the learning rule of the connection.
*
* \return The learning rule of the connection. 0 if the connection hasn't learning rule.
*/
//LearningRule * GetWeightChange() const;
inline LearningRule * GetWeightChange_withoutPost() const{
return this->wchange_withoutPost;
}
/*!
* \brief It sets the learning rule of this connection.
*
* It sets the learning rule of the connection.
*
* \param NewWeightChange The new learning rule of the connection. 0 if the connection hasn't learning rule.
*/
void SetWeightChange_withoutPost(LearningRule * NewWeightChange_withoutPost);
/*!
* \brief It gets the connection learning rule index.
*
* It gets the connection learning rule index in the network connections.
*
* \return The connection learning rule index.
*/
//int GetLearningRuleIndex() const;
inline int GetLearningRuleIndex_withPost() const{
return this->LearningRuleIndex_withPost;
}
/*!
* \brief It gets the connection learning rule index.
*
* It gets the connection learning rule index in the network connections.
*
* \return The connection learning rule index.
*/
//int GetLearningRuleIndex() const;
inline int GetLearningRuleIndex_withoutPost() const{
return this->LearningRuleIndex_withoutPost;
}
/*!
* \brief It sets the connection learning rule index.
*
* It sets the connection learning rule index in the network connections.
*
* \param NewIndex The new learning rule index of the connection.
*/
void SetLearningRuleIndex_withPost(int NewIndex);
/*!
* \brief It sets the connection learning rule index.
*
* It sets the connection learning rule index in the network connections.
*
* \param NewIndex The new learning rule index of the connection.
*/
void SetLearningRuleIndex_withoutPost(int NewIndex);
/*!
* \brief It clears the activity register of this connection.
*
* It clears the activity register of this connections and sets their values to 0.
*/
void ClearActivity();
/*!
* \brief It gets the activity in an specified index.
*
* It gets the activity in an specified index.
*
* \param index The index of the activity.
*
* \return The activity in that index.
*/
float GetActivityAt(int index) const;
/*!
* \brief It sets the activity in an specified index.
*
* It sets the activity in an specified index.
*
* \param The index of the activity.
* \param NewActivity The new activity to be changed.
*/
void SetActivityAt(int index, float NewActivity);
/*!
* \brief It gets the time of the last propagated spike.
*
* It gets the time of the last propagated spike through this connection.
*
* \return The time of the last propagated spike.
*/
double GetLastSpikeTime() const;
/*!
* \brief It sets the time of the last propagated spike.
*
* It sets the time of the last propagated spike through this connection.
*
* \param NewTime The new time of the last propagated spike.
*/
void SetLastSpikeTime(double NewTime);
/*!
* \brief It prints the interconnection info.
*
* It prints the current interconnection characteristics.
*
* \param out The stream where it prints the information.
*
* \return The stream after the printer.
*/
virtual ostream & PrintInfo(ostream & out);
/*!
* \brief It sets the trigger connection option to true.
*
* It sets the trigger connection option to true.
*/
void SetTriggerConnection();
/*!
* \brief It return the trigger connection option.
*
* It return the trigger connection option.
*/
bool GetTriggerConnection();
};
#endif /*INTERCONNECTION_H_*/