001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.math.estimation;
019    
020    import java.io.Serializable;
021    
022    /**
023     * This class represents measurements in estimation problems.
024     *
025     * <p>This abstract class implements all the methods needed to handle
026     * measurements in a general way. It defines neither the {@link
027     * #getTheoreticalValue getTheoreticalValue} nor the {@link
028     * #getPartial getPartial} methods, which should be defined by
029     * sub-classes according to the specific problem.</p>
030     *
031     * <p>The {@link #getTheoreticalValue getTheoreticalValue} and {@link
032     * #getPartial getPartial} methods must always use the current
033     * estimate of the parameters set by the solver in the problem. These
034     * parameters can be retrieved through the {@link
035     * EstimationProblem#getAllParameters
036     * EstimationProblem.getAllParameters} method if the measurements are
037     * independent of the problem, or directly if they are implemented as
038     * inner classes of the problem.</p>
039     *
040     * <p>The instances for which the <code>ignored</code> flag is set
041     * through the {@link #setIgnored setIgnored} method are ignored by the
042     * solvers. This can be used to reject wrong measurements at some
043     * steps of the estimation.</p>
044     *
045     * @see EstimationProblem
046     *
047     * @version $Revision: 811827 $ $Date: 2009-09-06 17:32:50 +0200 (dim. 06 sept. 2009) $
048     * @since 1.2
049     * @deprecated as of 2.0, everything in package org.apache.commons.math.estimation has
050     * been deprecated and replaced by package org.apache.commons.math.optimization.general
051     */
052    
053    @Deprecated
054    public abstract class WeightedMeasurement implements Serializable {
055    
056        /** Serializable version identifier. */
057        private static final long serialVersionUID = 4360046376796901941L;
058    
059        /** Measurement weight. */
060        private final double  weight;
061    
062        /** Value of the measurements. */
063        private final double  measuredValue;
064    
065        /** Ignore measurement indicator. */
066        private boolean ignored;
067    
068      /**
069       * Simple constructor.
070       * Build a measurement with the given parameters, and set its ignore
071       * flag to false.
072       * @param weight weight of the measurement in the least squares problem
073       * (two common choices are either to use 1.0 for all measurements, or to
074       * use a value proportional to the inverse of the variance of the measurement
075       * type)
076       *
077       * @param measuredValue measured value
078       */
079      public WeightedMeasurement(double weight, double measuredValue) {
080        this.weight        = weight;
081        this.measuredValue = measuredValue;
082        ignored            = false;
083      }
084    
085      /** Simple constructor.
086       *
087       * Build a measurement with the given parameters
088       *
089       * @param weight weight of the measurement in the least squares problem
090       * @param measuredValue measured value
091       * @param ignored true if the measurement should be ignored
092       */
093      public WeightedMeasurement(double weight, double measuredValue,
094                                 boolean ignored) {
095        this.weight        = weight;
096        this.measuredValue = measuredValue;
097        this.ignored       = ignored;
098      }
099    
100      /**
101       * Get the weight of the measurement in the least squares problem
102       *
103       * @return weight
104       */
105      public double getWeight() {
106        return weight;
107      }
108    
109      /**
110       * Get the measured value
111       *
112       * @return measured value
113       */
114      public double getMeasuredValue() {
115        return measuredValue;
116      }
117    
118      /**
119       * Get the residual for this measurement
120       * The residual is the measured value minus the theoretical value.
121       *
122       * @return residual
123       */
124      public double getResidual() {
125        return measuredValue - getTheoreticalValue();
126      }
127    
128      /**
129       * Get the theoretical value expected for this measurement
130       * <p>The theoretical value is the value expected for this measurement
131       * if the model and its parameter were all perfectly known.</p>
132       * <p>The value must be computed using the current estimate of the parameters
133       * set by the solver in the problem.</p>
134       *
135       * @return theoretical value
136       */
137      public abstract double getTheoreticalValue();
138    
139      /**
140       * Get the partial derivative of the {@link #getTheoreticalValue
141       * theoretical value} according to the parameter.
142       * <p>The value must be computed using the current estimate of the parameters
143       * set by the solver in the problem.</p>
144       *
145       * @param parameter parameter against which the partial derivative
146       * should be computed
147       * @return partial derivative of the {@link #getTheoreticalValue
148       * theoretical value}
149       */
150      public abstract double getPartial(EstimatedParameter parameter);
151    
152      /**
153       * Set the ignore flag to the specified value
154       * Setting the ignore flag to true allow to reject wrong
155       * measurements, which sometimes can be detected only rather late.
156       *
157       * @param ignored value for the ignore flag
158       */
159      public void setIgnored(boolean ignored) {
160        this.ignored = ignored;
161      }
162    
163      /**
164       * Check if this measurement should be ignored
165       *
166       * @return true if the measurement should be ignored
167       */
168      public boolean isIgnored() {
169        return ignored;
170      }
171    
172    }