public void AdaptSegments(bool positiveReinforcement)
{
foreach (SegmentUpdate segInfo in _segmentUpdateList)
{
if (segInfo.Segment != null)
{
if (positiveReinforcement)
{
foreach (HTMSynapse syn in segInfo.Segment.Synapses)
if (segInfo.ActiveSynapses.Contains(syn))
syn.IncreasePermanence();
else
syn.DecreasePermanence();
}
else
foreach (HTMSynapse syn in segInfo.ActiveSynapses)
syn.DecreasePermanence();
// TO DO : the series of negative reinforcements should bring to eliminate the entire segment.
}
if (segInfo.AddNewSynapses && segInfo.NewSynapses.Count > 0)
{
// check wheter exist a similar segment
bool isFound = false;
foreach (HTMSegment seg in _distalSegments)
{
int foundCount = 0;
foreach (HTMSynapse syn in seg.Synapses)
if (segInfo.NewSynapses.Contains(syn.InputCell))
foundCount++;
if (foundCount == segInfo.NewSynapses.Count)
{
isFound = true;
break;
}
}
if (isFound)
continue;
// update or create a segment
HTMSegment segment;
if (segInfo.Segment != null)
segment = segInfo.Segment;
else
{
segment = new HTMSegment(this, _column.Region.SegmentActivationThreshold);
_distalSegments.Add(segment);
_column.Region.Director.Log("Created new distal segment on a cell on column " + segment.Cell.Column.PosX.ToString() + "," + segment.Cell.Column.PosY.ToString());
}
segment.IsSequence = segInfo.IsSequence;
foreach (HTMCell cell in segInfo.NewSynapses)
{
//
bool find = false;
foreach (HTMSynapse syn in segment.Synapses)
{
if (syn.InputCell == cell)
{
find = true;
break;
}
}
//
if (!find)
segment.Synapses.Add(new HTMSynapse(cell));
}
}
}
_segmentUpdateList.Clear();
}