package org.seqcode.ml.clustering.affinitypropagation; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Vector; import org.seqcode.ml.clustering.Clusterable; import org.seqcode.ml.clustering.ClusterablePair; import org.seqcode.ml.clustering.SimpleClusterable; /** * @author reeder * */ public class FileSimilarityMeasure<X extends Clusterable> extends SimilarityMeasure<X> { Vector<Vector<Double>> simValues = new Vector<Vector<Double>>(); Vector<Clusterable> objects = new Vector<Clusterable>(); HashMap<ClusterablePair, Double> valuemap; double prefvalue; public FileSimilarityMeasure(String simfile, String divider, double prefvalue) { this.prefvalue = prefvalue; String line = "init"; String[] splitline = new String[1]; valuemap = new HashMap<ClusterablePair, Double>(); try { BufferedReader dataIn = new BufferedReader(new FileReader(simfile)); while (!((line = dataIn.readLine())==null)) { splitline = line.split(divider); SimpleClusterable object1 = new SimpleClusterable(splitline[0]); SimpleClusterable object2 = new SimpleClusterable(splitline[1]); if (!objects.contains(object1)) { objects.add(object1); } if (!objects.contains(object2)) { objects.add(object2); } valuemap.put(new ClusterablePair(object1, object2), Double.valueOf(splitline[2])); } System.err.println("Measures: "+valuemap.size()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* public FileSimilarityMeasure(String simfile, String preffile, String divider, int notused, int notused2) { String line = "init"; String[] splitLine = new String[1]; int objcnt = 0; int idx0, idx1; HashMap<String, Integer> idxmap = new HashMap<String, Integer>(); try { BufferedReader dataIn = new BufferedReader(new FileReader(simfile)); while (!((line = dataIn.readLine())==null)) { splitLine = line.split(divider); if (!idxmap.containsKey(splitLine[0])) { idxmap.put(splitLine[0], objcnt++); names.add(splitLine[0]); } if (!idxmap.containsKey(splitLine[1])) { idxmap.put(splitLine[1], objcnt++); names.add(splitLine[1]); } idx0 = idxmap.get(splitLine[0]); idx1 = idxmap.get(splitLine[1]); if (simValues.size()<=idx0) { simValues.setSize(idx0+1); } if (simValues.get(idx0)==null) { simValues.set(idx0, new Vector<Double>()); } if (simValues.get(idx0).size()<=idx1) { simValues.get(idx0).setSize(idx1+1); } simValues.get(idx0).set(idx1, Double.valueOf(splitLine[2])); } simValues.get(simValues.size()-1).setSize(simValues.size()); BufferedReader prefin = new BufferedReader(new FileReader(preffile)); idx0 = 0; while (!((line = prefin.readLine())==null)) { simValues.get(idx0).set(idx0++, Double.valueOf(line)); } } catch (Exception e) { System.out.println(line); System.out.println(splitLine[0]); e.printStackTrace(); } } */ @Override public void addNoise() { noiseAdded = true; } @Override public double get(int idx0, int idx1) { System.out.println("get shouldn't be called"); if (simValues.get(idx0).get(idx1)==null) { return NEGINF; } else { return simValues.get(idx0).get(idx1); } } @Override public int size() { return objects.size(); } public String getName(int idx) { return objects.get(idx).name(); } /*public double evaluate(Clusterable e1, Clusterable e2) { if (valuemap.containsKey(e1.name()+e2.name())); return 0; }*/ public double evaluate(X e1, X e2) { if (e1.name().equals(e2.name())) { return prefvalue; } else if (valuemap.containsKey(e1.name()+"SEP"+e2.name())) { return valuemap.get(e1.name()+"SEP"+e2.name()); } else if (valuemap.containsKey(e1.name()+"SEP"+e1.name())) { return valuemap.get(e1.name()+"SEP"+e2.name()); } else { return NEGINF; } } public double evaluate(ClusterablePair p) { if (p.symmetric()) { return prefvalue; } else if (valuemap.containsKey(p)) { return valuemap.get(p); } else { return NEGINF; } } public boolean exists(X e1, X e2) { return (e1.name().equals(e2.name())) || (valuemap.containsKey(e1.name()+"SEP"+e2.name())) || (valuemap.containsKey(e1.name()+"SEP"+e1.name())); } public boolean exists(ClusterablePair p) { return p.symmetric() || valuemap.containsKey(p); } public Vector<Clusterable> objects() { return objects; } }