+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Collections.ObjectModel;\r
-using System.Linq;\r
-using System.Net;\r
-using System.Windows;\r
-using System.Windows.Controls;\r
-using System.Windows.Documents;\r
-using System.Windows.Input;\r
-using System.Windows.Media;\r
-using System.Windows.Media.Animation;\r
-using System.Windows.Shapes;\r
-\r
-namespace PsychlopsSilverlight4.Pages\r
-{\r
- public partial class BinomialSolver : ChildWindow\r
- {\r
- System.Windows.Shapes.Line line;\r
- int func_selected;\r
- Psychlops.Solver.Constants.Func1 func1;\r
- Psychlops.Solver.Constants.Func2 func2;\r
- Psychlops.Solver.Constants.Func3 func3;\r
-\r
-\r
- public ObservableCollection<Data> data = new ObservableCollection<Data>();\r
- public ObservableCollection<Data> fitted = new ObservableCollection<Data>();\r
- public ObservableCollection<Data> data_ { get { return data; } }\r
- public ObservableCollection<Data> fitted_ { get { return fitted; } }\r
-\r
-\r
- public BinomialSolver(Psychlops.Solver.Constants.Func1 f)\r
- {\r
- InitializeComponent();\r
- initialize();\r
- func_selected = 1;\r
- func1 = f;\r
- }\r
- public BinomialSolver(Psychlops.Solver.Constants.Func2 f)\r
- {\r
- InitializeComponent();\r
- initialize();\r
- func_selected = 2;\r
- func2 = f;\r
- }\r
- public BinomialSolver(Psychlops.Solver.Constants.Func3 f)\r
- {\r
- InitializeComponent();\r
- initialize();\r
- func_selected = 3;\r
- func3 = f;\r
- }\r
- public void initialize()\r
- {\r
- dataGrid.RowHeight = 20;\r
- data = Data.GetDataList();\r
- dataGrid.ItemsSource = data;\r
-\r
- chart1.DataContext = data;\r
- solver = new Psychlops.Solver.BinomialLikelihood();\r
- line = new Line();\r
- line.X1 = 0;\r
- line.Y1 = 0;\r
- line.X2 = ChartCanvas.ActualWidth;\r
- line.Y2 = 0;\r
- ChartCanvas.Children.Add(line);\r
- OText.DataContext = OrdinateSlider;\r
- }\r
- public class Data\r
- {\r
- public double c_abscissa { get; set; }\r
- public double c_ratio { get; set; }\r
- public double abscissa { get; set; }\r
- public int positive { get; set; }\r
- public int negative { get; set; }\r
- public double ratio { get { return (double)(positive) / (positive+negative); } }\r
-\r
-\r
- public Data(double absc, int posi, int nega)\r
- {\r
- this.abscissa = absc;\r
- this.positive = posi;\r
- this.negative = nega;\r
- c_abscissa = 0.0;\r
- c_ratio = 0.0;\r
- }\r
-\r
- public static ObservableCollection<Data> GetDataList()\r
- {\r
- return new ObservableCollection<Data>(new Data[] {\r
- new Data(-5, 0, 10),\r
- new Data(0, 1, 9),\r
- new Data(1, 3, 7),\r
- new Data(2, 5, 5),\r
- new Data(3, 7, 3), \r
- new Data(5, 9, 1), \r
- new Data(10, 10, 0) \r
- });\r
- }\r
- }\r
-\r
- private void OKButton_Click(object sender, RoutedEventArgs e)\r
- {\r
- this.DialogResult = true;\r
- }\r
-\r
- double minimum, maximum;\r
- Psychlops.Solver.BinomialLikelihood solver;\r
- private void CalcButton_Click(object sender, RoutedEventArgs e)\r
- {\r
- var ber = new Psychlops.Solver.BernoulliProcess();\r
- ber.elems = new Psychlops.Solver.BernoulliProcess.Data[data.Count];\r
- int i = 0;\r
-\r
- minimum = Double.PositiveInfinity;\r
- maximum = Double.NegativeInfinity;\r
- foreach (var d in data)\r
- {\r
- if (d.abscissa < minimum) { minimum = d.abscissa; }\r
- if (d.abscissa > maximum) { maximum = d.abscissa; }\r
- ber.elems[i].x = d.abscissa;\r
- ber.elems[i].pos = d.positive;\r
- ber.elems[i].neg = d.negative;\r
- i++;\r
- }\r
-\r
- solver.data = ber;\r
-\r
-\r
- Psychlops.Interval itvl = new Psychlops.Interval();\r
- solver.itvl[0] = (-100 <= itvl <= 100);\r
- solver.itvl[1] = (-100 <= itvl <= 100);\r
- solver.itvl[2] = (-100 <= itvl <= 100);\r
-\r
- switch (func_selected)\r
- {\r
- case 1:\r
- solver.begin(func1);\r
- break;\r
- case 2:\r
- solver.begin(func2);\r
- break;\r
- case 3:\r
- solver.begin(func3);\r
- break;\r
- }\r
-\r
- reFunc();\r
- }\r
- private void reFunc()\r
- {\r
- Data dd;\r
- fitted = new ObservableCollection<Data>();\r
- foreach (var d in data)\r
- {\r
- dd = new Data(d.abscissa, d.positive, d.negative);\r
- dd.c_abscissa = minimum;\r
- dd.c_ratio = 0.0;\r
- fitted.Add(dd);\r
- }\r
- switch (func_selected)\r
- {\r
- case 1:\r
- for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
- {\r
- dd = new Data(0, 0, 0);\r
- dd.c_abscissa = j;\r
- dd.c_ratio = func1(j, solver.champ[0]);\r
- fitted.Add(dd);\r
- }\r
- break;\r
- case 2:\r
- for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
- {\r
- dd = new Data(0, 0, 0);\r
- dd.c_abscissa = j;\r
- dd.c_ratio = func2(j, solver.champ[0], solver.champ[1]);\r
- fitted.Add(dd);\r
- }\r
- break;\r
- case 3:\r
- for (double j = minimum; j < maximum; j += (maximum - minimum)/ 100 )\r
- {\r
- dd = new Data(0, 0, 0);\r
- dd.c_abscissa = j;\r
- dd.c_ratio = func3(j, solver.champ[0], solver.champ[1], solver.champ[2]);\r
- fitted.Add(dd);\r
- }\r
- break;\r
- }\r
-\r
-\r
- chart1.DataContext = null;\r
- chart1.DataContext = fitted;\r
-\r
- OrdinateSlider.Maximum = 1.0;\r
- OrdinateSlider.Minimum = 0.0;\r
- OrdinateSlider.Value = 0.5;\r
-\r
- AbscissaSlider.Maximum = maximum;\r
- AbscissaSlider.Minimum = minimum;\r
- AbscissaSlider.Value = solver.champ[0];\r
-\r
- Parameter0.Text = String.Format("{0:D4}", solver.champ[0].ToString());\r
- Parameter1.Text = String.Format("{0, 4:F}", solver.champ[1].ToString());\r
-\r
- //chart1.UpdateLayout();\r
- }\r
-\r
- private void AddConditionButton_Click(object sender, RoutedEventArgs e)\r
- {\r
- data.Add(new Data(0, 0, 0));\r
- this.UpdateLayout();\r
- }\r
-\r
- private void RemoveConditionButton_Click(object sender, RoutedEventArgs e)\r
- {\r
- data.RemoveAt(data.Count-1);\r
- this.UpdateLayout();\r
- }\r
-\r
- private void OrdinateSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)\r
- {\r
- if (solver.champ[0] == 0.0) return;\r
- int dir = 1, pdir, dirr=0, ii = 0;\r
- double d = (maximum - minimum) * 0.25;\r
- double refval = OrdinateSlider.Value;\r
- double x1 = solver.champ[0], x2= x1 + d, v1, v2, tmp;\r
- switch (func_selected)\r
- {\r
- case 1:\r
- break;\r
- case 2:\r
- while (dirr < 32)\r
- {\r
- pdir = dir;\r
- v1 = Math.Abs(refval - func2(x1, solver.champ[0], solver.champ[1]));\r
- v2 = Math.Abs(refval - func2(x2, solver.champ[0], solver.champ[1]));\r
- if (v1 > v2)\r
- {\r
- tmp = x2;\r
- x1 = x2;\r
- x2 = tmp + d;\r
- dir = 1;\r
- }\r
- else\r
- {\r
- tmp = x1;\r
- x2 = x1;\r
- x1 = tmp - d;\r
- dir = -1;\r
- }\r
- if (ii>32 || dir != pdir) { d /= 2; dirr++; ii = 0; }\r
- ii++;\r
- }\r
- break;\r
- case 3:\r
- break;\r
- }\r
-\r
- AbscissaSlider.Value = (x1+x2)/2.0;\r
- Parameter0.Text = AbscissaSlider.Value.ToString();\r
- line.Y1 = refval * 200;\r
- line.Y2 = refval * 200;\r
- }\r
-\r
- }\r
-}\r
-\r