    001    package calhoun.analysis.crf.solver;
    002
    003    import java.util.List;
    004
    005    import calhoun.analysis.crf.CRFTraining;
    006    import calhoun.analysis.crf.ModelManager;
    007    import calhoun.analysis.crf.io.TrainingSequence;
    008
    009    /** a two pass optimizer that does an initial optimization and then uses the weights generated from that as the start of a second optimization.  It is configured with
    010     * two separate CRFOptimizer oibjects for the two passes and additionally needs a CRFObjectiveFunctionGradient for the first pass.
    011     * <p>
    012     * This optimizer has two configuration properties that must be set and control the optimization process
    013     * <ul>
    014     * <li> <b><code>firstPass</code></b> - A reference to a configured {@link CRFTraining} object that will be used to optimize the
    015     * weights in the first pass of the optimization.
    016     * <li> <b><code>secondPass</code></b> - A reference to a configured {@link CRFTraining} object that will be used to optimize the
    017     * weights in the second pass of the optimization.  The second pass will begin using the weights computed during the first
    018     *  pass.
    019     */
    020    public class TwoPassOptimizer implements CRFTraining {
    021
    022            CRFTraining firstPass;
    023
    024            CRFTraining secondPass;
    025
    026            public double[] optimize(ModelManager fm, List<? extends TrainingSequence<?>> data) {
    027                    double[] startingWeights = firstPass.optimize(fm, data);
    028
    029                    secondPass.setStarts(startingWeights);
    030                    return secondPass.optimize(fm, data);
    031            }
    032
    033            public void setStarts(double[] weights) {
    034                    firstPass.setStarts(weights);
    035            }
    036
    037            /**
    038             * @return the firstPass
    039             */
    040            public CRFTraining getFirstPass() {
    041                    return firstPass;
    042            }
    043
    044            /**
    045             * @param firstPass the firstPass to set
    046             */
    047            public void setFirstPass(CRFTraining firstPass) {
    048                    this.firstPass = firstPass;
    049            }
    050
    051            /**
    052             * @return the secondPass
    053             */
    054            public CRFTraining getSecondPass() {
    055                    return secondPass;
    056            }
    057
    058            /**
    059             * @param secondPass the secondPass to set
    060             */
    061            public void setSecondPass(CRFTraining secondPass) {
    062                    this.secondPass = secondPass;
    063            }
    064    }