//  Int.java
//
//  Author:
//       Antonio J. Nebro <antonio@lcc.uma.es>
//       Juan J. Durillo <durillo@lcc.uma.es>
// 
//  Copyright (c) 2011 Antonio J. Nebro, Juan J. Durillo
//
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU Lesser General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU Lesser General Public License for more details.
// 
//  You should have received a copy of the GNU Lesser General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.

package jmetal.encodings.variable;

import jmetal.core.Variable;
import jmetal.util.Configuration;
import jmetal.util.JMException;
import jmetal.util.PseudoRandom;

/**
 * This class implements an integer decision encodings.variable
 */
public class Int extends Variable {
	
	private int value_;       //Stores the value of the encodings.variable
	private int lowerBound_;  //Stores the lower limit of the encodings.variable
	private int upperBound_;  //Stores the upper limit of the encodings.variable

	/**
	 * Constructor
	 */
	public Int() {
		lowerBound_ = Integer.MIN_VALUE ;
		upperBound_ = Integer.MAX_VALUE ;
		value_      = 0                           ;
	} // Int

	/**
	 * Constructor
	 * @param lowerBound Variable lower bound
	 * @param upperBound Variable upper bound
	 */
	public Int(int lowerBound, int upperBound){
		lowerBound_ = lowerBound;
		upperBound_ = upperBound;
		value_ = PseudoRandom.randInt(lowerBound, upperBound) ;
	} // Int

	/**
	 * Constructor
	 * @param value Value of the encodings.variable
	 * @param lowerBound Variable lower bound
	 * @param upperBound Variable upper bound
	 */
	public Int(int value, int lowerBound, int upperBound) {
		super();

		value_      = value      ;
		lowerBound_ = lowerBound ;
		upperBound_ = upperBound ;
	} // Int

	/**
	 * Copy constructor.
	 * @param variable Variable to be copied.
	 * @throws jmetal.util.JMException
	 */
	public Int(Variable variable) throws JMException{
		lowerBound_ = (int)variable.getLowerBound();
		upperBound_ = (int)variable.getUpperBound();
		value_ = (int)variable.getValue();        
	} // Int

	/**
	 * Returns the value of the encodings.variable.
	 * @return the value.
	 */
	public double getValue() {
		return value_;
	} // getValue

	/**
	 * Assigns a value to the encodings.variable.
	 * @param value The value.
	 */ 
	public void setValue(double value) {
		value_ = (int)value;
	} // setValue

	/**
	 * Creates an exact copy of the <code>Int</code> object.
	 * @return the copy.
	 */ 
	public Variable deepCopy(){
		try {
			return new Int(this);
		} catch (JMException e) {
			Configuration.logger_.severe("Int.deepCopy.execute: JMException");
			return null ;
		}
	} // deepCopy

	/**
	 * Returns the lower bound of the encodings.variable.
	 * @return the lower bound.
	 */ 
	public double getLowerBound() {
		return lowerBound_;
	} // getLowerBound

	/**
	 * Returns the upper bound of the encodings.variable.
	 * @return the upper bound.
	 */ 
	public double getUpperBound() {
		return upperBound_;
	} // getUpperBound

	/**
	 * Sets the lower bound of the encodings.variable.
	 * @param lowerBound The lower bound value.
	 */	    
	public void setLowerBound(double lowerBound)  {
		lowerBound_ = (int)lowerBound;
	} // setLowerBound

	/**
	 * Sets the upper bound of the encodings.variable.
	 * @param upperBound The new upper bound value.
	 */          
	public void setUpperBound(double upperBound) {
		upperBound_ = (int)upperBound;
	} // setUpperBound

	/**
	 * Returns a string representing the object
	 * @return The string
	 */ 
	public String toString(){
		return value_+"";
	} // toString
} // Int
