OSDN Git Service

1231
[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                 int func_selected;\r
19                 Psychlops.Solver.Constants.Func1 func1;\r
20                 Psychlops.Solver.Constants.Func2 func2;\r
21                 Psychlops.Solver.Constants.Func3 func3;\r
22 \r
23 \r
24                 public ObservableCollection<Data> data = new ObservableCollection<Data>();\r
25                 public ObservableCollection<Data> fitted = new ObservableCollection<Data>();\r
26                 public ObservableCollection<Data> data_ { get { return data; } }\r
27                 public ObservableCollection<Data> fitted_ { get { return fitted; } }\r
28 \r
29 \r
30                 public BinomialSolver(Psychlops.Solver.Constants.Func1 f)\r
31                 {\r
32                         InitializeComponent();\r
33                         initialize();\r
34                         func_selected = 1;\r
35                         func1 = f;\r
36                 }\r
37                 public BinomialSolver(Psychlops.Solver.Constants.Func2 f)\r
38                 {\r
39                         InitializeComponent();\r
40                         initialize();\r
41                         func_selected = 2;\r
42                         func2 = f;\r
43                 }\r
44                 public BinomialSolver(Psychlops.Solver.Constants.Func3 f)\r
45                 {\r
46                         InitializeComponent();\r
47                         initialize();\r
48                         func_selected = 3;\r
49                         func3 = f;\r
50                 }\r
51                 public void initialize()\r
52                 {\r
53                         dataGrid.RowHeight = 20;\r
54                         data = Data.GetDataList();\r
55                         dataGrid.ItemsSource = data;\r
56 \r
57                         chart1.DataContext = data;\r
58                         solver = new Psychlops.Solver.BinomialLikelihood();\r
59                 }\r
60                 public class Data\r
61                 {\r
62                         public double c_abscissa { get; set; }\r
63                         public double c_ratio { get; set; }\r
64                         public double abscissa { get; set; }\r
65                         public int positive { get; set; }\r
66                         public int negative { get; set; }\r
67                         public double ratio { get { return (double)(positive) / (positive+negative); } }\r
68 \r
69 \r
70                         public Data(double absc, int posi, int nega)\r
71                         {\r
72                                 this.abscissa = absc;\r
73                                 this.positive = posi;\r
74                                 this.negative = nega;\r
75                                 c_abscissa = 0.0;\r
76                                 c_ratio = 0.0;\r
77                         }\r
78 \r
79                         public static ObservableCollection<Data> GetDataList()\r
80                         {\r
81                                 return new ObservableCollection<Data>(new Data[] {\r
82                                         new Data(-5, 0, 10),\r
83                                         new Data(0, 1, 9),\r
84                                         new Data(1, 3, 7),\r
85                                         new Data(2, 5, 5),\r
86                                         new Data(3, 7, 3),               \r
87                                         new Data(5, 9, 1),                \r
88                                         new Data(10, 10, 0)                \r
89                                 });\r
90                         }\r
91                 }\r
92 \r
93                 private void OKButton_Click(object sender, RoutedEventArgs e)\r
94                 {\r
95                         this.DialogResult = true;\r
96                 }\r
97 \r
98                 double minimum, maximum;\r
99                 Psychlops.Solver.BinomialLikelihood solver;\r
100                 private void CalcButton_Click(object sender, RoutedEventArgs e)\r
101                 {\r
102                         var ber = new Psychlops.Solver.BernoulliProcess();\r
103                         ber.elems = new Psychlops.Solver.BernoulliProcess.Data[data.Count];\r
104                         int i = 0;\r
105 \r
106                         minimum = Double.PositiveInfinity;\r
107                         maximum = Double.NegativeInfinity;\r
108                         foreach (var d in data)\r
109                         {\r
110                                 if (d.abscissa < minimum) { minimum = d.abscissa; }\r
111                                 if (d.abscissa > maximum) { maximum = d.abscissa; }\r
112                                 ber.elems[i].x = d.abscissa;\r
113                                 ber.elems[i].pos = d.positive;\r
114                                 ber.elems[i].neg = d.negative;\r
115                                 i++;\r
116                         }\r
117 \r
118                         solver.data = ber;\r
119 \r
120 \r
121                         Psychlops.Interval itvl = new Psychlops.Interval();\r
122                         solver.itvl[0] = (-100 <= itvl <= 100);\r
123                         solver.itvl[1] = (-100 <= itvl <= 100);\r
124                         solver.itvl[2] = (-100 <= itvl <= 100);\r
125 \r
126                         switch (func_selected)\r
127                         {\r
128                                 case 1:\r
129                                         solver.begin(func1);\r
130                                         break;\r
131                                 case 2:\r
132                                         solver.begin(func2);\r
133                                         break;\r
134                                 case 3:\r
135                                         solver.begin(func3);\r
136                                         break;\r
137                         }\r
138 \r
139                         reFunc();\r
140                 }\r
141                 private void reFunc()\r
142                 {\r
143                         Data dd;\r
144                         fitted = new ObservableCollection<Data>();\r
145                         foreach (var d in data)\r
146                         {\r
147                                 dd = new Data(d.abscissa, d.positive, d.negative);\r
148                                 dd.c_abscissa = minimum;\r
149                                 dd.c_ratio = 0.0;\r
150                                 fitted.Add(dd);\r
151                         }\r
152                         switch (func_selected)\r
153                         {\r
154                                 case 1:\r
155                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
156                                         {\r
157                                                 dd = new Data(0, 0, 0);\r
158                                                 dd.c_abscissa = j;\r
159                                                 dd.c_ratio = func1(j, solver.champ[0]);\r
160                                                 fitted.Add(dd);\r
161                                         }\r
162                                         break;\r
163                                 case 2:\r
164                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
165                                         {\r
166                                                 dd = new Data(0, 0, 0);\r
167                                                 dd.c_abscissa = j;\r
168                                                 dd.c_ratio = func2(j, solver.champ[0], solver.champ[1]);\r
169                                                 fitted.Add(dd);\r
170                                         }\r
171                                         break;\r
172                                 case 3:\r
173                                         for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
174                                         {\r
175                                                 dd = new Data(0, 0, 0);\r
176                                                 dd.c_abscissa = j;\r
177                                                 dd.c_ratio = func3(j, solver.champ[0], solver.champ[1], solver.champ[2]);\r
178                                                 fitted.Add(dd);\r
179                                         }\r
180                                         break;\r
181                         }\r
182 \r
183 \r
184                         chart1.DataContext = null;\r
185                         chart1.DataContext = fitted;\r
186 \r
187                         OrdinateSlider.Maximum = 1.0;\r
188                         OrdinateSlider.Minimum = 0.0;\r
189                         OrdinateSlider.Value = 0.5;\r
190 \r
191                         AbscissaSlider.Maximum = maximum;\r
192                         AbscissaSlider.Minimum = minimum;\r
193                         AbscissaSlider.Value = solver.champ[0];\r
194 \r
195                         Parameter0.Text = String.Format("{0:D4}", solver.champ[0].ToString());\r
196                         Parameter1.Text = String.Format("{0, 4:F}", solver.champ[1].ToString());\r
197 \r
198                         //chart1.UpdateLayout();\r
199                 }\r
200 \r
201                 private void AddConditionButton_Click(object sender, RoutedEventArgs e)\r
202                 {\r
203                         data.Add(new Data(0, 0, 0));\r
204                         this.UpdateLayout();\r
205                 }\r
206 \r
207                 private void AbscissaSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)\r
208                 {\r
209                         solver.champ[0] = AbscissaSlider.Value;\r
210                         reFunc();\r
211                 }\r
212 \r
213         }\r
214 }\r
215 \r