Exemple #1
0
func (c *Column) LearnSequence(learnState data.Bitset) {
	logEnabled := log.HtmLogger.Enabled()
	if learnState.IsZero() {
		// Select the learning cell, but don't increment the target.
		c.learning = c.learningTarget
		if logEnabled {
			log.HtmLogger.Printf("\t(%d, %d)=%04d: skip learning empty sequence",
				c.Index, c.learning, c.CellId(c.learning))
		}
		return
	}
	cell, sIndex, _ := c.FindBestSegment(learnState, 1, true)
	if sIndex >= 0 {
		if logEnabled {
			log.HtmLogger.Printf("\t(%d, %d)=%04d: Will reinforce segment: %v",
				c.Index, cell, c.CellId(cell), c.distal[cell].Segment(sIndex))
		}
	} else {
		if logEnabled {
			log.HtmLogger.Printf("\t(%d, %d)=%04d: Will learn a new segment.",
				c.Index, c.learningTarget, c.CellId(c.learningTarget))
		}
		cell = c.learningTarget
		c.learningTarget = (c.learningTarget + 1) % c.Height()
		sIndex = -1
	}
	c.learning = cell
	update := c.distal[cell].CreateUpdate(sIndex, learnState, 1)
	if logEnabled {
		log.HtmLogger.Printf("\tLearning sequence %v => (%d, %d)=%04d",
			update, c.Index, cell, c.CellId(cell))
	}
	c.distal[cell].Apply(update, true)
}