package pitt.search.semanticvectors.orthography;

import static org.junit.Assert.*;

import org.junit.Test;

import pitt.search.semanticvectors.FlagConfig;
import pitt.search.semanticvectors.VectorStoreRAM;

public class NumberRepresentationTest {
  /** Tolerance of errors for float and double comparisons. */
  public static final double TOL = 0.01;

  @Test
  public void testCreateAndGetNumberVectors() {
    FlagConfig flagConfig = FlagConfig.getFlagConfig(
        new String[] {"-vectortype", "real", "-dimension", "200"});
    NumberRepresentation numberRepresentation = new NumberRepresentation(flagConfig);
    
    VectorStoreRAM vsr2 = numberRepresentation.getNumberVectors(0, 2);
    assertEquals(5, vsr2.getNumVectors());
    
    VectorStoreRAM vsr4 = numberRepresentation.getNumberVectors(0, 4);
    assertEquals(7, vsr4.getNumVectors());
    
    // The beginning and end vectors should be the same in all cases.
    assertEquals(1.0, vsr2.getVector(0).measureOverlap(vsr4.getVector(0)), TOL);
    assertEquals(1.0, vsr2.getVector(2).measureOverlap(vsr4.getVector(4)), TOL);
  }
  
  @Test
  public void testVectorsNearerToBeginningOrEnd() {
    FlagConfig flagConfig = FlagConfig.getFlagConfig(
        new String[] {"-vectortype", "binary", "-dimension", "2048"});
    NumberRepresentation numberRepresentation = new NumberRepresentation(flagConfig);
    
    VectorStoreRAM vsr = numberRepresentation.getNumberVectors(0, 4);
    assertTrue(vsr.getVector(0).measureOverlap(vsr.getVector(1))
        > vsr.getVector(4).measureOverlap(vsr.getVector(1)));
    assertTrue(vsr.getVector(4).measureOverlap(vsr.getVector(3))
        > vsr.getVector(3).measureOverlap(vsr.getVector(0)));
    /** This "half-way" equality isn't exact, demonstrating that I don't exactly understand
     * the process. -DW. */
    assertEquals(vsr.getVector(4).measureOverlap(vsr.getVector(2)),
        vsr.getVector(2).measureOverlap(vsr.getVector(0)), 0.05);
  }
  
  @Test
  public void testBinaryVectorsChangeGradually() {
    FlagConfig flagConfig = FlagConfig.getFlagConfig(
        new String[] {"-vectortype", "binary", "-dimension", "2048"});
    NumberRepresentation numberRepresentation = new NumberRepresentation(flagConfig);
    
    VectorStoreRAM vsr = numberRepresentation.getNumberVectors(0, 4);
    assertEquals(0.75, vsr.getVector(0).measureOverlap(vsr.getVector(1)), TOL);
  }
  
  @Test
  public void testAbsoluteValuesOfEndpointsDontMatter() {
    FlagConfig flagConfig = FlagConfig.getFlagConfig(
        new String[] {"-vectortype", "binary", "-dimension", "2048"});
    NumberRepresentation numberRepresentation = new NumberRepresentation(flagConfig);
    
    VectorStoreRAM vsr1 = numberRepresentation.getNumberVectors(0, 4);    
    VectorStoreRAM vsr2 = numberRepresentation.getNumberVectors(8, 12);
    assertEquals(1.0, vsr1.getVector(0).measureOverlap(vsr2.getVector(8)), TOL);
    assertEquals(1.0, vsr1.getVector(2).measureOverlap(vsr2.getVector(10)), TOL); 
  }
}