/** * */ package edu.berkeley.nlp.PCFGLA.smoothing; import java.io.Serializable; import edu.berkeley.nlp.PCFGLA.BinaryCounterTable; import edu.berkeley.nlp.PCFGLA.BinaryRule; import edu.berkeley.nlp.PCFGLA.UnaryCounterTable; import edu.berkeley.nlp.PCFGLA.UnaryRule; import edu.berkeley.nlp.util.Numberer; /** * @author leon * */ public class SmoothAcrossParentSubstate implements Smoother, Serializable { /** * */ private static final long serialVersionUID = 1L; double same; double different; public SmoothAcrossParentSubstate(double smooth) { different = smooth; same = 1-different; } /* (non-Javadoc) * @see edu.berkeley.nlp.PCFGLA.smoothing.Smoother#smooth(edu.berkeley.nlp.util.UnaryCounterTable, edu.berkeley.nlp.util.BinaryCounterTable) */ public void smooth(UnaryCounterTable unaryCounter, BinaryCounterTable binaryCounter) { for (UnaryRule r : unaryCounter.keySet()) { double[][] scores = unaryCounter.getCount(r); double[][] scopy = new double[scores.length][]; for (int j=0; j<scores.length; j++) { if (scores[j]==null) continue; //nothing to smooth scopy[j] = new double[scores[j].length]; double diff = different/(scores[j].length-1); for (int i=0; i<scores[j].length; i++) { for (int k=0; k<scores[j].length; k++) { scopy[j][i] += (i==k ? same : (diff)) * scores[j][k]; } } } unaryCounter.setCount(r,scopy); } for (BinaryRule r : binaryCounter.keySet()) { double[][][] scores = binaryCounter.getCount(r); double[][][] scopy = new double[scores.length][scores[0].length][]; for (int j=0; j<scores.length; j++) { for (int l=0; l<scores[0].length; l++) { if (scores[j][l]==null) continue; //nothing to smooth scopy[j][l] = new double[scores[j][l].length]; double diff = different/(scores[j][l].length-1); for (int i=0; i<scores[j][l].length; i++) { for (int k=0; k<scores[j][l].length; k++) { scopy[j][l][i] += (i==k ? same : (diff)) * scores[j][l][k]; } } } } binaryCounter.setCount(r,scopy); } } /* (non-Javadoc) * @see edu.berkeley.nlp.PCFGLA.smoothing.Smoother#smooth(short, float[]) */ public void smooth(short tag, double[] scores) { double[] scopy = new double[scores.length]; for (int i=0; i<scores.length; i++) { double diff = different/(scores.length-1); for (int k=0; k<scores.length; k++) { scopy[i] += (i==k ? same : (diff)) * scores[k]; } } for (int i=0; i<scores.length; i++) { scores[i] = scopy[i]; } } /* (non-Javadoc) * @see edu.berkeley.nlp.PCFGLA.smoothing.Smoother#updateWeights(int[][]) */ public void updateWeights(int[][] toSubstateMapping) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see edu.berkeley.nlp.PCFGLA.smoothing.Smoother#copy() */ public Smoother copy() { return new SmoothAcrossParentSubstate(different); } /* (non-Javadoc) * @see edu.berkeley.nlp.PCFGLA.smoothing.Smoother#remapStates(edu.berkeley.nlp.util.Numberer, edu.berkeley.nlp.util.Numberer) */ public Smoother remapStates(Numberer thisNumberer, Numberer newNumberer) { return copy(); } }