OSDN Git Service

solver2
[psychlops/silverlight.git] / dev4 / Pages / BinomialSolver.xaml.cs
diff --git a/dev4/Pages/BinomialSolver.xaml.cs b/dev4/Pages/BinomialSolver.xaml.cs
new file mode 100644 (file)
index 0000000..d589370
--- /dev/null
@@ -0,0 +1,216 @@
+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
+               int func_selected;\r
+               Psychlops.Solver.Constants.Func1 func1;\r
+               Psychlops.Solver.Constants.Func2 func2;\r
+               Psychlops.Solver.Constants.Func3 func3;\r
+\r
+\r
+               struct WholeData\r
+               {\r
+                       public ObservableCollection<Data> data {get; set;}\r
+                       public ObservableCollection<Data> fitted {get; set;}\r
+               }\r
+               WholeData data;\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 = Data.GetDataList();\r
+                       dataGrid.ItemsSource = data.data;\r
+\r
+                       chart1.DataContext = data.data;\r
+                       solver = new Psychlops.Solver.BinomialLikelihood();\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
+                       // A null value for IsSubscribed can indicate \r
+                       // "no preference" or "no response".\r
+                       public Boolean? IsSubscribed { get; set; }\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.data.Count];\r
+                       int i = 0;\r
+\r
+                       minimum = Double.PositiveInfinity;\r
+                       maximum = Double.NegativeInfinity;\r
+                       foreach (var d in data.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.fitted = new ObservableCollection<Data>();\r
+                       foreach (var d in data.data)\r
+                       {\r
+                               data.fitted.Add(d);\r
+                       }\r
+                       Data dd;\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
+                                               data.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
+                                               data.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
+                                               data.fitted.Add(dd);\r
+                                       }\r
+                                       break;\r
+                       }\r
+\r
+\r
+                       chart1.DataContext = null;\r
+                       chart1.DataContext = data.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.data.Add(new Data(0, 0, 0));\r
+                       this.UpdateLayout();\r
+               }\r
+\r
+               private void AbscissaSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)\r
+               {\r
+                       solver.champ[0] = AbscissaSlider.Value;\r
+                       reFunc();\r
+               }\r
+\r
+       }\r
+}\r
+\r