/*
* (C) Copyright 2005 Arnaud Bailly (arnaud.oqube@gmail.com),
* Yves Roos (yroos@lifl.fr) and others.
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rationals.distance;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import rationals.Automaton;
import rationals.graph.AutomatonGraphAdapter;
import rationals.converters.Expression;
import rationals.graph.AutomatonVisualFactory;
import salvo.jesus.graph.algorithm.DirectedGraphDualMatrix;
import fr.lifl.utils.FIDLTestCase;
/**
* @author nono
* @version $Id: DistanceTest.java 5 2006-08-25 13:57:34Z oqube $
*/
public class DistanceTest extends FIDLTestCase {
private Distance distance;
private Distance distance2;
private Automaton a;
/*
* @see TestCase#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
this.a = new Expression().fromString("a(b+c)(ab)*");
this.distance = new DistanceL1(a);
Automaton b = new Expression().fromString("(ab*)(c(ab)*c*)");
this.distance2 = new DistanceL1(b);
}
/**
* Constructor for DistanceTest.
*
* @param arg0
*/
public DistanceTest(String arg0) {
super(arg0);
}
public void testVector() throws FileNotFoundException, IOException {
List w = Arrays.asList(new Object[] { "a", "b", "a", "b" });
int[] vec = distance.vector(w);
System.err.println(distance.getDfa());
System.err.println(distance.indices());
AutomatonVisualFactory.epsOutput(distance.getDfa(),
"fig-sample-dfa-distance.eps", null);
assertEquals(new int[] { 1, 1, 1, 0, 1 }, vec);
}
public void testVectorNull() {
List w = Arrays.asList(new Object[] { "a", "b", "c" });
int[] vec = distance.vector(w);
assertNull(vec);
}
public void testNormalize() {
List w = Arrays.asList(new Object[] { "a", "b", "a", "b" });
double[] norm = distance.normalize(w);
// assertEquals(new double[] { 0.5, 0.5, 0.5, 0.5 }, norm);
}
public void testDistance0() {
List w = Arrays.asList(new Object[] { "a", "b", "a", "b" });
List w2 = Arrays.asList(new Object[] { "a", "b", "a", "b" });
double d = distance.distance(w, w2);
System.err.println(d);
assertEquals((double) 0, (double) d, 0.00000001);
}
public void testDistanceTriangle() {
List w = Arrays.asList(new Object[] { "a", "b", "a", "b" });
List w2 = Arrays.asList(new Object[] { "a", "c", "a", "b", "a" });
List w3 = Arrays.asList(new Object[] { "a", "b", "a", "b", "a" });
double d1 = distance.distance(w, w2);
double d2 = distance.distance(w2, w3);
double d3 = distance.distance(w, w3);
assertTrue(d1 <= d2 + d3);
assertTrue(d2 <= d1 + d3);
assertTrue(d3 <= d2 + d1);
}
public void testDistanceLimit1() {
List w = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
List w2 = new ArrayList(Arrays
.asList(new Object[] { "a", "c", "a", "b" }));
System.out.println("s(" + w + "," + w2 + ") = "
+ distance.distance(w, w2));
for (int i = 0; i < 10; i++) {
w.add("a");
w.add("b");
w2.add("a");
w2.add("b");
System.out.println("s(" + w + "," + w2 + ") = "
+ distance.distance(w, w2));
}
}
public void testDistanceLimit2() {
List w = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
List w2 = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
System.out.println("s(" + w + "," + w2 + ") = "
+ distance.distance(w, w2));
for (int i = 0; i < 10; i++) {
w2.add("a");
w2.add("b");
}
for (int i = 0; i < 10; i++) {
w.add("a");
w.add("b");
System.out.println("s(" + w + "," + w2 + ") = "
+ distance.distance(w, w2));
}
}
public void testDistanceLimit3() {
List w = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
List w2 = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
System.out.println("s(" + w + "," + w2 + ") = "
+ distance.distance(w, w2));
for (int i = 0; i < 100; i++) {
w.add("a");
w.add("b");
System.out.println("s(" + w2 + "^"+i+"," + w2 + ") = "
+ distance.distance(w, w2));
}
}
public void testEta() {
List w2 = new ArrayList(Arrays
.asList(new Object[] { "a", "c", "a", "b", "a", "b"}));
List w = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "a", "b" }));
Set t = new HashSet();
t.add(w2);
t.add(w);
double dmax = distance.etaCoverage(t);
System.err.println("Dmax = "+dmax);
}
/* public void testEtaSet() {
Set ret = distance.etaCoverage(1);
}
*/
public void testDistance2() throws FileNotFoundException, IOException {
System.err.println(distance2.indices());
List w2 = new ArrayList(Arrays
.asList(new Object[] { "a", "c", "c","c"}));
List w = new ArrayList(Arrays
.asList(new Object[] { "a", "b", "b", "b","c","c","c","c" }));
double d= distance2.distance(w2,w);
System.err.println("Distance = "+d);
System.err.println("w2 = "+printArray(distance2.normalize(w2))+", " +"w = "+printArray(distance2.normalize(w)));
AutomatonVisualFactory.epsOutput(distance2.getDfa(),
"fig-sample-dfa-distance2.eps", null);
}
public void testMatrix() {
System.err.println(a);
DirectedGraphDualMatrix am = new DirectedGraphDualMatrix(new AutomatonGraphAdapter(a));
System.err.println(am);
System.err.println(new salvo.jesus.graph.algorithm.Distance(am));
System.err.println(am.polynomial());
}
}