/context-management/UserContextRefinement/src/test/java/xbneditor/CountGraphErrors.java
https://github.com/societies/SOCIETIES-Platform · Java · 371 lines · 251 code · 71 blank · 49 comment · 20 complexity · 1ce3a9577ee8dc622f6702a64223fa58 MD5 · raw file
- package xbneditor;
-
- import java.io.*;
- import java.util.*;
-
- /**
- * This is a class that takes in a generated Bayesian network and a gold
- * standard bayesian network and will look for different graph error
- * calculations that have been found within them.
- *
- * @author Laura Kruse
- * @version v1.0
- */
- public class CountGraphErrors {
- private LinkedList currentbn;
-
- private int[][] goldstandard;
- private int[][] current;
-
- private Hashtable nodenames;
- private Hashtable mapped;
-
- private String filename;
-
- private int size;
-
- /**
- * This takes in the current Bayesian network and the filename of
- * the gold standard network so that the generated network can be
- * compared to the gold standard network for errors.
- *
- * @param currentbn the Bayesian Network that was generated
- * @param filename the name of the file in which the gold standard
- * network is stored
- */
- public CountGraphErrors(LinkedList currentbn, String filename) {
- //System.out.println("LinkedList, String constructor");
- this.currentbn = currentbn;
- this.filename = filename;
-
- size = currentbn.size();
-
- goldstandard = new int[size][size];
- current = new int[size][size];
-
- nodenames = new Hashtable();
- mapped = new Hashtable();
-
- populateHash();
- }
-
- /**
- * This function takes in two file names. One is the generated
- * bayesian network and the other is the gold standard bayesian
- * network.
- *
- * @param fncurrent the generated bayesian network
- * @param filename the gold standard bayesian network
- */
- public CountGraphErrors(String fncurrent, String filename) {
- //System.out.println("String, String Constructor");
- //System.out.println("K2: " + fncurrent);
- //System.out.println("GS: " + filename);
- FileIO file;
-
- file = new FileIO();
-
- currentbn = file.load(fncurrent);
- this.filename = filename;
-
- size = currentbn.size();
- //System.out.println("size = " + size);
-
- goldstandard = new int[size][size];
- current = new int[size][size];
-
- nodenames = new Hashtable();
- mapped = new Hashtable();
-
- populateHash();
- }
-
- /**
- * This function locates all of the names in the network and puts them
- * into a hash table so that it can be easily determined where a
- * node is in the comparison array.
- */
- private void populateHash() {
- String name;
-
- for(int i=0;i<size;i++) {
- name = ((Item) currentbn.get(i)).getItem().getBlockName();
- nodenames.put(name, new Integer(i));
- mapped.put(new Integer(i), name);
- }
-
- getBNStandard();
- getGoldStandard();
- }
-
- /**
- * This function retrieves the generated bayesian network and stores
- * the location of the arcs and direction in an array.
- */
- private void getBNStandard() {
- Item item;
-
- String name1;
- String name2;
-
- int num1;
- int num2;
-
- int parents;
-
- for(int i=0;i<size;i++) {
- item = (Item) currentbn.get(i);
- name1 = item.getItem().getBlockName();
-
- num1 = ((Integer) nodenames.get(name1)).intValue();
-
- parents = item.numParents();
-
- for(int j=0;j<parents;j++) {
- name2 = item.getParent(j).getItem().getBlockName();
- num2 = ((Integer) nodenames.get(name2)).intValue();
- current[num1][num2] = 1;
- }
- }
-
- //return current;
- }
-
- /**
- * This function retireves the gold standard bayesian network and
- * puts the location of the arcs of the nodes into an array.
- */
- private void getGoldStandard() {
- String content;
-
- if(filename != null) {
- content = readGSFile(filename);
-
- // look for the different file format cases here
- // decide what function to parse them based on this
- // this should return a populated table
- if(content.indexOf("BIF VERSION=\"0.3\"") > 0) {
- getXMLGoldStandard(content, true);
- } else if(content.indexOf("<BIF>") > 0) {
- getXMLGoldStandard(content, false);
- } else {
- getBIFGoldStandard(content);
- }
- }
-
- //return goldstandard;
- }
-
- private String readGSFile(String filename) {
- StringBuffer sbuf;
- BufferedReader infile;
-
- sbuf = new StringBuffer();
-
- try {
- infile = new BufferedReader(new FileReader(filename));
-
- while(infile.ready()) {
- sbuf.append(infile.readLine());
- }
- } catch(FileNotFoundException fnfe) {
- fnfe.printStackTrace();
- } catch(IOException ioe) {
- ioe.printStackTrace();
- }
-
- return sbuf.toString();
- }
-
- private void getXMLGoldStandard(String sbuf, boolean currentVer) {
- int startDefinition;
- int endDefinition;
-
- if(currentVer) {
- startDefinition = sbuf.indexOf("<DEFINITION>");
- endDefinition = sbuf.indexOf("</DEFINITION>");
- } else {
- startDefinition = sbuf.indexOf("<PROBABILITY>");
- endDefinition = sbuf.indexOf("</PROBABILITY>");
- }
-
- while(startDefinition > 0) {
- getXMLGoldStandardNames(sbuf.substring(startDefinition, endDefinition));
-
- if(currentVer) {
- startDefinition = sbuf.indexOf("<DEFINITION>", endDefinition);
- endDefinition = sbuf.indexOf("</DEFINITION>", startDefinition);
- } else {
- startDefinition = sbuf.indexOf("<PROBABILITY>", endDefinition);
- endDefinition = sbuf.indexOf("</PROBABILITY>", startDefinition);
- }
- }
- }
-
- private void getBIFGoldStandard(String sbuf) {
- int startDefinition;
- int endDefinition;
-
- startDefinition = sbuf.indexOf("probability (");
- endDefinition = sbuf.indexOf("}", startDefinition);
-
- while(startDefinition > 0) {
- getBIFGoldStandardNames(sbuf.substring(startDefinition, endDefinition));
-
- startDefinition = sbuf.indexOf("probability (", endDefinition);
- endDefinition = sbuf.indexOf("}", startDefinition);
- }
- }
-
- private void getXMLGoldStandardNames(String sbuf) {
- int startFor;
- int endFor;
-
- int startGiven;
- int endGiven;
-
- String name1;
- String name2;
-
- int num1;
- int num2;
-
- startFor = sbuf.indexOf("<FOR>");
- endFor = sbuf.indexOf("</FOR>");
-
- name1 = sbuf.substring(startFor + 5, endFor);
- num1 = ((Integer) nodenames.get(name1)).intValue();
-
- startGiven = sbuf.indexOf("<GIVEN>", endFor);
- endGiven = sbuf.indexOf("</GIVEN>", startGiven);
-
- while(startGiven > startFor) {
- name2 = sbuf.substring(startGiven + 7, endGiven);
- num2 = ((Integer) nodenames.get(name2)).intValue();
-
- // do something to put the 1 or 0 in the table here
- goldstandard[num1][num2] = 1;
-
- startGiven = sbuf.indexOf("<GIVEN>", endGiven);
- endGiven = sbuf.indexOf("</GIVEN>", startGiven);
- }
- }
-
- private void getBIFGoldStandardNames(String sbuf) {
- int startFor;
- int endFor;
-
- int startGiven;
- int endGiven;
-
- String name1;
- String name2;
- String tmp;
-
- int num1;
- int num2;
-
- startFor = sbuf.indexOf("(") + 1;
- endFor = sbuf.indexOf(")", startFor) - 1;
-
- tmp = trimexcess(sbuf.substring(startFor, endFor));
-
- if((startGiven = tmp.indexOf(" ")) > 0) {
- name1 = tmp.substring(0, startGiven);
- tmp = trimexcess(tmp.substring(startGiven));
-
- if((endGiven = tmp.indexOf(" ")) < 0) {
- endGiven = tmp.length();
- }
- } else {
- name1 = tmp;
- endGiven = -1;
- }
-
- num1 = ((Integer) nodenames.get(name1)).intValue();
-
- while(startGiven > 0) {
- name2 = tmp.substring(0, endGiven);
- num2 = ((Integer) nodenames.get(name2)).intValue();
-
- goldstandard[num1][num2] = 1;
-
- tmp = trimexcess(tmp.substring(endGiven));
- endGiven = tmp.indexOf(" ");
-
- if(endGiven < 0 && tmp.length() <= 0) {
- startGiven = -1;
- } else if(endGiven < 0) {
- endGiven = tmp.length();
- }
- }
- }
-
- private String trimexcess(String sbuf) {
- sbuf = sbuf.replace('"', ' ');
- sbuf = sbuf.replace('|', ' ');
- sbuf = sbuf.replace(',', ' ');
-
- return sbuf.trim();
- }
-
- public String countErrorAddition() {
- StringBuffer ret;
- ret = new StringBuffer();
-
- for(int i=0;i<size;i++) {
- for(int j=i+1;j<size;j++) {
- if(current[i][j] + current[j][i] > goldstandard[i][j] + goldstandard[j][i]) {
- if(current[i][j] == 1) {
- ret.append(mapped.get(new Integer(j)) + "->" + mapped.get(new Integer(i)) + " ");
- } else {
- ret.append(mapped.get(new Integer(i)) + "->" + mapped.get(new Integer(j)) + " ");
- }
- }
- }
- }
-
- //System.out.println("Addition: " + ret);
- return ret.toString();
- }
-
- public String countErrorDeletion() {
- StringBuffer ret;
- ret = new StringBuffer();
-
- for(int i=0;i<size;i++) {
- for(int j=i+1;j<size;j++) {
- if(current[i][j] + current[j][i] < goldstandard[i][j] + goldstandard[j][i]) {
- if(goldstandard[i][j] == 1) {
- ret.append(mapped.get(new Integer(j)) + "->" + mapped.get(new Integer(i)) + " ");
- } else {
- ret.append(mapped.get(new Integer(i)) + "->" + mapped.get(new Integer(j)) + " ");
- }
- }
- }
- }
-
- //System.out.println("Deletion: " + ret);
- return ret.toString();
- }
-
- public String countErrorReversal() {
- StringBuffer ret;
- ret = new StringBuffer();
-
- for(int i=0;i<size;i++) {
- for(int j=i+1;j<size;j++) {
- if((current[i][j] == goldstandard[j][i] && goldstandard[j][i] == 1) || (current[j][i] == goldstandard[i][j] && goldstandard[i][j] == 1)) {
- if(current[i][j] == goldstandard[j][i] && goldstandard[j][i] == 1) {
- ret.append(mapped.get(new Integer(j)) + "->" + mapped.get(new Integer(i)) + " ");
- } else {
- ret.append(mapped.get(new Integer(i)) + "->" + mapped.get(new Integer(j)) + " ");
- }
- }
- }
- }
-
- //System.out.println("Reversal: " + ret);
- return ret.toString();
- }
- }