1 using System.Threading;
\r
12 static public class Constants
\r
14 public static readonly int LIMIT = 5;
\r
15 public delegate double Func0(double x);
\r
16 public delegate double Func1(double x, double a);
\r
17 public delegate double Func2(double x, double a, double b);
\r
18 public delegate double Func3(double x, double a, double b, double c);
\r
19 public delegate double Func4(double x, double a, double b, double c, double d);
\r
20 public delegate double Func5(double x, double a, double b, double c, double d, double e);
\r
24 static public class Binomial
\r
26 public static double factorial(int fact)
\r
29 for (int i = 1; i <= fact; i++)
\r
35 public static double combination(int nn, int kk)
\r
37 //return (double)(Int64)(factorial(n) / (factorial(kk) * factorial(n - kk)));
\r
38 BigInt n = new BigInt((Int64)nn, new PrecisionSpec());
\r
39 BigInt k = new BigInt((Int64)kk, new PrecisionSpec());
\r
44 return (double)(Int64)(n / (k * n_k) );
\r
46 public static double likelihood(double pp, int yes, int no)
\r
49 if (pp < 0) p = 0; else if (pp > 1) p = 1; else p = pp;
\r
50 return combination(yes + no, yes) * System.Math.Pow(p, yes) * System.Math.Pow(1 - p, no);
\r
53 public static double likelihood(double pp, int yes, int no, double comb)
\r
56 if (pp < 0) p = 0; else if (pp > 1) p = 1; else p = pp;
\r
57 return comb * System.Math.Pow(p, yes) * System.Math.Pow(1 - p, no);
\r
63 public class BernoulliProcess
\r
68 public int pos, neg, comb;
\r
69 public void set(double cond, int posit, int negat)
\r
77 public Data[] elems;
\r
79 public void set(double[][] num)
\r
81 elems = new Data[num.GetLength(0)];
\r
82 for (int i = 0; i < elems.GetLength(0); i++)
\r
84 elems[i].set(num[i][0], (int)num[i][1], (int)num[i][2]);
\r
91 class BinomialLikelihoodThread
\r
93 public bool finished;
\r
94 public static bool started;
\r
96 public static BinomialLikelihoodThread current;
\r
98 public Interval[] itvl;
\r
99 public double[] step;
\r
100 public double[] champ;
\r
101 public double champ_like;
\r
102 public BernoulliProcess data;
\r
105 public Constants.Func0 func0;
\r
106 public Constants.Func1 func1;
\r
107 public Constants.Func2 func2;
\r
108 public Constants.Func3 func3;
\r
109 public Constants.Func4 func4;
\r
110 public Constants.Func5 func5;
\r
113 public BinomialLikelihoodThread()
\r
116 public void waitLoop()
\r
119 for(int i=0; i<10; i++) {
\r
126 public void loop1() { waitLoop(); th = new Thread(new ThreadStart(loop1_)); }
\r
127 public void loop2() { waitLoop(); th = new Thread(new ThreadStart(loop2_)); }
\r
128 public void loop3() { waitLoop(); th = new Thread(new ThreadStart(loop3_)); }
\r
129 public void loop4() { waitLoop(); th = new Thread(new ThreadStart(loop4_)); }
\r
130 public void loop5() { waitLoop(); th = new Thread(new ThreadStart(loop5_)); }
\r
137 int L = data.length;
\r
138 for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])
\r
141 for(int i=0; i<L; i++) {
\r
142 p = func1(data.elems[i].x, a);
\r
143 like *= Binomial.likelihood(p, data.elems[i].pos, data.elems[i].neg, data.elems[i].comb);
\r
145 if(like > champ_like) {
\r
158 int L = data.length;
\r
159 for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])
\r
161 for (double b = itvl[1].begin.val; b < itvl[1].end.val; b += step[1])
\r
164 for (int i = 0; i < L; i++)
\r
166 p = func2(data.elems[i].x, a, b);
\r
167 like *= Binomial.likelihood(p, data.elems[i].pos, data.elems[i].neg, data.elems[i].comb);
\r
169 if (like > champ_like)
\r
184 int L = data.length;
\r
185 for (double a = itvl[0].begin.val; a < itvl[0].end.val; a += step[0])
\r
187 for (double b = itvl[1].begin.val; b < itvl[1].end.val; b += step[1])
\r
189 for (double c = itvl[2].begin.val; c < itvl[2].end.val; c += step[2])
\r
192 for (int i = 0; i < L; i++)
\r
194 p = func3(data.elems[i].x, a, b, c);
\r
195 like *= Binomial.likelihood(p, data.elems[i].pos, data.elems[i].neg, data.elems[i].comb);
\r
197 if (like > champ_like)
\r
221 class BinomialLikelihood
\r
223 public int iteration;
\r
225 public Interval[] itvl;
\r
226 public double[] step;
\r
227 public double[] champ;
\r
228 public double champ_like;
\r
229 public BernoulliProcess data;
\r
231 public Constants.Func0 func0;
\r
232 public Constants.Func1 func1;
\r
233 public Constants.Func2 func2;
\r
234 public Constants.Func3 func3;
\r
235 public Constants.Func4 func4;
\r
236 public Constants.Func5 func5;
\r
238 public BinomialLikelihood()
\r
243 public void begin(Constants.Func0 d_func)
\r
245 public void begin(Constants.Func1 d_func)
\r
249 BinomialLikelihoodThread[] l = new BinomialLikelihoodThread[4];
\r
251 double r, low, high;
\r
252 for (int k = 0; k < iteration; k++)
\r
257 for (int i = 0; i < 4; i++)
\r
260 l[i].func1 = d_func;
\r
265 for (int j = 0; j < Constants.LIMIT; j++)
\r
267 r = itvl[j].end.val - itvl[j].begin.val;
\r
268 low = champ[j] - r / 8.0 < itvl[j].begin.val ? itvl[j].begin.val : champ[j] - r / 8.0;
\r
269 high = champ[j] + r / 8.0 > itvl[j].end.val ? itvl[j].end.val : champ[j] + r / 8.0;
\r
270 itvl[j] = new Interval(low, high);
\r
274 public void begin(Constants.Func2 d_func)
\r
278 BinomialLikelihoodThread[] l = new BinomialLikelihoodThread[4];
\r
280 double r, low, high;
\r
281 for (int k = 0; k < iteration; k++)
\r
286 for (int i = 0; i < 4; i++)
\r
289 l[i].func2 = d_func;
\r
294 for (int j = 0; j < Constants.LIMIT; j++)
\r
296 r = itvl[j].end.val - itvl[j].begin.val;
\r
297 low = champ[j] - r / 8.0 < itvl[j].begin.val ? itvl[j].begin.val : champ[j] - r / 8.0;
\r
298 high = champ[j] + r / 8.0 > itvl[j].end.val ? itvl[j].end.val : champ[j] + r / 8.0;
\r
299 itvl[j] = new Interval(low, high);
\r
303 public void begin(Constants.Func3 d_func)
\r
307 BinomialLikelihoodThread[] l = new BinomialLikelihoodThread[4];
\r
309 double r, low, high;
\r
310 for (int k = 0; k < iteration; k++)
\r
315 for(int i=0; i<4; i++) {
\r
317 l[i].func3 = d_func;
\r
322 for (int j = 0; j < Constants.LIMIT; j++)
\r
324 r = itvl[j].end.val - itvl[j].begin.val;
\r
325 low = champ[j]-r/8.0 < itvl[j].begin.val ? itvl[j].begin.val : champ[j]-r/8.0;
\r
326 high = champ[j]+r/8.0 > itvl[j].end.val ? itvl[j].end.val : champ[j]+r/8.0;
\r
327 itvl[j] = new Interval(low, high);
\r
332 public void begin(Constants.Func4 d_func)
\r
335 public void begin(Constants.Func5 d_func)
\r
339 void begin_base(BinomialLikelihoodThread[] l)
\r
341 data.length = data.elems.GetLength(0);
\r
342 for (int i = 0; i < data.elems.GetLength(0); i++)
\r
344 data.elems[i].comb = (int)Binomial.combination(data.elems[i].pos + data.elems[i].neg, data.elems[i].pos);
\r
347 for (int j = 0; j < Constants.LIMIT; j++) { step[j] = (itvl[j].end.val - itvl[j].begin.val) / 256.0; }
\r
348 for (int i = 0; i < 4; i++)
\r
350 l[i].itvl[0] = new Interval((itvl[0].begin.val) + (i * step[0] * 64), (itvl[0].begin.val) + ((i + 1) * step[0] * 64));
\r
351 l[i].step[0] = step[0];
\r
352 for (int j = 1; j < Constants.LIMIT; j++)
\r
354 l[i].itvl[j] = itvl[j];
\r
355 l[i].step[j] = step[j];
\r
361 void end_base(BinomialLikelihoodThread[] l)
\r
363 for (int i = 0; i < 4; i++)
\r
368 for(int j=0; j<Constants.LIMIT; j++) { champ[j] = 0; }
\r
369 for(int i=0; i<4; i++) {
\r
370 if(champ_like < l[i].champ_like) {
\r
371 champ_like = l[i].champ_like;
\r
372 for(int j=0; j<Constants.LIMIT; j++) { champ[j] = l[i].champ[j]; }
\r