OSDN Git Service

silverlight5
[psychlops/silverlight.git] / dev4 / Pages / BinomialSolver.xaml.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Collections.ObjectModel;\r
4 using System.Linq;\r
5 using System.Net;\r
6 using System.Windows;\r
7 using System.Windows.Controls;\r
8 using System.Windows.Documents;\r
9 using System.Windows.Input;\r
10 using System.Windows.Media;\r
11 using System.Windows.Media.Animation;\r
12 using System.Windows.Shapes;\r
13 \r
14 namespace PsychlopsSilverlight4.Pages\r
15 {\r
16         public partial class BinomialSolver : ChildWindow\r
17         {\r
18                 System.Windows.Shapes.Line line;\r
19                 int func_selected;\r
20                 Psychlops.Solver.Constants.Func1 func1;\r
21                 Psychlops.Solver.Constants.Func2 func2;\r
22                 Psychlops.Solver.Constants.Func3 func3;\r
23 \r
24 \r
25                 public ObservableCollection<Data> data = new ObservableCollection<Data>();\r
26                 public ObservableCollection<Data> fitted = new ObservableCollection<Data>();\r
27                 public ObservableCollection<Data> data_ { get { return data; } }\r
28                 public ObservableCollection<Data> fitted_ { get { return fitted; } }\r
29 \r
30 \r
31                 public BinomialSolver(Psychlops.Solver.Constants.Func1 f)\r
32                 {\r
33                         InitializeComponent();\r
34                         initialize();\r
35                         func_selected = 1;\r
36                         func1 = f;\r
37                 }\r
38                 public BinomialSolver(Psychlops.Solver.Constants.Func2 f)\r
39                 {\r
40                         InitializeComponent();\r
41                         initialize();\r
42                         func_selected = 2;\r
43                         func2 = f;\r
44                 }\r
45                 public BinomialSolver(Psychlops.Solver.Constants.Func3 f)\r
46                 {\r
47                         InitializeComponent();\r
48                         initialize();\r
49                         func_selected = 3;\r
50                         func3 = f;\r
51                 }\r
52                 public void initialize()\r
53                 {\r
54                         dataGrid.RowHeight = 20;\r
55                         data = Data.GetDataList();\r
56                         dataGrid.ItemsSource = data;\r
57 \r
58                         chart1.DataContext = data;\r
59                         solver = new Psychlops.Solver.BinomialLikelihood();\r
60                         line = new Line();\r
61                         line.X1 = 0;\r
62                         line.Y1 = 0;\r
63                         line.X2 = ChartCanvas.ActualWidth;\r
64                         line.Y2 = 0;\r
65                         ChartCanvas.Children.Add(line);\r
66                         OText.DataContext = OrdinateSlider;\r
67                 }\r
68                 public class Data\r
69                 {\r
70                         public double c_abscissa { get; set; }\r
71                         public double c_ratio { get; set; }\r
72                         public double abscissa { get; set; }\r
73                         public int positive { get; set; }\r
74                         public int negative { get; set; }\r
75                         public double ratio { get { return (double)(positive) / (positive+negative); } }\r
76 \r
77 \r
78                         public Data(double absc, int posi, int nega)\r
79                         {\r
80                                 this.abscissa = absc;\r
81                                 this.positive = posi;\r
82                                 this.negative = nega;\r
83                                 c_abscissa = 0.0;\r
84                                 c_ratio = 0.0;\r
85                         }\r
86 \r
87                         public static ObservableCollection<Data> GetDataList()\r
88                         {\r
89                                 return new ObservableCollection<Data>(new Data[] {\r
90                                         new Data(-5, 0, 10),\r
91                                         new Data(0, 1, 9),\r
92                                         new Data(1, 3, 7),\r
93                                         new Data(2, 5, 5),\r
94                                         new Data(3, 7, 3),               \r
95                                         new Data(5, 9, 1),                \r
96                                         new Data(10, 10, 0)                \r
97                                 });\r
98                         }\r
99                 }\r
100 \r
101                 private void OKButton_Click(object sender, RoutedEventArgs e)\r
102                 {\r
103                         this.DialogResult = true;\r
104                 }\r
105 \r
106                 double minimum, maximum;\r
107                 Psychlops.Solver.BinomialLikelihood solver;\r
108                 private void CalcButton_Click(object sender, RoutedEventArgs e)\r
109                 {\r
110                         var ber = new Psychlops.Solver.BernoulliProcess();\r
111                         ber.elems = new Psychlops.Solver.BernoulliProcess.Data[data.Count];\r
112                         int i = 0;\r
113 \r
114                         minimum = Double.PositiveInfinity;\r
115                         maximum = Double.NegativeInfinity;\r
116                         foreach (var d in data)\r
117                         {\r
118                                 if (d.abscissa < minimum) { minimum = d.abscissa; }\r
119                                 if (d.abscissa > maximum) { maximum = d.abscissa; }\r
120                                 ber.elems[i].x = d.abscissa;\r
121                                 ber.elems[i].pos = d.positive;\r
122                                 ber.elems[i].neg = d.negative;\r
123                                 i++;\r
124                         }\r
125 \r
126                         solver.data = ber;\r
127 \r
128 \r
129                         Psychlops.Interval itvl = new Psychlops.Interval();\r
130                         solver.itvl[0] = (-100 <= itvl <= 100);\r
131                         solver.itvl[1] = (-100 <= itvl <= 100);\r
132                         solver.itvl[2] = (-100 <= itvl <= 100);\r
133 \r
134                         switch (func_selected)\r
135                         {\r
136                                 case 1:\r
137                                         solver.begin(func1);\r
138                                         break;\r
139                                 case 2:\r
140                                         solver.begin(func2);\r
141                                         break;\r
142                                 case 3:\r
143                                         solver.begin(func3);\r
144                                         break;\r
145                         }\r
146 \r
147                         reFunc();\r
148                 }\r
149                 private void reFunc()\r
150                 {\r
151                         Data dd;\r
152                         fitted = new ObservableCollection<Data>();\r
153                         foreach (var d in data)\r
154                         {\r
155                                 dd = new Data(d.abscissa, d.positive, d.negative);\r
156                                 dd.c_abscissa = minimum;\r
157                                 dd.c_ratio = 0.0;\r
158                                 fitted.Add(dd);\r
159                         }\r
160                         switch (func_selected)\r
161                         {\r
162                                 case 1:\r
163                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
164                                         {\r
165                                                 dd = new Data(0, 0, 0);\r
166                                                 dd.c_abscissa = j;\r
167                                                 dd.c_ratio = func1(j, solver.champ[0]);\r
168                                                 fitted.Add(dd);\r
169                                         }\r
170                                         break;\r
171                                 case 2:\r
172                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
173                                         {\r
174                                                 dd = new Data(0, 0, 0);\r
175                                                 dd.c_abscissa = j;\r
176                                                 dd.c_ratio = func2(j, solver.champ[0], solver.champ[1]);\r
177                                                 fitted.Add(dd);\r
178                                         }\r
179                                         break;\r
180                                 case 3:\r
181                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
182                                         {\r
183                                                 dd = new Data(0, 0, 0);\r
184                                                 dd.c_abscissa = j;\r
185                                                 dd.c_ratio = func3(j, solver.champ[0], solver.champ[1], solver.champ[2]);\r
186                                                 fitted.Add(dd);\r
187                                         }\r
188                                         break;\r
189                         }\r
190 \r
191 \r
192                         chart1.DataContext = null;\r
193                         chart1.DataContext = fitted;\r
194 \r
195                         OrdinateSlider.Maximum = 1.0;\r
196                         OrdinateSlider.Minimum = 0.0;\r
197                         OrdinateSlider.Value = 0.5;\r
198 \r
199                         AbscissaSlider.Maximum = maximum;\r
200                         AbscissaSlider.Minimum = minimum;\r
201                         AbscissaSlider.Value = solver.champ[0];\r
202 \r
203                         Parameter0.Text = String.Format("{0:D4}", solver.champ[0].ToString());\r
204                         Parameter1.Text = String.Format("{0, 4:F}", solver.champ[1].ToString());\r
205 \r
206                         //chart1.UpdateLayout();\r
207                 }\r
208 \r
209                 private void AddConditionButton_Click(object sender, RoutedEventArgs e)\r
210                 {\r
211                         data.Add(new Data(0, 0, 0));\r
212                         this.UpdateLayout();\r
213                 }\r
214 \r
215                 private void RemoveConditionButton_Click(object sender, RoutedEventArgs e)\r
216                 {\r
217                         data.RemoveAt(data.Count-1);\r
218                         this.UpdateLayout();\r
219                 }\r
220 \r
221                 private void OrdinateSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)\r
222                 {\r
223                         if (solver.champ[0] == 0.0) return;\r
224                         int dir = 1, pdir, dirr=0, ii = 0;\r
225                         double d = (maximum - minimum) * 0.25;\r
226                         double refval = OrdinateSlider.Value;\r
227                         double x1 = solver.champ[0], x2= x1 + d, v1, v2, tmp;\r
228                         switch (func_selected)\r
229                         {\r
230                                 case 1:\r
231                                         break;\r
232                                 case 2:\r
233                                         while (dirr < 32)\r
234                                         {\r
235                                                 pdir = dir;\r
236                                                 v1 = Math.Abs(refval - func2(x1, solver.champ[0], solver.champ[1]));\r
237                                                 v2 = Math.Abs(refval - func2(x2, solver.champ[0], solver.champ[1]));\r
238                                                 if (v1 > v2)\r
239                                                 {\r
240                                                         tmp = x2;\r
241                                                         x1 = x2;\r
242                                                         x2 = tmp + d;\r
243                                                         dir = 1;\r
244                                                 }\r
245                                                 else\r
246                                                 {\r
247                                                         tmp = x1;\r
248                                                         x2 = x1;\r
249                                                         x1 = tmp - d;\r
250                                                         dir = -1;\r
251                                                 }\r
252                                                 if (ii>32 || dir != pdir) { d /= 2; dirr++; ii = 0; }\r
253                                                 ii++;\r
254                                         }\r
255                                         break;\r
256                                 case 3:\r
257                                         break;\r
258                         }\r
259 \r
260                         AbscissaSlider.Value = (x1+x2)/2.0;\r
261                         Parameter0.Text = AbscissaSlider.Value.ToString();\r
262                         line.Y1 = refval * 200;\r
263                         line.Y2 = refval * 200;\r
264                 }\r
265 \r
266         }\r
267 }\r
268 \r