2 using System.Collections.Generic;
\r
3 using System.Collections.ObjectModel;
\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
14 namespace PsychlopsSilverlight4.Pages
\r
16 public partial class BinomialSolver : ChildWindow
\r
18 System.Windows.Shapes.Line line;
\r
20 Psychlops.Solver.Constants.Func1 func1;
\r
21 Psychlops.Solver.Constants.Func2 func2;
\r
22 Psychlops.Solver.Constants.Func3 func3;
\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
31 public BinomialSolver(Psychlops.Solver.Constants.Func1 f)
\r
33 InitializeComponent();
\r
38 public BinomialSolver(Psychlops.Solver.Constants.Func2 f)
\r
40 InitializeComponent();
\r
45 public BinomialSolver(Psychlops.Solver.Constants.Func3 f)
\r
47 InitializeComponent();
\r
52 public void initialize()
\r
54 dataGrid.RowHeight = 20;
\r
55 data = Data.GetDataList();
\r
56 dataGrid.ItemsSource = data;
\r
58 chart1.DataContext = data;
\r
59 solver = new Psychlops.Solver.BinomialLikelihood();
\r
63 line.X2 = ChartCanvas.ActualWidth;
\r
65 ChartCanvas.Children.Add(line);
\r
66 OText.DataContext = OrdinateSlider;
\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
78 public Data(double absc, int posi, int nega)
\r
80 this.abscissa = absc;
\r
81 this.positive = posi;
\r
82 this.negative = nega;
\r
87 public static ObservableCollection<Data> GetDataList()
\r
89 return new ObservableCollection<Data>(new Data[] {
\r
90 new Data(-5, 0, 10),
\r
96 new Data(10, 10, 0)
\r
101 private void OKButton_Click(object sender, RoutedEventArgs e)
\r
103 this.DialogResult = true;
\r
106 double minimum, maximum;
\r
107 Psychlops.Solver.BinomialLikelihood solver;
\r
108 private void CalcButton_Click(object sender, RoutedEventArgs e)
\r
110 var ber = new Psychlops.Solver.BernoulliProcess();
\r
111 ber.elems = new Psychlops.Solver.BernoulliProcess.Data[data.Count];
\r
114 minimum = Double.PositiveInfinity;
\r
115 maximum = Double.NegativeInfinity;
\r
116 foreach (var d in data)
\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
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
134 switch (func_selected)
\r
137 solver.begin(func1);
\r
140 solver.begin(func2);
\r
143 solver.begin(func3);
\r
149 private void reFunc()
\r
152 fitted = new ObservableCollection<Data>();
\r
153 foreach (var d in data)
\r
155 dd = new Data(d.abscissa, d.positive, d.negative);
\r
156 dd.c_abscissa = minimum;
\r
160 switch (func_selected)
\r
163 for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )
\r
165 dd = new Data(0, 0, 0);
\r
167 dd.c_ratio = func1(j, solver.champ[0]);
\r
172 for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )
\r
174 dd = new Data(0, 0, 0);
\r
176 dd.c_ratio = func2(j, solver.champ[0], solver.champ[1]);
\r
181 for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )
\r
183 dd = new Data(0, 0, 0);
\r
185 dd.c_ratio = func3(j, solver.champ[0], solver.champ[1], solver.champ[2]);
\r
192 chart1.DataContext = null;
\r
193 chart1.DataContext = fitted;
\r
195 OrdinateSlider.Maximum = 1.0;
\r
196 OrdinateSlider.Minimum = 0.0;
\r
197 OrdinateSlider.Value = 0.5;
\r
199 AbscissaSlider.Maximum = maximum;
\r
200 AbscissaSlider.Minimum = minimum;
\r
201 AbscissaSlider.Value = solver.champ[0];
\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
206 //chart1.UpdateLayout();
\r
209 private void AddConditionButton_Click(object sender, RoutedEventArgs e)
\r
211 data.Add(new Data(0, 0, 0));
\r
212 this.UpdateLayout();
\r
215 private void RemoveConditionButton_Click(object sender, RoutedEventArgs e)
\r
217 data.RemoveAt(data.Count-1);
\r
218 this.UpdateLayout();
\r
221 private void OrdinateSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
\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
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
252 if (ii>32 || dir != pdir) { d /= 2; dirr++; ii = 0; }
\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