/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.opennlp.ml.model;

 /**
 * This class encapsulates the varibales used in producing probabilities from a model 
 * and facilitaes passing these variables to the eval method.
 */
public class EvalParameters {
  
 /** Mapping between outcomes and paramater values for each context. 
   * The integer representation of the context can be found using <code>pmap</code>.*/
  private Context[] params;
  /** The number of outcomes being predicted. */
  private final int numOutcomes;
  /** The maximum number of feattures fired in an event. Usually refered to a C.
   * This is used to normalize the number of features which occur in an event. */
  private double correctionConstant;
  
  /**  Stores inverse of the correction constant, 1/C. */
  private final double constantInverse;
  /** The correction parameter of the model. */
  private double correctionParam;
  
  /**
   * Creates a set of paramters which can be evaulated with the eval method.
   * @param params The parameters of the model.
   * @param correctionParam The correction paramter.
   * @param correctionConstant The correction constant.
   * @param numOutcomes The number of outcomes.
   */
  public EvalParameters(Context[] params, double correctionParam, double correctionConstant, int numOutcomes) {
    this.params = params;
    this.correctionParam = correctionParam;
    this.numOutcomes = numOutcomes;
    this.correctionConstant = correctionConstant;
    this.constantInverse = 1.0 / correctionConstant;
  }
  
  public EvalParameters(Context[] params, int numOutcomes) {
    this(params,0,0,numOutcomes);
  }
  
  /* (non-Javadoc)
   * @see opennlp.model.EvalParameters#getParams()
   */
  public Context[] getParams() {
    return params;
  }

  /* (non-Javadoc)
   * @see opennlp.model.EvalParameters#getNumOutcomes()
   */
  public int getNumOutcomes() {
    return numOutcomes;
  }

  public double getCorrectionConstant() {
    return correctionConstant;
  }

  public double getConstantInverse() {
    return constantInverse;
  }

  public double getCorrectionParam() {
    return correctionParam;
  }
  
  public void setCorrectionParam(double correctionParam) {
    this.correctionParam = correctionParam;
  }
}