FormulaQuery.java

/*
 * Copyright (c) 2005, 2006, Regents of the University of California
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in
 *   the documentation and/or other materials provided with the
 *   distribution.  
 *
 * * Neither the name of the University of California, Berkeley nor
 *   the names of its contributors may be used to endorse or promote
 *   products derived from this software without specific prior 
 *   written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package blog;

import java.io.PrintStream;
import java.util.*;
import common.Histogram;
import ve.Factor;
import ve.Potential;

public class FormulaQuery extends ArgSpecQuery {

    public FormulaQuery( Formula formula ){
	super(formula);

	if (Main.outputPath() != null) {
	    outputFile = Main.filePrintStream(Main.outputPath() +
					      "-trial" + trialNum + ".data");
	}
    }

    public Formula formula() {
	return (Formula) argSpec;
    }

    public void printResults(PrintStream s) {
	s.println("Probability of " + argSpec + " is " + calculateResult());
    }

    public void logResults(int numSamples) {
	if (outputFile != null) {
	    outputFile.println("\t" + numSamples + "\t" + calculateResult());
	}
    }

    public void updateStats(PartialWorld world, double weight) {
	if (probTrue != -1) {
	    throw new IllegalStateException
		("Can't update states: posterior already specified.");
	}

	if (((Formula) argSpec).isTrue(world)) {
	    trueSum += weight;
	} 
	totalSum += weight;
    }

    public void setPosterior(Factor posterior) {
	if (!posterior.getRandomVars().contains((BasicVar) variable)) {
	    throw new IllegalArgumentException
		("Query variable " + variable + " not covered by factor on "
		 + posterior.getRandomVars());
	}
	if (posterior.getRandomVars().size() > 1) {
	    throw new IllegalArgumentException
		("Answer to query on " + variable + " should be factor on "
		 + "that variable alone, not " + posterior.getRandomVars());
	}

	probTrue = posterior.getPotential().getValue
	    (Collections.singletonList(Boolean.TRUE));
    }

    public void zeroOut(){
	double result = calculateResult();
	runningProbSum += result;
	runningProbSumSquares += (result * result);
	trialNum++;

	if ((outputFile != null) && (trialNum != Main.numTrials())) {
	    outputFile = Main.filePrintStream(Main.outputPath() +
					      "-trial" + trialNum + ".data");
	}

	trueSum = 0;
	totalSum = 0;
	probTrue = -1;
    }

    private double calculateResult() {
	if (probTrue != -1) {
	    return probTrue;
	}
	return trueSum / totalSum;
    }

    //CAREFUL: zeroOut() must be called before using this method
    public void printVarianceResults(PrintStream s) {
	double mean = runningProbSum / trialNum;
	s.println("Mean of " + argSpec + " query results is " + mean);
	s.println("Std dev of " + argSpec + " query results is " + 
		  Math.sqrt(runningProbSumSquares/trialNum - (mean * mean)));
    }

    public Histogram getHistogram() {
    	histogram.clear();
    	histogram.increaseWeight(Boolean.TRUE,             trueSum);
    	histogram.increaseWeight(Boolean.FALSE, totalSum - trueSum);
    	return histogram;
    }
    
    private double trueSum = 0;
    private double totalSum = 0;
    private double probTrue = -1;

    private double runningProbSum = 0;
    private double runningProbSumSquares = 0;
    private int trialNum = 0;
}


This file was generated on Tue Jun 08 17:53:36 PDT 2010 from file FormulaQuery.java
by the ilog.language.tools.Hilite Java tool written by Hassan Aït-Kaci