/**
* Copyright 2010 Neuroph Project http://neuroph.sourceforge.net
*
* Licensed 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.neuroph.core.transfer;
import java.io.Serializable;
import org.neuroph.util.Properties;
/**
* Fuzzy trapezoid neuron tranfer function.
*
* @author Zoran Sevarac <sevarac@gmail.com>
*/
public class Trapezoid extends TransferFunction implements Serializable {
/**
* The class fingerprint that is set to indicate serialization
* compatibility with a previous version of the class.
*/
private static final long serialVersionUID = 1L;
// these are the points of trapezoid function
double leftLow, leftHigh, rightLow, rightHigh;
/**
* Creates an instance of Trapezoid transfer function
*/
public Trapezoid() {
this.leftLow = 0d;
this.leftHigh = 1d;
this.rightLow = 3d;
this.rightHigh = 2d;
}
/**
* Creates an instance of Trapezoid transfer function with the specified
* setting.
*/
public Trapezoid(double leftLow, double leftHigh, double rightLow, double rightHigh) {
this.leftLow = leftLow;
this.leftHigh = leftHigh;
this.rightLow = rightLow;
this.rightHigh = rightHigh;
}
/**
* Creates an instance of Trapezoid transfer function with the specified
* properties.
*/
public Trapezoid(Properties properties) {
try {
this.leftLow = (Double)properties.getProperty("transferFunction.leftLow");
this.leftHigh = (Double)properties.getProperty("transferFunction.leftHigh");
this.rightLow = (Double)properties.getProperty("transferFunction.rightLow");
this.rightHigh = (Double)properties.getProperty("transferFunction.rightHigh");
} catch (NullPointerException e) {
// if properties are not set just leave default values
} catch (NumberFormatException e) {
System.err.println("Invalid transfer function properties! Using default values.");
}
}
@Override
public double getOutput(double net) {
if ((net >= leftHigh) && (net <= rightHigh)) {
return 1d;
} else if ((net > leftLow) && (net < leftHigh)) {
return (net - leftLow) / (leftHigh - leftLow);
} else if ((net > rightHigh) && (net < rightLow)) {
return (rightLow - net) / (rightLow - rightHigh);
}
return 0d;
}
/**
* Sets left low point of trapezoid function
* @param leftLow left low point of trapezoid function
*/
public void setLeftLow(double leftLow) {
this.leftLow = leftLow;
}
/**
* Sets left high point of trapezoid function
* @param leftHigh left high point of trapezoid function
*/
public void setLeftHigh(double leftHigh) {
this.leftHigh = leftHigh;
}
/**
* Sets right low point of trapezoid function
* @param rightLow right low point of trapezoid function
*/
public void setRightLow(double rightLow) {
this.rightLow = rightLow;
}
/**
* Sets right high point of trapezoid function
* @param rightHigh right high point of trapezoid function
*/
public void setRightHigh(double rightHigh) {
this.rightHigh = rightHigh;
}
/**
* Returns left low point of trapezoid function
* @return left low point of trapezoid function
*/
public double getLeftLow() {
return leftLow;
}
/**
* Returns left high point of trapezoid function
* @return left high point of trapezoid function
*/
public double getLeftHigh() {
return leftHigh;
}
/**
* Returns right low point of trapezoid function
* @return right low point of trapezoid function
*/
public double getRightLow() {
return rightLow;
}
/**
* Returns right high point of trapezoid function
* @return right high point of trapezoid function
*/
public double getRightHigh() {
return rightHigh;
}
}