/*
* File: MatrixBasedTermSimilarityNetworkTest.java
* Authors: Justin Basilico
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright March 18, 2009, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government. Export
* of this program may require a license from the United States Government.
* See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.text.term.relation;
import gov.sandia.cognition.collection.CollectionUtil;
import gov.sandia.cognition.math.matrix.DimensionalityMismatchException;
import gov.sandia.cognition.math.matrix.Matrix;
import gov.sandia.cognition.math.matrix.MatrixFactory;
import gov.sandia.cognition.text.term.DefaultIndexedTerm;
import gov.sandia.cognition.text.term.DefaultTerm;
import gov.sandia.cognition.text.term.DefaultTermIndex;
import gov.sandia.cognition.text.term.IndexedTerm;
import gov.sandia.cognition.text.term.Term;
import java.util.LinkedList;
import java.util.Set;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for class MatrixBasedTermSimilarityNetwork.
*
* @author Justin Basilico
* @since 3.0
*/
public class MatrixBasedTermSimilarityNetworkTest
{
protected DefaultTerm termA = new DefaultTerm("a");
protected DefaultTerm termB = new DefaultTerm("b");
protected DefaultTerm termC = new DefaultTerm("c");
protected DefaultTerm termD = new DefaultTerm("d");
protected IndexedTerm indexedTermA;
protected IndexedTerm indexedTermB;
protected IndexedTerm indexedTermC;
protected IndexedTerm indexedTermD;
protected DefaultTermIndex defaultTermIndex;
protected Term[] exampleTerms;
protected IndexedTerm[] exampleIndexedTerms;
protected double[][] exampleSimilarityValues;
protected Matrix exampleSimilarities;
/**
* Creates a new test.
*/
public MatrixBasedTermSimilarityNetworkTest()
{
this.defaultTermIndex = new DefaultTermIndex();
this.indexedTermA = this.defaultTermIndex.add(termA);
this.indexedTermB = this.defaultTermIndex.add(termB);
this.indexedTermC = this.defaultTermIndex.add(termC);
this.indexedTermD = this.defaultTermIndex.add(termD);
this.exampleTerms = new Term[] { termA, termB, termC, termD };
this.exampleIndexedTerms = new IndexedTerm[] { indexedTermA, indexedTermB, indexedTermC, indexedTermD };
this.exampleSimilarityValues = new double[][] {
{ 1.0, 0.5, 0.0, 0.0 },
{ 0.5, 1.0, 0.1, 0.0 },
{ 1.0, 0.1, 1.0, 0.0 },
{ 0.0, 0.0, 0.0, 0.0 }
};
this.exampleSimilarities = MatrixFactory.getDefault().copyArray(
this.exampleSimilarityValues);
}
public MatrixBasedTermSimilarityNetwork createExampleNetwork()
{
DefaultTermIndex termIndex = this.defaultTermIndex;
return new MatrixBasedTermSimilarityNetwork(termIndex, exampleSimilarities);
}
/**
* Test of constructors of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testConstructors()
{
DefaultTermIndex termIndex = new DefaultTermIndex();
Matrix similarities = MatrixFactory.getDefault().createMatrix(0, 0);
MatrixBasedTermSimilarityNetwork instance =
new MatrixBasedTermSimilarityNetwork(termIndex, similarities);
assertSame(termIndex, instance.getTermIndex());
assertSame(similarities, instance.getSimilarities());
boolean exceptionThrown = false;
try
{
instance = new MatrixBasedTermSimilarityNetwork(termIndex, MatrixFactory.getDefault().createMatrix(0, 2));
}
catch (DimensionalityMismatchException e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance = new MatrixBasedTermSimilarityNetwork(termIndex, MatrixFactory.getDefault().createMatrix(2, 0));
}
catch (DimensionalityMismatchException e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
exceptionThrown = false;
try
{
instance = new MatrixBasedTermSimilarityNetwork(termIndex, MatrixFactory.getDefault().createMatrix(2, 2));
}
catch (DimensionalityMismatchException e)
{
exceptionThrown = true;
}
finally
{
assertTrue(exceptionThrown);
}
}
/**
* Test of getSimilarity method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetSimilarity_Term_Term()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
for (int j = 0; j < exampleTerms.length; j++)
{
assertEquals(this.exampleSimilarityValues[i][j],
instance.getSimilarity(exampleTerms[i], exampleTerms[j]),
0.0);
}
}
assertEquals(0.0, instance.getSimilarity(new DefaultTerm("no"),
new DefaultTerm("no")), 0.0);
assertEquals(0.0, instance.getSimilarity((Term) null, null), 0.0);
assertEquals(0.0, instance.getSimilarity(null, new DefaultTerm("no")), 0.0);
assertEquals(0.0, instance.getSimilarity(new DefaultTerm("no"), null), 0.0);
}
/**
* Test of getSimilarity method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetSimilarity_IndexedTerm_IndexedTerm()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
for (int j = 0; j < exampleTerms.length; j++)
{
assertEquals(this.exampleSimilarityValues[i][j],
instance.getSimilarity(exampleIndexedTerms[i], exampleIndexedTerms[j]),
0.0);
}
}
assertEquals(0.0, instance.getSimilarity((IndexedTerm) null, null), 0.0);
assertEquals(0.0, instance.getSimilarity(null, new DefaultIndexedTerm(-1, new DefaultTerm("no"))), 0.0);
assertEquals(0.0, instance.getSimilarity(new DefaultIndexedTerm(-1, new DefaultTerm("no")), null), 0.0);
}
/**
* Test of getSimilarity method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetSimilarity_int_int()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
for (int j = 0; j < exampleTerms.length; j++)
{
assertEquals(this.exampleSimilarityValues[i][j],
instance.getSimilarity(i, j),
0.0);
}
}
}
/**
* Test of getObjectCount method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetObjectCount()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
assertEquals(this.exampleTerms.length, instance.getObjectCount());
}
/**
* Test of getObjects method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetObjects()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
assertArrayEquals(this.exampleIndexedTerms, instance.getObjects().toArray());
}
/**
* Test of isObject method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testIsObject()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (IndexedTerm term : this.exampleIndexedTerms)
{
assertTrue(instance.isObject(term));
}
assertFalse(instance.isObject(new DefaultIndexedTerm(-1, new DefaultTerm("no"))));
assertFalse(instance.isObject(null));
assertFalse(instance.isObject(new Object()));
}
/**
* Test of hasRelation method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testHasRelation()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
assertTrue(instance.hasRelation(indexedTermA, indexedTermB));
assertTrue(instance.hasRelation(indexedTermB, indexedTermA));
assertFalse(instance.hasRelation(indexedTermA, indexedTermC));
assertTrue(instance.hasRelation(indexedTermC, indexedTermA));
assertFalse(instance.hasRelation(indexedTermA, null));
assertFalse(instance.hasRelation(null, indexedTermA));
}
/**
* Test of getRelation method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetRelation()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm source = this.exampleIndexedTerms[i];
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm target = this.exampleIndexedTerms[j];
double similarity = this.exampleSimilarityValues[i][j];
IndexedTermSimilarityRelation relation = instance.getRelation(
source, target);
if (similarity == 0.0)
{
assertNull(relation);
}
else
{
assertNotNull(relation);
assertSame(source, relation.getSource());
assertSame(target, relation.getTarget());
assertEquals(similarity, relation.getSimilarity(), 0.0);
}
}
}
assertNull(instance.getRelation(indexedTermA, null));
assertNull(instance.getRelation(null, indexedTermA));
}
/**
* Test of getAllRelations method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetAllRelations()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm source = this.exampleIndexedTerms[i];
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm target = this.exampleIndexedTerms[j];
double similarity = this.exampleSimilarityValues[i][j];
Set<IndexedTermSimilarityRelation> relations =
instance.getAllRelations(source, target);
if (similarity == 0.0)
{
assertTrue(relations.isEmpty());
}
else
{
assertEquals(1, relations.size());
IndexedTermSimilarityRelation relation = CollectionUtil.getFirst(relations);
assertNotNull(relation);
assertSame(source, relation.getSource());
assertSame(target, relation.getTarget());
assertEquals(similarity, relation.getSimilarity(), 0.0);
}
}
}
assertTrue(instance.getAllRelations(indexedTermA, null).isEmpty());
assertTrue(instance.getAllRelations(null, indexedTermA).isEmpty());
}
/**
* Test of getRelationSource method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetRelationSource()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm source = this.exampleIndexedTerms[i];
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm target = this.exampleIndexedTerms[j];
IndexedTermSimilarityRelation relation = instance.getRelation(
source, target);
if (relation != null)
{
assertSame(source, instance.getRelationSource(relation));
}
}
}
assertNull(instance.getRelationSource(null));
}
/**
* Test of getRelationTarget method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetRelationTarget()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm source = this.exampleIndexedTerms[i];
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm target = this.exampleIndexedTerms[j];
IndexedTermSimilarityRelation relation = instance.getRelation(
source, target);
if (relation != null)
{
assertSame(target, instance.getRelationTarget(relation));
}
}
}
assertNull(instance.getRelationTarget(null));
}
/**
* Test of relationsOf method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testRelationsOf()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm term = this.exampleIndexedTerms[i];
LinkedList<IndexedTermSimilarityRelation> expected =
new LinkedList<IndexedTermSimilarityRelation>();
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm other = this.exampleIndexedTerms[j];
IndexedTermSimilarityRelation relation = instance.getRelation(
term, other);
if (relation != null)
{
expected.add(relation);
}
if (i != j)
{
relation = instance.getRelation(
other, term);
if (relation != null)
{
expected.add(relation);
}
}
}
Set<IndexedTermSimilarityRelation> result =
instance.relationsOf(term);
assertEquals(expected.size(), result.size());
assertTrue(expected.containsAll(result));
assertTrue(result.containsAll(expected));
}
}
/**
* Test of relationsFrom method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testRelationsFrom()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm source = this.exampleIndexedTerms[i];
LinkedList<IndexedTermSimilarityRelation> expected =
new LinkedList<IndexedTermSimilarityRelation>();
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm target = this.exampleIndexedTerms[j];
IndexedTermSimilarityRelation relation = instance.getRelation(
source, target);
if (relation != null)
{
expected.add(relation);
}
}
assertArrayEquals(expected.toArray(), instance.relationsFrom(source).toArray());
}
}
/**
* Test of relationsTo method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testRelationsTo()
{
MatrixBasedTermSimilarityNetwork instance = this.createExampleNetwork();
for (int i = 0; i < exampleTerms.length; i++)
{
IndexedTerm target = this.exampleIndexedTerms[i];
LinkedList<IndexedTermSimilarityRelation> expected =
new LinkedList<IndexedTermSimilarityRelation>();
for (int j = 0; j < exampleTerms.length; j++)
{
IndexedTerm source = this.exampleIndexedTerms[j];
IndexedTermSimilarityRelation relation = instance.getRelation(
source, target);
if (relation != null)
{
expected.add(relation);
}
}
assertArrayEquals(expected.toArray(), instance.relationsTo(target).toArray());
}
}
/**
* Test of getTermIndex method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetTermIndex()
{
this.testSetTermIndex();
}
/**
* Test of setTermIndex method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testSetTermIndex()
{
DefaultTermIndex termIndex = new DefaultTermIndex();
Matrix similarities = MatrixFactory.getDefault().createMatrix(0, 0);
MatrixBasedTermSimilarityNetwork instance =
new MatrixBasedTermSimilarityNetwork(termIndex, similarities);
assertSame(termIndex, instance.getTermIndex());
termIndex = new DefaultTermIndex();
instance.setTermIndex(termIndex);
assertSame(termIndex, instance.getTermIndex());
termIndex = null;
instance.setTermIndex(termIndex);
assertSame(termIndex, instance.getTermIndex());
}
/**
* Test of getSimilarities method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testGetSimilarities()
{
this.testSetSimilarities();
}
/**
* Test of setSimilarities method, of class MatrixBasedTermSimilarityNetwork.
*/
@Test
public void testSetSimilarities()
{
Matrix similarities = MatrixFactory.getDefault().createMatrix(0, 0);
MatrixBasedTermSimilarityNetwork instance =
new MatrixBasedTermSimilarityNetwork(
new DefaultTermIndex(), similarities);
assertSame(similarities, instance.getSimilarities());
similarities = MatrixFactory.getDefault().createMatrix(10, 10);
instance.setSimilarities(similarities);
assertSame(similarities, instance.getSimilarities());
similarities = null;
instance.setSimilarities(similarities);
assertSame(similarities, instance.getSimilarities());
}
}