diff src/samer/maths/opt/CubicLineSearch.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/maths/opt/CubicLineSearch.java	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,69 @@
+/*
+ *	Copyright (c) 2000, Samer Abdallah, King's College London.
+ *	All rights reserved.
+ *
+ *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
+ *	without even the implied warranty of MERCHANTABILITY or 
+ *	FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+package samer.maths.opt;
+import  samer.maths.*;
+import  samer.core.*;
+
+
+public class CubicLineSearch
+{
+	double	ZETA=0.0625;	// factor for safeguarding
+	State		S;
+	
+	public CubicLineSearch(State s) { S=s; }
+
+	public void setSafeguardFactor( double z) { ZETA=z; }	
+
+	protected final double extrapolate()
+	{
+		double beta=S.cubic()-S.alpha;
+
+		if (Double.isInfinite(beta) || Double.isNaN(beta)) {
+			return S.alpha*1.6;	
+		} else if (beta>0) {
+			if (beta<0.5*S.alpha) beta=S.alpha*0.5;
+			else if (beta>2*S.alpha) beta=2*S.alpha;
+			return beta;
+		} else {
+			return S.alpha*1.6;	
+			// if (beta>8) beta=8;
+		}
+	}
+
+	protected final double interpolate()
+	{
+		if (S.P2.s>0) {
+			double beta=S.cubic();
+			double safe=ZETA*S.alpha;
+			if (Double.isNaN(beta) || Double.isInfinite(beta)) {
+				beta=S.alpha/2; // bisect
+			} else if (beta<=safe || beta>=(S.alpha-safe)) {
+				beta=S.alpha/2; // bisect
+			} 
+			if (S.alpha<0.1) beta/=2; //	adust
+			return beta;
+		} else {
+			return S.alpha/2;
+		}
+	}
+
+	public void run(Condition convergence)
+	{
+		while (!convergence.test()) {
+			if (S.P2.f<S.P1.f && S.P2.s<0) {
+				double beta=extrapolate();
+				S.move();
+				S.step(beta);
+			} else
+				S.step(interpolate());
+		}
+	}
+}
+