/* ---------------------------------------------------------------------
* 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 General 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses.
*
* http://numenta.org/licenses/
* ---------------------------------------------------------------------
*/
package org.numenta.nupic.datagen;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Utilities for generating and manipulating sequences, for use in
* experimentation and tests.
*
* @author David Ray
*/
public class SequenceMachine {
private PatternMachine patternMachine;
/**
* Represents the end of a pattern or sequence when inserted in
* a {@link Collection}, otherwise the primitive form of "None"
* is -1
*/
public static final Set<Integer> NONE = new HashSet<Integer>() {
private static final long serialVersionUID = 1L;
public String toString() { return "None"; }
};
/**
* Constructs a new {@code SequenceMachine}
* @param pMachine
*/
public SequenceMachine(PatternMachine pMachine) {
this.patternMachine = pMachine;
}
/**
* Generate a sequence from a list of numbers.
*
* @param numbers
* @return
*/
public List<Set<Integer>> generateFromNumbers(List<Integer> numbers) {
List<Set<Integer>> sequence = new ArrayList<Set<Integer>>();
for(Integer i : numbers) {
if(i == -1) {
sequence.add(NONE);
}else{
Set<Integer> pattern = patternMachine.get(i);
sequence.add(pattern);
}
}
return sequence;
}
/**
* Add spatial noise to each pattern in the sequence.
*
* @param sequence List of patterns
* @param amount Amount of spatial noise
* @return Sequence with noise added to each non-empty pattern
*/
public List<Set<Integer>> addSpatialNoise(List<Set<Integer>> sequence, double amount) {
List<Set<Integer>> newSequence = new ArrayList<Set<Integer>>();
for(Set<Integer> pattern : sequence) {
if(!pattern.equals(NONE)) {
pattern = patternMachine.addNoise(pattern, amount);
}
newSequence.add(pattern);
}
return newSequence;
}
/**
* Pretty print a sequence.
*
* @param sequence the sequence of numbers to print
* @param verbosity the extent of output chatter
* @return
*/
public String prettyPrintSequence(List<Set<Integer>> sequence, int verbosity) {
String text = "";
for(int i = 0;i < sequence.size();i++) {
Set<Integer> pattern = sequence.get(i);
if(pattern == NONE) {
text += "<reset>";
if(i < sequence.size() - 1) {
text += "\n";
}
}else{
text += patternMachine.prettyPrintPattern(pattern, verbosity);
}
}
return text;
}
}