1 module app; 2 3 import std.stdio; 4 import std.typecons; 5 import lbfgsd; 6 7 void main() 8 { 9 auto solver = new SimpleSolver!(float, 4); 10 solver.options.linesearch.maxIterations = 1000; 11 solver.options.maxIterations = 10_000; 12 13 import std.random : uniform; 14 15 LogLikehoodCostFunc fn; 16 foreach (i; 0 .. 20) 17 fn.data ~= uniform(-3.0f, 4.0f); 18 foreach (i; 0 .. 10) 19 fn.data ~= uniform(-1.0f, 1.0f); 20 21 solver.setAutoDiffCost(fn); 22 23 auto x = new float[4]; 24 x[] = 0; 25 auto result = solver.solve(x); 26 27 writeln("iterations : ", result.iterations.length); 28 writeln("-----"); 29 const gamma = x[0]; 30 const delta = exp(x[1]); 31 const lambda = exp(x[2]); 32 const xi = x[3]; 33 writeln(result.status); 34 writefln!"%.2f, %.2f, %.2f, %.2f"(gamma, delta, lambda, xi); 35 writeln(result.lastCost); 36 37 import lbfgsd.distribution; 38 39 auto dist = johnsonSUDistribution(gamma, delta, lambda, xi); 40 writefln!" 5%% : %.4f"(dist.cdfInverse(0.05f)); 41 writefln!"25%% : %.4f"(dist.cdfInverse(0.25f)); 42 writefln!"50%% : %.4f"(dist.cdfInverse(0.50f)); 43 writefln!"75%% : %.4f"(dist.cdfInverse(0.75f)); 44 writefln!"95%% : %.4f"(dist.cdfInverse(0.95f)); 45 46 writeln("-----"); 47 import lantern; 48 import std.algorithm; 49 50 static struct Val 51 { 52 float data; 53 } 54 55 fn.data.map!(val => Val(val)).describe().printTable(); 56 } 57 58 struct LogLikehoodCostFunc 59 { 60 float[] data; 61 62 auto opCall(T)(const scope T[] params) 63 { 64 // https://en.wikipedia.org/wiki/Johnson's_SU-distribution 65 import lbfgsd.distribution : johnsonSUDistribution; 66 67 const gamma = params[0]; 68 const delta = exp(params[1]); // delta > 0 69 const lambda = exp(params[2]); // lambda > 0 70 const xi = params[3]; 71 72 auto dist = johnsonSUDistribution(gamma, delta, lambda, xi); 73 74 auto result = T(0); 75 foreach (d; data) 76 { 77 result += dist.logLikehood(d); 78 } 79 return -result; 80 } 81 }