package spiking.node;
import java.io.Serializable;
import java.util.Comparator;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Synapse implements Comparable<Synapse>, Serializable{
private static final long serialVersionUID = -4428703256832002027L;
private final static String TAG = "[Syapse] ";
private final static Boolean verbose = true;
private Long firingNeuronId;
private Long burningNeuronId;
private Integer firingNodeId;
private Integer burningNodeId;
private Boolean fromExternalNode=false;
private Boolean fromExternalInput=false;
private Double length;
private Double mu_w;
private Double presynaptic_w;
private Double lastBurningTime;
public Synapse(
Integer firingNodeId,
Long firingNeuronId,
Integer burningNodeId,
Long burningNeuronId,
Double length,
Double mu_w,
Double presynaptic_w,
Boolean fromExternalInput,
Boolean fromExternalNode) {
this.firingNodeId = firingNodeId;
this.firingNeuronId = firingNeuronId;
this.burningNodeId = burningNodeId;
this.burningNeuronId = burningNeuronId;
this.fromExternalNode=fromExternalNode;
this.length=length;
this.presynaptic_w= presynaptic_w;
this.fromExternalInput=fromExternalInput;
this.setPostsynapticWeight(mu_w);
}
public Boolean fromExternalNode(){
return fromExternalNode;
}
public Long getAxonNeuronId() {
return firingNeuronId;
}
public Long getFiring(){
return firingNeuronId;
}
public void setAxonNeuronId(Long firingNeuronId) {
this.firingNeuronId = firingNeuronId;
}
public Long getBurningNeuronId() {
return burningNeuronId;
}
public Long getBurning(){
return burningNeuronId;
}
public void setBurningNeuronId(Long burningNeuronId) {
this.burningNeuronId = burningNeuronId;
}
public Integer getAxonNodeId() {
return firingNodeId;
}
public Integer getFiringNodeId() {
return firingNodeId;
}
public void setAxonNodeId(Integer firingNodeId) {
this.firingNodeId = firingNodeId;
}
public Integer getBurningNodeId() {
return burningNodeId;
}
public void setBurningNodeId(Integer burningNodeId) {
this.burningNodeId = burningNodeId;
}
public Double getLength() {
return length;
}
public void setLenght(Double length) {
this.length = length;
}
public Double getPostSynapticWeight() {
return (mu_w==null)?1.0:mu_w;
}
public void setPostsynapticWeight(Double post_synaptic_weight) {
if ((post_synaptic_weight!=null)&&(post_synaptic_weight==1.0))
this.mu_w=null;
else
this.mu_w = post_synaptic_weight;
}
public Double getPreSynapticWeight() {
return presynaptic_w;
}
public Boolean fromExternal(){
return (fromExternalNode||fromExternalInput);
}
public Double getLastBurningTime() {
return lastBurningTime;
}
public void setLastBurningTime(Double lastBurningTime) {
this.lastBurningTime = lastBurningTime;
}
public void resetLastBurningTime() {
this.lastBurningTime = null;
}
@Override
public String toString() {
return "[firing:" + firingNodeId+"-"+firingNeuronId
+ ", burning:"+burningNodeId +"-"+ burningNeuronId
+" from external:"+ fromExternalNode+"]";
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (obj.getClass() != getClass())
return false;
Synapse rhs = (Synapse) obj;
return new EqualsBuilder()
.append(firingNodeId, rhs.firingNodeId)
.append(firingNeuronId, rhs.firingNeuronId)
.append(burningNodeId, rhs.burningNodeId)
.append(burningNeuronId, rhs.burningNeuronId).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37).append(7l*firingNeuronId+9l+firingNodeId)
.append(burningNeuronId*burningNodeId+3l*firingNeuronId+17l).toHashCode();
}
@Override
public int compareTo(Synapse o) {
if (this==o)
return 0;
int retval = firingNeuronId.compareTo(o.getAxonNeuronId());
if (retval!=0)
return retval;
retval = burningNeuronId.compareTo(o.getBurningNeuronId());
if (retval!=0)
return retval;
retval = firingNodeId.compareTo(o.getAxonNodeId());
if (retval!=0)
return retval;
retval = burningNodeId.compareTo(o.getBurningNodeId());
return retval;
}
public Boolean fromExternalInput() {
return fromExternalInput;
}
public Integer fromExternalInputInteger() {
return fromExternalInput ? 1 : 0;
}
public void setFromExternalInput(Boolean fromExternalInput) {
this.fromExternalInput = fromExternalInput;
}
private void println(String s){
if (verbose){
System.out.println(TAG+s);
}
}
}