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

org.numenta.nupic.encoders.DeltaEncoder Maven / Gradle / Ivy

The newest version!
/* ---------------------------------------------------------------------
 * Numenta Platform for Intelligent Computing (NuPIC)
 * Copyright (C) 2014, Numenta, In  Unless you have an agreement
 * with Numenta, In, 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.encoders;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.numenta.nupic.model.Connections;

public class DeltaEncoder extends AdaptiveScalarEncoder {
	
	private static final long serialVersionUID = 1L;
    
	public double prevAbsolute = 0;
	public double prevDelta = 0;
	public boolean stateLock = false;

	/**
	 * Constructs a new {@code DeltaEncoder}
	 */
	public DeltaEncoder() {
	}

	/**
	 * {@inheritDoc}
	 * @see org.numenta.nupic.encoders.AdaptiveScalarEncoder#init()
	 */
	@Override
	public void init() {
		super.init();
	}

	/**
	 * {@inheritDoc}
	 * @see org.numenta.nupic.encoders.AdaptiveScalarEncoder#initEncoder(int, double, double, int, double, double)
	 */
	@Override
	public void initEncoder(int w, double minVal, double maxVal, int n,
			double radius, double resolution) {
		super.initEncoder(w, minVal, maxVal, n, radius, resolution);
	}

	/**
	 * Returns a builder for building DeltaEncoder. This builder may be
	 * reused to produce multiple builders
	 * 
	 * @return a {@code DeltaEncoder.Builder}
	 */
	public static DeltaEncoder.Builder deltaBuilder() {
		return new DeltaEncoder.Builder();
	}

	/**
	 * Builder pattern for constructing a {@code DeltaEncoder}
	 * 
	 */
	public static class Builder extends Encoder.Builder {
		private Builder() {}

		@Override
		public DeltaEncoder build() {
			encoder = new DeltaEncoder();
			super.build();
			((DeltaEncoder) encoder).init();
			return (DeltaEncoder) encoder;
		}
	}

	/**
	 * Encodes inputData and puts the encoded value into the output array,
     * which is a 1-D array of length returned by {@link Connections#getW()}.
	 *
     * Note: The output array is reused, so clear it before updating it.
	 * @param inputData Data to encode. This should be validated by the encoder.
	 * @param output 1-D array of same length returned by {@link Connections#getW()}
     */
	@Override
	public void encodeIntoArray(Double input, int[] output) {
		if (!(input instanceof Double)) {
			throw new IllegalArgumentException(
					String.format("Expected a Double input but got input of type %s", input.toString()));
		}
		double delta = 0;
		if (input == DeltaEncoder.SENTINEL_VALUE_FOR_MISSING_DATA) {
			output = new int[this.n];
			Arrays.fill(output, 0);
		} else {
			if (this.prevAbsolute == 0) {
				this.prevAbsolute = input;
			}
			delta = input - this.prevAbsolute;
			super.encodeIntoArray(input, output);
		}
		if (!this.stateLock) {
			this.prevAbsolute = input;
			this.prevDelta = delta;
		}
	}

	/**
	 * @return the stateLock
	 */
	public boolean isStateLock() {
		return stateLock;
	}

	/**
	 * @param stateLock the stateLock to set
	 */
	public void setStateLock(boolean stateLock) {
		this.stateLock = stateLock;
	}

	public void setFieldStats(String fieldName, String[] fieldParameters) {
		// TODO Auto-generated method stub
	}
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean isDelta() {
		return true;
	}

	/**
	 * {@inheritDoc}
	 * @see org.numenta.nupic.encoders.AdaptiveScalarEncoder#getBucketInfo(int[])
	 */
	@Override
	public List getBucketInfo(int[] buckets) {
		return super.getBucketInfo(buckets);
	}

	/**
	 * {@inheritDoc}
	 * @see org.numenta.nupic.encoders.AdaptiveScalarEncoder#topDownCompute(int[])
	 */
	@Override
	public List topDownCompute(int[] encoded) {
		if (this.prevAbsolute == 0 || this.prevDelta == 0) {
			int[] initialBuckets = new int[this.n];
			Arrays.fill(initialBuckets, 0);
			List encoderResultList = new ArrayList();
			Encoding encoderResult = new Encoding(0, 0, initialBuckets);
			encoderResultList.add(encoderResult);
			return encoderResultList;
		}
		List erList = super.topDownCompute(encoded);
		if (this.prevAbsolute != 0) {
			double objVal = (double)(erList.get(0).getValue()) + this.prevAbsolute;
			double objScalar = erList.get(0).getScalar().doubleValue() + this.prevAbsolute;
			List encoderResultList = new ArrayList();
			Encoding encoderResult = new Encoding(objVal, objScalar, erList.get(0).getEncoding());
			encoderResultList.add(encoderResult);
			return encoderResultList;
		}
		return erList;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy