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 }