package edu.stanford.nlp.sempre.tables.alignment; import java.util.HashMap; import java.util.Map; import java.util.Set; import fig.basic.Pair; class DoubleMap { private Map<Pair<String, String>, Double> m; public DoubleMap() { m = new HashMap<>(); } public double get(Pair<String, String> k) { Double v = m.get(k); return v == null ? 0.0 : v; } public double get(String k1, String k2) { return get(new Pair<>(k1, k2)); } public void put(Pair<String, String> k, double v) { m.put(k, v); } public void put(String k1, String k2, double v) { put(new Pair<>(k1, k2), v); } public void incr(Pair<String, String> k, double v) { Double oldV = m.get(k); m.put(k, (oldV == null ? 0.0 : oldV) + v); } public void incr(String k1, String k2, double v) { incr(new Pair<>(k1, k2), v); } public void reverseKeys() { Map<Pair<String, String>, Double> newM = new HashMap<>(); for (Map.Entry<Pair<String, String>, Double> entry : m.entrySet()) { newM.put(entry.getKey().reverse(), entry.getValue()); } m = newM; } public DoubleMap getReverseKeys() { DoubleMap newM = new DoubleMap(); for (Map.Entry<Pair<String, String>, Double> entry : m.entrySet()) { newM.put(entry.getKey().reverse(), entry.getValue()); } return newM; } public Set<Map.Entry<Pair<String, String>, Double>> entrySet() { return m.entrySet(); } public static DoubleMap product(DoubleMap dm1, DoubleMap dm2) { DoubleMap dmp = new DoubleMap(); for (Map.Entry<Pair<String, String>, Double> entry : dm1.entrySet()) { double v1 = entry.getValue(), v2 = dm2.get(entry.getKey()); if (v1 * v2 > 0) dmp.put(entry.getKey(), v1 * v2); } return dmp; } // A DoubleMap that returns the same value always. static class ConstantDoubleMap extends DoubleMap { private final double value; public ConstantDoubleMap(double value) { this.value = value; } public double get(Pair<String, String> k) { return value; } public double get(String k1, String k2) { return value; } public void put(Pair<String, String> k, double v) { throw new RuntimeException("cannot put"); } public void put(String k1, String k2, double v) { throw new RuntimeException("cannot put"); } public void incr(Pair<String, String> k, double v) { throw new RuntimeException("cannot incr"); } public void incr(String k1, String k2, double v) { throw new RuntimeException("cannot incr"); } public void reverseKeys() { } public DoubleMap getReverseKeys() { return this; } public Set<Map.Entry<Pair<String, String>, Double>> entrySet() { throw new RuntimeException("cannot entrySet"); } } }