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.analysis;
019    
020    import org.apache.commons.math.FunctionEvaluationException;
021    import org.apache.commons.math.util.FastMath;
022    
023    
024    
025    /**
026     * Base class for {@link BivariateRealFunction} that can be composed with other functions.
027     *
028     * @since 2.1
029     * @version $Revision: 1073498 $ $Date: 2011-02-22 21:57:26 +0100 (mar. 22 f??vr. 2011) $
030     * @deprecated in 2.2
031     */
032    @Deprecated
033    public abstract class BinaryFunction implements BivariateRealFunction {
034    
035        /** The + operator method wrapped as a {@link BinaryFunction}. */
036        public static final BinaryFunction ADD = new BinaryFunction() {
037            /** {@inheritDoc} */
038            @Override
039            public double value(double x, double y) {
040                return x + y;
041            }
042        };
043    
044        /** The - operator method wrapped as a {@link BinaryFunction}. */
045        public static final BinaryFunction SUBTRACT = new BinaryFunction() {
046            /** {@inheritDoc} */
047            @Override
048            public double value(double x, double y) {
049                return x - y;
050            }
051        };
052    
053        /** The * operator method wrapped as a {@link BinaryFunction}. */
054        public static final BinaryFunction MULTIPLY = new BinaryFunction() {
055            /** {@inheritDoc} */
056            @Override
057            public double value(double x, double y) {
058                return x * y;
059            }
060        };
061    
062        /** The / operator method wrapped as a {@link BinaryFunction}. */
063        public static final BinaryFunction DIVIDE = new BinaryFunction() {
064            /** {@inheritDoc} */
065            @Override
066            public double value(double x, double y) {
067                return x / y;
068            }
069        };
070    
071        /** The {@code FastMath.pow} method wrapped as a {@link BinaryFunction}. */
072        public static final BinaryFunction POW = new BinaryFunction() {
073            /** {@inheritDoc} */
074            @Override
075            public double value(double x, double y) {
076                return FastMath.pow(x, y);
077            }
078        };
079    
080        /** The {@code FastMath.atan2} method wrapped as a {@link BinaryFunction}. */
081        public static final BinaryFunction ATAN2 = new BinaryFunction() {
082            /** {@inheritDoc} */
083            @Override
084            public double value(double x, double y) {
085                return FastMath.atan2(x, y);
086            }
087        };
088    
089        /** {@inheritDoc} */
090        public abstract double value(double x, double y) throws FunctionEvaluationException;
091    
092        /** Get a composable function by fixing the first argument of the instance.
093         * @param fixedX fixed value of the first argument
094         * @return a function such that {@code f.value(y) == value(fixedX, y)}
095         */
096        public ComposableFunction fix1stArgument(final double fixedX) {
097            return new ComposableFunction() {
098                @Override
099                /** {@inheritDoc} */
100                public double value(double x) throws FunctionEvaluationException {
101                    return BinaryFunction.this.value(fixedX, x);
102                }
103            };
104        }
105    
106        /** Get a composable function by fixing the second argument of the instance.
107         * @param fixedY fixed value of the second argument
108         * @return a function such that {@code f.value(x) == value(x, fixedY)}
109         */
110        public ComposableFunction fix2ndArgument(final double fixedY) {
111            return new ComposableFunction() {
112                @Override
113                /** {@inheritDoc} */
114                public double value(double x) throws FunctionEvaluationException {
115                    return BinaryFunction.this.value(x, fixedY);
116                }
117            };
118        }
119    
120    }