Esempio n. 1
0
        public void Learn(IEnumerable <SpatialPoolerColumn> activeColumns, SparseBitArray activeInputs)
        {
            foreach (var column in activeColumns)
            {
                column.IsActive = true;
                column.MiniColumn.UpdatePermanences(activeInputs, Parameters.SynapticPermanenceInc, Parameters.SynapticPermanenceDec);
            }

            foreach (var column in PoolerColumns)
            {
                int active = column.IsActive ? 1 : 0;
                column.UpdateActiveDutyCycle(active, Parameters.DutyCycleLength);
                column.IsActive = false;

                int overlapped = column.OverlapScore > Parameters.StimulusThreshold ? 1 : 0;
                column.UpdateOverlapDutyCycle(overlapped, Parameters.DutyCycleLength);
            }

            _MeanActiveDutyCycle = PoolerColumns.Average(column => column.ActiveDutyCycle);

            foreach (var column in PoolerColumns)
            {
                column.UpdateBoostFactor(Parameters.BoostStrength, column.ActiveDutyCycle, _MeanActiveDutyCycle);
                column.MiniColumn.UpdateSynapses();
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Initialize a <see cref="MiniColumn">
        /// </summary>
        /// <param name="inputSize"></param>
        /// <param name="activeBits"></param>
        public MiniColumn(
            int index,
            int inputSize,
            double potentialSynapsePercent,
            double connectedPermThreshold)
        {
            _LinearIndex = index;
            var potentialConnections = new List <int>();
            var activeConnections    = new List <int>();

            _SynapticPermanences = new List <double>();

            var rng = new Random();

            for (var i = 0; i < inputSize; i++)
            {
                var r = rng.NextDouble();
                if (r < potentialSynapsePercent)
                {
                    potentialConnections.Add(i);
                    _SynapticPermanences.Add(r);

                    if (r >= connectedPermThreshold)
                    {
                        activeConnections.Add(i);
                    }
                }
            }

            _PotentialConnections = new SparseBitArray(potentialConnections, inputSize);
            _ActiveConnections    = new SparseBitArray(activeConnections, inputSize);
        }
Esempio n. 3
0
        public List <SpatialPoolerColumn> ComputeActive(SparseBitArray input)
        {
            var overlapScores = new List <double>(CorticalRegion.MiniColumns.Count);

            foreach (var column in PoolerColumns)
            {
                column.IsActive = false;
                var overlapScore = column.ComputeOverlap(input);
                column.OverlapScore = overlapScore;
                overlapScores.Add(overlapScore);
            }

            var topScores    = overlapScores.KMax(Parameters.ActivationsPerInhibitionRegion);
            var minimumScore = topScores.Last();

            var activeColumns = new List <SpatialPoolerColumn>();

            foreach (var column in PoolerColumns)
            {
                if (overlapScores[column.MiniColumn.LinearIndex] > Parameters.StimulusThreshold &&
                    overlapScores[column.MiniColumn.LinearIndex] >= minimumScore)
                {
                    column.IsActive = true;
                    activeColumns.Add(column);
                }
            }

            _ActiveColumns = activeColumns;

            return(activeColumns);
        }
Esempio n. 4
0
        public void AllZeroAfterCreation()
        {
            var bitarray = new SparseBitArray();

            Assert.True(!bitarray.Get(0));
            Assert.True(!bitarray.Get(1));
            Assert.True(!bitarray.Get(2));
            Assert.True(!bitarray.Get(100));
            Assert.True(!bitarray.Get(1000));
        }
Esempio n. 5
0
        public void SimpleSets()
        {
            var bitarray = new SparseBitArray();

            bitarray.Set(0, true);
            bitarray.Set(1, true);
            bitarray.Set(2, true);
            bitarray.Set(3, true);

            Assert.True(bitarray.Get(0));
            Assert.True(bitarray.Get(1));
            Assert.True(bitarray.Get(2));
            Assert.True(bitarray.Get(3));
            Assert.True(!bitarray.Get(4));
        }
Esempio n. 6
0
        /// <summary>
        /// Reinforces active synapses and discourages inactive ones.
        /// </summary>
        /// <param name="activeInputs"></param>
        /// <param name="inc"></param>
        /// <param name="dec"></param>
        public void UpdatePermanences(SparseBitArray activeInputs, double inc, double dec)
        {
            Action <int, int, int> increment = (x, iPotential, jActiveInput) =>
            {
                _SynapticPermanences[iPotential] += inc;
                _SynapticPermanences[iPotential]  = Math.Min(1.0, _SynapticPermanences[iPotential]);
            };

            Action <int, int, int, int> decrement = (x, iPotential, y, jActiveInput) =>
            {
                _SynapticPermanences[iPotential] -= dec;
                _SynapticPermanences[iPotential]  = Math.Max(0.0, _SynapticPermanences[iPotential]);
            };

            PotentialConnections.SparseZipMap(activeInputs,
                                              Comparer <int> .Default.Compare,
                                              increment,
                                              decrement,
                                              decrement);
        }
Esempio n. 7
0
        public void Indexers()
        {
            var indices = new[] { 0, 20, 25, 28, 35, 44, 47, 49 };

            var array = new SparseBitArray(indices, 50);

            foreach (var index in indices)
            {
                Assert.IsTrue(array.Contains(index));
            }

            for (var i = 0; i < 50; i++)
            {
                if (indices.Contains(i))
                {
                    Assert.AreEqual(1, array[i]);
                }
                else
                {
                    Assert.AreEqual(0, array[i]);
                }
            }
        }
Esempio n. 8
0
        public double ComputeOverlap(SparseBitArray input)
        {
            var overlapCount = MiniColumn.ActiveConnections.OverlapCount(input);

            return(overlapCount * BoostFactor);
        }
Esempio n. 9
0
        public void ProcessAndLearn(SparseBitArray activeInputs)
        {
            var activeColumns = ComputeActive(activeInputs);

            Learn(activeColumns, activeInputs);
        }