All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.numenta.nupic.model.ProximalDendrite Maven / Gradle / Ivy

/* ---------------------------------------------------------------------
 * 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.util.List;

public class ProximalDendrite extends Segment implements Persistable {
    /** keep it simple */
    private static final long serialVersionUID = 1L;
    
    private Pool pool;

    /**
     * 
     * @param index     this {@code ProximalDendrite}'s index.
     */
    public ProximalDendrite(int index) {
        super(index);
    }

    /**
     * Creates the pool of {@link Synapse}s representing the connection
     * to the input vector.
     * 
     * @param c					the {@link Connections} memory
     * @param inputIndexes		indexes specifying the input vector bit
     */
    public Pool createPool(Connections c, int[] inputIndexes) {
        pool = new Pool(inputIndexes.length);
        for(int i = 0;i < inputIndexes.length;i++) {
            int synCount = c.getProximalSynapseCount();
            pool.setPermanence(c, createSynapse(c, c.getSynapses(this), null, pool, synCount, inputIndexes[i]), 0);
            c.setProximalSynapseCount(synCount + 1);
        }
        return pool;
    }

    public void clearSynapses(Connections c) {
        c.getSynapses(this).clear();
    }

    /**
     * Sets the permanences for each {@link Synapse}. The number of synapses
     * is set by the potentialPct variable which determines the number of input
     * bits a given column will be "attached" to which is the same number as the
     * number of {@link Synapse}s
     * 
     * @param c			the {@link Connections} memory
     * @param perms		the floating point degree of connectedness
     */
    public void setPermanences(Connections c, double[] perms) {
        pool.resetConnections();
        c.getConnectedCounts().clearStatistics(index);
        List synapses = c.getSynapses(this);
        for(Synapse s : synapses) {
            s.setPermanence(c, perms[s.getInputIndex()]);
            if(perms[s.getInputIndex()] >= c.getSynPermConnected()) {
                c.getConnectedCounts().set(1, index, s.getInputIndex());
            }
        }
    }

    /**
     * Sets the permanences for each {@link Synapse} specified by the indexes
     * passed in which identify the input vector indexes associated with the
     * {@code Synapse}. The permanences passed in are understood to be in "sparse"
     * format and therefore require the int array identify their corresponding
     * indexes.
     * 
     * Note: This is the "sparse" version of this method.
     * 
     * @param c			the {@link Connections} memory
     * @param perms		the floating point degree of connectedness
     */
    public void setPermanences(Connections c, double[] perms, int[] inputIndexes) {
        pool.resetConnections();
        c.getConnectedCounts().clearStatistics(index);
        for(int i = 0;i < inputIndexes.length;i++) {
            pool.setPermanence(c, pool.getSynapseWithInput(inputIndexes[i]), perms[i]);
            if(perms[i] >= c.getSynPermConnected()) {
                c.getConnectedCounts().set(1, index, i);
            }
        }
    }

    /**
     * Sets the input vector synapse indexes which are connected (>= synPermConnected)
     * @param c
     * @param connectedIndexes
     */
    public void setConnectedSynapsesForTest(Connections c, int[] connectedIndexes) {
        Pool pool = createPool(c, connectedIndexes);
        c.getPotentialPools().set(index, pool);
    }

    /**
     * Returns an array of synapse indexes as a dense binary array.
     * @param c
     * @return
     */
    public int[] getConnectedSynapsesDense(Connections c) {
        return c.getPotentialPools().get(index).getDenseConnected(c);
    }

    /**
     * Returns an sparse array of synapse indexes representing the connected bits.
     * @param c
     * @return
     */
    public int[] getConnectedSynapsesSparse(Connections c) {
        return c.getPotentialPools().get(index).getSparsePotential();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy