/* ---------------------------------------------------------------------
* Numenta Platform for Intelligent Computing (NuPIC)
* Copyright (C) 2014, Numenta, Inc. Unless you have an agreement
* with Numenta, Inc., for a separate license for this software code, the
* following terms and conditions apply:
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero Public License for more details.
*
* You should have received a copy of the GNU Affero Public License
* along with this program. If not, see http://www.gnu.org/licenses.
*
* http://numenta.org/licenses/
* ---------------------------------------------------------------------
*/
package org.numenta.nupic.model;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
/**
* Software implementation of a neuron in the neocortical region.
*
* @author Chetan Surpur
* @author David Ray
*/
public class Cell implements Comparable<Cell>, Serializable {
/** keep it simple */
private static final long serialVersionUID = 1L;
/** This cell's index */
private final int index;
/** Remove boxing where necessary */
final Integer boxedIndex;
/** The owning {@link Column} */
private final Column column;
/** Cash this because Cells are immutable */
private final int hashcode;
/**
* Constructs a new {@code Cell} object
* @param column the containing {@link Column}
* @param colSeq this index of this {@code Cell} within its column
*/
public Cell(Column column, int colSeq) {
this.column = column;
this.index = column.getIndex() * column.getNumCellsPerColumn() + colSeq;
this.boxedIndex = new Integer(index);
this.hashcode = hashCode();
}
/**
* Returns this {@code Cell}'s index.
* @return
*/
public int getIndex() {
return index;
}
/**
* Returns the column within which this cell resides
* @return
*/
public Column getColumn() {
return column;
}
/**
* Returns the Set of {@link Synapse}s which have this cell
* as their source cells.
*
* @param c the connections state of the temporal memory
* return an orphaned empty set.
* @return the Set of {@link Synapse}s which have this cell
* as their source cells.
*/
public Set<Synapse> getReceptorSynapses(Connections c) {
return getReceptorSynapses(c, false);
}
/**
* Returns the Set of {@link Synapse}s which have this cell
* as their source cells.
*
* @param c the connections state of the temporal memory
* @param doLazyCreate create a container for future use if true, if false
* return an orphaned empty set.
* @return the Set of {@link Synapse}s which have this cell
* as their source cells.
*/
public Set<Synapse> getReceptorSynapses(Connections c, boolean doLazyCreate) {
return c.getReceptorSynapses(this, doLazyCreate);
}
/**
* Returns a {@link List} of this {@code Cell}'s {@link DistalDendrite}s
*
* @param c the connections state of the temporal memory
* @param doLazyCreate create a container for future use if true, if false
* return an orphaned empty set.
* @return a {@link List} of this {@code Cell}'s {@link DistalDendrite}s
*/
public List<DistalDendrite> getSegments(Connections c) {
return getSegments(c, false);
}
/**
* Returns a {@link List} of this {@code Cell}'s {@link DistalDendrite}s
*
* @param c the connections state of the temporal memory
* @param doLazyCreate create a container for future use if true, if false
* return an orphaned empty set.
* @return a {@link List} of this {@code Cell}'s {@link DistalDendrite}s
*/
public List<DistalDendrite> getSegments(Connections c, boolean doLazyCreate) {
return c.getSegments(this, doLazyCreate);
}
/**
* {@inheritDoc}
*/
public String toString() {
return String.valueOf(index);
}
/**
* {@inheritDoc}
*
* <em> Note: All comparisons use the cell's index only </em>
*/
@Override
public int compareTo(Cell arg0) {
return boxedIndex.compareTo(arg0.boxedIndex);
}
@Override
public int hashCode() {
if(hashcode == 0) {
final int prime = 31;
int result = 1;
result = prime * result + index;
return result;
}
return hashcode;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Cell other = (Cell)obj;
if(index != other.index)
return false;
return true;
}
}