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.util.ArrayList;
021    import java.util.List;
022    
023    /**
024     * Simple implementation of the {@link EstimationProblem
025     * EstimationProblem} interface for boilerplate data handling.
026     * <p>This class <em>only</em> handles parameters and measurements
027     * storage and unbound parameters filtering. It does not compute
028     * anything by itself. It should either be used with measurements
029     * implementation that are smart enough to know about the
030     * various parameters in order to compute the partial derivatives
031     * appropriately. Since the problem-specific logic is mainly related to
032     * the various measurements models, the simplest way to use this class
033     * is by extending it and using one internal class extending
034     * {@link WeightedMeasurement WeightedMeasurement} for each measurement
035     * type. The instances of the internal classes would have access to the
036     * various parameters and their current estimate.</p>
037    
038     * @version $Revision: 762116 $ $Date: 2009-04-05 12:48:53 -0400 (Sun, 05 Apr 2009) $
039     * @since 1.2
040     * @deprecated as of 2.0, everything in package org.apache.commons.math.estimation has
041     * been deprecated and replaced by package org.apache.commons.math.optimization.general
042    
043     */
044    @Deprecated
045    public class SimpleEstimationProblem implements EstimationProblem {
046    
047        /**
048         * Build an empty instance without parameters nor measurements.
049         */
050        public SimpleEstimationProblem() {
051            parameters   = new ArrayList<EstimatedParameter>();
052            measurements = new ArrayList<WeightedMeasurement>();
053        }
054    
055        /** 
056         * Get all the parameters of the problem.
057         * @return parameters
058         */
059        public EstimatedParameter[] getAllParameters() {
060            return parameters.toArray(new EstimatedParameter[parameters.size()]);
061        }
062    
063        /** 
064         * Get the unbound parameters of the problem.
065         * @return unbound parameters
066         */
067        public EstimatedParameter[] getUnboundParameters() {
068    
069            // filter the unbound parameters
070            List<EstimatedParameter> unbound = new ArrayList<EstimatedParameter>(parameters.size());
071            for (EstimatedParameter p : parameters) {
072                if (! p.isBound()) {
073                    unbound.add(p);
074                }
075            }
076    
077            // convert to an array
078            return unbound.toArray(new EstimatedParameter[unbound.size()]);
079            
080        }
081    
082        /** 
083         * Get the measurements of an estimation problem.
084         * @return measurements
085         */
086        public WeightedMeasurement[] getMeasurements() {
087            return measurements.toArray(new WeightedMeasurement[measurements.size()]);
088        }
089    
090        /** Add a parameter to the problem.
091         * @param p parameter to add
092         */
093        protected void addParameter(EstimatedParameter p) {
094            parameters.add(p);
095        }
096    
097        /**
098         * Add a new measurement to the set.
099         * @param m measurement to add
100         */
101        protected void addMeasurement(WeightedMeasurement m) {
102            measurements.add(m);
103        }
104    
105        /** Estimated parameters. */
106        private final List<EstimatedParameter> parameters;
107    
108        /** Measurements. */
109        private final List<WeightedMeasurement> measurements;
110    
111    }