// Path: src/main/java/com/asher_stern/crf/function/Function.java
// public abstract class Function
// {
// 	/**
// 	 * Returns the f(x) -- the value of the function in the given x.
// 	 * @param point the "point" is x -- the input for the function.
// 	 * @return the value of f(x)
// 	 */
// 	public abstract BigDecimal value(BigDecimal[] point);
// 	
// 	/**
// 	 * The size (dimension) of the input vector (x).
// 	 * @return the size (dimension) of the input vector (x).
// 	 */
// 	public abstract int size();
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/ArithmeticUtilities.java
// public class ArithmeticUtilities
// {
// 	public static final MathContext MC = MathContext.DECIMAL128;
// 	
// 	public static final BigDecimal DOUBLE_MAX = big(Double.MAX_VALUE);
// 	
// 	public static final BigDecimal BIG_DECIMAL_E = big(Math.E);
// 	public static final BigDecimal BIG_DECIMAL_TWO = new BigDecimal("2.0", MC);
// 	public static final BigDecimal BIG_DECIMAL_E_TO_512 = BIG_DECIMAL_E.pow(512);
// 	public static final BigDecimal BIG_DECIMAL_512 = new BigDecimal("512", MC);
// 	public static final BigDecimal BIG_DECIMAL_LOG_DOUBLE_MAX = big(Math.log(Double.MAX_VALUE));
// 	
// 	public static BigDecimal big(double d)
// 	{
// 		return new BigDecimal(d, MC);
// 	}
// 	
// 
// 	public static BigDecimal log(BigDecimal d)
// 	{
// 		// long debug_counter = 0;
// 		BigDecimal ret = BigDecimal.ZERO;
// 		while (d.compareTo(DOUBLE_MAX)>0)
// 		{
// 			ret = safeAdd(ret, BIG_DECIMAL_512);
// 			d = safeDivide(d, BIG_DECIMAL_E_TO_512);
// 			if (d.compareTo(BigDecimal.ONE)<0) {throw new CrfException("Anomaly");}
// 			// ++debug_counter;
// 		}
// 		ret = safeAdd(ret, big(Math.log(d.doubleValue())));
// 		// if ( logger.isDebugEnabled() && (debug_counter>0) ) {logger.debug("log() performed "+debug_counter+" iterations.");}
// 		return ret;
// 	}
// 	
// 	
// 	public static BigDecimal exp(BigDecimal d)
// 	{
// 		if (d.compareTo(BIG_DECIMAL_LOG_DOUBLE_MAX)<=0)
// 		{
// 			return big(Math.exp(d.doubleValue()));
// 		}
// 		else
// 		{
// 			BigDecimal half = safeDivide(d, BIG_DECIMAL_TWO);
// 			BigDecimal halfExp = exp(half);
// 			return safeMultiply(halfExp, halfExp);
// 		}
// 	}
// 	
// 	public static BigDecimal safeAdd(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.add(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeSubtract(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.subtract(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeMultiply(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.multiply(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeMultiply(final BigDecimal d1, final BigDecimal d2, BigDecimal...ds)
// 	{
// 		BigDecimal ret = safeMultiply(d1, d2);
// 		for (BigDecimal d : ds)
// 		{
// 			ret = safeMultiply(ret, d);
// 		}
// 		return ret;
// 	}
// 	
// 	public static BigDecimal safeDivide(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.divide(d2, MC);
// 	}
// 	
// 	@SuppressWarnings("unused")
// 	private static final Logger logger = Logger.getLogger(ArithmeticUtilities.class);
// }


import java.math.BigDecimal;
import com.asher_stern.crf.function.Function;
import com.asher_stern.crf.utilities.ArithmeticUtilities;
package com.asher_stern.crf.function.optimization;



/**
 * A simple inexact and inaccurate non-efficient line search which merely returns a small
 * constant for any input.
 * 
 * @author Asher Stern
 * Date: Nov 7, 2014
 *
 */
public class ConstantLineSearch<F extends Function> implements LineSearch<F>
{
	public static final BigDecimal DEFAULT_RATE = new BigDecimal(0.01, ArithmeticUtilities.MC);
	
	public ConstantLineSearch()
	{
		this(DEFAULT_RATE);
	}
	
	public ConstantLineSearch(BigDecimal constantRate)
	{
		super();
		this.constantRate = constantRate;
	}


// Path: src/main/java/com/asher_stern/crf/function/Function.java
// public abstract class Function
// {
// 	/**
// 	 * Returns the f(x) -- the value of the function in the given x.
// 	 * @param point the "point" is x -- the input for the function.
// 	 * @return the value of f(x)
// 	 */
// 	public abstract BigDecimal value(BigDecimal[] point);
// 	
// 	/**
// 	 * The size (dimension) of the input vector (x).
// 	 * @return the size (dimension) of the input vector (x).
// 	 */
// 	public abstract int size();
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/ArithmeticUtilities.java
// public class ArithmeticUtilities
// {
// 	public static final MathContext MC = MathContext.DECIMAL128;
// 	
// 	public static final BigDecimal DOUBLE_MAX = big(Double.MAX_VALUE);
// 	
// 	public static final BigDecimal BIG_DECIMAL_E = big(Math.E);
// 	public static final BigDecimal BIG_DECIMAL_TWO = new BigDecimal("2.0", MC);
// 	public static final BigDecimal BIG_DECIMAL_E_TO_512 = BIG_DECIMAL_E.pow(512);
// 	public static final BigDecimal BIG_DECIMAL_512 = new BigDecimal("512", MC);
// 	public static final BigDecimal BIG_DECIMAL_LOG_DOUBLE_MAX = big(Math.log(Double.MAX_VALUE));
// 	
// 	public static BigDecimal big(double d)
// 	{
// 		return new BigDecimal(d, MC);
// 	}
// 	
// 
// 	public static BigDecimal log(BigDecimal d)
// 	{
// 		// long debug_counter = 0;
// 		BigDecimal ret = BigDecimal.ZERO;
// 		while (d.compareTo(DOUBLE_MAX)>0)
// 		{
// 			ret = safeAdd(ret, BIG_DECIMAL_512);
// 			d = safeDivide(d, BIG_DECIMAL_E_TO_512);
// 			if (d.compareTo(BigDecimal.ONE)<0) {throw new CrfException("Anomaly");}
// 			// ++debug_counter;
// 		}
// 		ret = safeAdd(ret, big(Math.log(d.doubleValue())));
// 		// if ( logger.isDebugEnabled() && (debug_counter>0) ) {logger.debug("log() performed "+debug_counter+" iterations.");}
// 		return ret;
// 	}
// 	
// 	
// 	public static BigDecimal exp(BigDecimal d)
// 	{
// 		if (d.compareTo(BIG_DECIMAL_LOG_DOUBLE_MAX)<=0)
// 		{
// 			return big(Math.exp(d.doubleValue()));
// 		}
// 		else
// 		{
// 			BigDecimal half = safeDivide(d, BIG_DECIMAL_TWO);
// 			BigDecimal halfExp = exp(half);
// 			return safeMultiply(halfExp, halfExp);
// 		}
// 	}
// 	
// 	public static BigDecimal safeAdd(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.add(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeSubtract(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.subtract(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeMultiply(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.multiply(d2, MC);
// 	}
// 	
// 	public static BigDecimal safeMultiply(final BigDecimal d1, final BigDecimal d2, BigDecimal...ds)
// 	{
// 		BigDecimal ret = safeMultiply(d1, d2);
// 		for (BigDecimal d : ds)
// 		{
// 			ret = safeMultiply(ret, d);
// 		}
// 		return ret;
// 	}
// 	
// 	public static BigDecimal safeDivide(final BigDecimal d1, final BigDecimal d2)
// 	{
// 		return d1.divide(d2, MC);
// 	}
// 	
// 	@SuppressWarnings("unused")
// 	private static final Logger logger = Logger.getLogger(ArithmeticUtilities.class);
// }


// Path: src/main/java/com/asher_stern/crf/function/optimization/ConstantLineSearch.java
import java.math.BigDecimal;
import com.asher_stern.crf.function.Function;
import com.asher_stern.crf.utilities.ArithmeticUtilities;

package com.asher_stern.crf.function.optimization;



/**
 * A simple inexact and inaccurate non-efficient line search which merely returns a small
 * constant for any input.
 * 
 * @author Asher Stern
 * Date: Nov 7, 2014
 *
 */
public class ConstantLineSearch<F extends Function> implements LineSearch<F>
{
	public static final BigDecimal DEFAULT_RATE = new BigDecimal(0.01, ArithmeticUtilities.MC);
	
	public ConstantLineSearch()
	{
		this(DEFAULT_RATE);
	}
	
	public ConstantLineSearch(BigDecimal constantRate)
	{
		super();
		this.constantRate = constantRate;
	}


	@Override