diff src/samer/functions/BiLaplacianBlend.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/functions/BiLaplacianBlend.java	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,58 @@
+/*
+ *	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.functions;
+import  samer.maths.*;
+
+/**
+	Log prior for an laplacian distribution with
+	an extra mass at zero, eg a mixture of a laplacian
+	with another much narrower laplacian. The log prior is
+	basically an abs function with with a extra-deep pit at
+	zero.
+	Paramters control the width and depth of the pit.
+
+	Two linear phases blended exponentially.
+  */
+
+public class BiLaplacianBlend extends Function
+{
+	double beta=1, A=1;
+
+	public void setExponent(double b) { beta=b; }
+	public void setStrength(double a) { A=a; }
+	public double getJump() { return 1+A*beta; }
+
+	public String format(String t) { return "SparseLaplacian("+t+")"; }
+
+	public final double apply(double t) { 
+		t = Math.abs(t);
+		double s=beta*t;
+		if  (s<24) return t-A*Math.exp(-s);
+		else return t;
+	}
+
+	public Function derivative() { 
+		return new Function() {
+			public final double apply(double t) { 
+				if (t>0) {
+					double s=beta*t;
+					if  (s>24) return 1;
+					else return 1+A*beta*Math.exp(-s);
+				} else if (t<0) {
+					double s=-beta*t;
+					if  (s>24) return -1;
+					else return -1-A*beta*Math.exp(-s);
+				} else return 0;
+			}
+			public String format(String t) { return "dBiLaplacian("+t+")"; }
+		};
+	}
+}
+