Mercurial > hg > jslab
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+")"; } + }; + } +} +