package org.numenta.nupic.model;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.Test;
import org.numenta.nupic.algorithms.TemporalMemory;
import org.numenta.nupic.model.Cell;
import org.numenta.nupic.model.Connections;
import org.numenta.nupic.model.SDR;
public class SDRTest {
@Test
public void testAsCellIndices() {
Connections cn = new Connections();
cn.setColumnDimensions(new int[] { 64, 64 });
cn.setCellsPerColumn(4);
TemporalMemory.init(cn);
int[] expectedIndexes = { 0, 3, 4, 16383 };
Set<Cell> cells = cn.getCellSet(expectedIndexes);
int[] cellIndices = SDR.asCellIndices(cells);
assertTrue(Arrays.equals(cellIndices, expectedIndexes));
}
@Test
public void testAsColumnIndices() {
int cellsPerColumn = 4;
int[] expectedIndexes = { 0, 3, 4, 4095 };
int[] inputIndexes = Arrays.stream(expectedIndexes).map(i -> i * cellsPerColumn).toArray();
int[] result = SDR.asColumnIndices(inputIndexes, cellsPerColumn);
assertTrue(Arrays.equals(expectedIndexes, result));
// Test failure
expectedIndexes = new int[] { 0, 3, 4, 4, 4095 }; // Has duplicate ("4")
inputIndexes = Arrays.stream(expectedIndexes).map(i -> i * cellsPerColumn).toArray();
result = SDR.asColumnIndices(inputIndexes, cellsPerColumn); // "true" is Erroneous state
assertFalse(Arrays.equals(expectedIndexes, result));
// Test correct state fixes above
int[] arrInputIndexes = new int[] { 0, 3, 4, 4, 4095 }; // Has duplicate ("4")
expectedIndexes = new int[] { 0, 3, 4, 4095 }; // Has duplicate ("4")
inputIndexes = Arrays.stream(arrInputIndexes).map(i -> i * cellsPerColumn).toArray();
result = SDR.asColumnIndices(inputIndexes, cellsPerColumn); // "false" is correct state
assertTrue(Arrays.equals(expectedIndexes, result));
}
@Test
public void testAsColumnIndicesList() {
int cellsPerColumn = 4;
int[] expectedIndexes = { 0, 3, 4, 4095 };
int[] inputIndexes = Arrays.stream(expectedIndexes).map(i -> i * cellsPerColumn).toArray();
int[] result = SDR.asColumnIndices(
Arrays.stream(inputIndexes).boxed().collect(Collectors.toList()), cellsPerColumn);
assertTrue(Arrays.equals(expectedIndexes, result));
// Test failure
expectedIndexes = new int[] { 0, 3, 4, 4, 4095 }; // Has duplicate ("4")
inputIndexes = Arrays.stream(expectedIndexes).map(i -> i * cellsPerColumn).toArray();
result = SDR.asColumnIndices(
Arrays.stream(inputIndexes).boxed().collect(Collectors.toList()), cellsPerColumn); // "true" is Erroneous state
assertFalse(Arrays.equals(expectedIndexes, result));
// Test correct state fixes above
int[] arrInputIndexes = new int[] { 0, 3, 4, 4, 4095 }; // Has duplicate ("4")
expectedIndexes = new int[] { 0, 3, 4, 4095 }; // Has duplicate ("4")
inputIndexes = Arrays.stream(arrInputIndexes).map(i -> i * cellsPerColumn).toArray();
System.out.println("result = " + Arrays.toString(result));
result = SDR.asColumnIndices(
Arrays.stream(inputIndexes).boxed().collect(Collectors.toList()), cellsPerColumn); // "false" is correct state
assertTrue(Arrays.equals(expectedIndexes, result));
}
@Test
public void testCellsAsColumnIndicesList() {
Connections cn = new Connections();
cn.setColumnDimensions(new int[] { 64, 64 });
cn.setCellsPerColumn(4);
TemporalMemory.init(cn);
int[] expectedIndexes = { 0, 3, 4, 4095 };
int[] inputIndices = Arrays.stream(expectedIndexes).map(i -> i * cn.getCellsPerColumn()).toArray();
List<Cell> cells = new ArrayList<Cell>(cn.getCellSet(inputIndices));
int[] result = SDR.cellsToColumns(cells, cn.getCellsPerColumn());
assertTrue(Arrays.equals(expectedIndexes, result));
}
@Test
public void testCellsAsColumnIndicesSet() {
Connections cn = new Connections();
cn.setColumnDimensions(new int[] { 64, 64 });
cn.setCellsPerColumn(4);
TemporalMemory.init(cn);
int[] expectedIndexes = { 0, 3, 4, 4095 };
int[] inputIndices = Arrays.stream(expectedIndexes).map(i -> i * cn.getCellsPerColumn()).toArray();
Set<Cell> cells = cn.getCellSet(inputIndices);
int[] result = SDR.cellsAsColumnIndices(cells, cn.getCellsPerColumn());
assertTrue(Arrays.equals(expectedIndexes, result));
}
}