/*******************************************************************************
* Copyright (c) 2013 Darmstadt University of Technology.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Andreas Sewe - initial API and implementation
******************************************************************************/
package org.eclipse.recommenders.jayes.io;
import static org.eclipse.recommenders.jayes.io.Equality.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import org.eclipse.recommenders.commons.bayesnet.CommonsReader;
import org.eclipse.recommenders.commons.bayesnet.CommonsWriter;
import org.eclipse.recommenders.jayes.BayesNet;
import org.eclipse.recommenders.jayes.BayesNode;
import org.eclipse.recommenders.jayes.io.jbif.JayesBifReader;
import org.eclipse.recommenders.jayes.io.jbif.JayesBifWriter;
import org.eclipse.recommenders.jayes.io.xdsl.XDSLReader;
import org.eclipse.recommenders.jayes.io.xdsl.XDSLWriter;
import org.eclipse.recommenders.jayes.io.xmlbif.XMLBIFReader;
import org.eclipse.recommenders.jayes.io.xmlbif.XMLBIFWriter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import com.google.common.collect.Lists;
@RunWith(Parameterized.class)
public class RoundTripTest {
private final Class<? extends IBayesNetReader> readerClass;
private final Class<? extends IBayesNetWriter> writerClass;
public RoundTripTest(Class<? extends IBayesNetReader> readerClass, Class<? extends IBayesNetWriter> writerClass) {
this.readerClass = readerClass;
this.writerClass = writerClass;
}
@Parameters(name = "{0}")
public static Collection<Object[]> scenarios() {
LinkedList<Object[]> scenarios = Lists.newLinkedList();
scenarios.add(scenario(JayesBifReader.class, JayesBifWriter.class));
scenarios.add(scenario(XDSLReader.class, XDSLWriter.class));
scenarios.add(scenario(XMLBIFReader.class, XMLBIFWriter.class));
scenarios.add(scenario(CommonsReader.class, CommonsWriter.class));
return scenarios;
}
private static Object[] scenario(Class<? extends IBayesNetReader> readerClass,
Class<? extends IBayesNetWriter> writerClass) {
return new Object[] { readerClass, writerClass };
}
@Test
public void testTopologicallySortedNetwork() throws Exception {
BayesNet netBefore = new BayesNet();
BayesNode a = netBefore.createNode("A");
a.addOutcomes("t", "f");
a.setProbabilities(0.4, 0.6);
BayesNode b = netBefore.createNode("B");
b.addOutcomes("t", "f");
b.setParents(Arrays.asList(a));
b.setProbabilities(0.4, 0.6, 0.7, 0.3);
BayesNet netAfter = read(write(netBefore));
assertThat(netAfter, is(equalTo(netBefore)));
}
/**
* Tests a network where the nodes are not topologically sorted. The data format should not depend on the assumption
* that parents have a lower ID than their children.
*/
@Test
public void testNonTopologicallySortedNetwork() throws Exception {
BayesNet netBefore = new BayesNet();
BayesNode a = netBefore.createNode("A");
a.addOutcomes("t", "f");
BayesNode b = netBefore.createNode("B");
b.addOutcomes("t", "f");
a.setParents(Arrays.asList(b));
a.setProbabilities(0.4, 0.6, 0.7, 0.3);
b.setProbabilities(0.4, 0.6);
BayesNet netAfter = read(write(netBefore));
assertThat(netAfter, is(equalTo(netBefore)));
}
@Test
public void testNetworkWith3Outcomes() throws Exception {
BayesNet netBefore = new BayesNet();
BayesNode a = netBefore.createNode("A");
a.addOutcomes("t", "f", "a");
a.setProbabilities(0.3, 0.3, 0.4);
BayesNode b = netBefore.createNode("B");
b.addOutcomes("t", "f", "u");
b.setParents(Arrays.asList(a));
b.setProbabilities(0.4, 0.6, 0.0, 0.0, 0.7, 0.3, 0.1, 0.2, 0.7);
BayesNet netAfter = read(write(netBefore));
assertThat(netAfter, is(equalTo(netBefore)));
}
@Test
public void testEscapes() throws Exception {
BayesNet netBefore = new BayesNet();
BayesNode node1 = netBefore.createNode("i am spec/al");
node1.addOutcomes(" ", "/", "#", "+", "ΓΌ");
node1.setProbabilities(0.1, 0.1, 0.1, 0.1, 0.6);
BayesNet netAfter = read(write(netBefore));
assertThat(netAfter, is(equalTo(netBefore)));
}
private BayesNet read(InputStream in) throws Exception {
IBayesNetReader reader = readerClass.getConstructor(InputStream.class).newInstance(in);
BayesNet net = reader.read();
reader.close();
return net;
}
private InputStream write(BayesNet net) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
IBayesNetWriter writer = writerClass.getConstructor(OutputStream.class).newInstance(out);
writer.write(net);
writer.close();
return new ByteArrayInputStream(out.toByteArray());
}
}