--- /dev/null
+<controls:ChildWindow x:Class="PsychlopsSilverlight4.Pages.BinomialSolver"\r
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" \r
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" \r
+ xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"\r
+ xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"\r
+ Width="400" Height="300" \r
+ Title="Binomial Likelihood Solver" xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">\r
+\r
+\r
+ <controls:ChildWindow.Resources>\r
+ <Style TargetType="toolkit:Chart">\r
+ <!-- To Remove Legend-->\r
+ <Setter Property="Padding" Value="10 0" />\r
+ <Setter Property="BorderBrush" Value="Transparent" />\r
+ <Setter Property="PlotAreaStyle">\r
+ <Setter.Value>\r
+ <Style TargetType="Grid">\r
+ <Setter Property="Margin" Value="0"/>\r
+ </Style>\r
+ </Setter.Value>\r
+ </Setter>\r
+ <Setter Property="TitleStyle">\r
+ <Setter.Value>\r
+ <Style TargetType="toolkit:Title">\r
+ <Setter Property="Width" Value="0"/>\r
+ <Setter Property="Height" Value="0"/>\r
+ </Style>\r
+ </Setter.Value>\r
+ </Setter>\r
+ <Setter Property="LegendStyle">\r
+ <Setter.Value>\r
+ <Style TargetType="toolkit:Legend">\r
+ <Setter Property="Width" Value="0"/>\r
+ <Setter Property="Height" Value="0"/>\r
+ </Style>\r
+ </Setter.Value>\r
+ </Setter>\r
+ </Style>\r
+ </controls:ChildWindow.Resources>\r
+\r
+ <Grid x:Name="LayoutRoot" Margin="2">\r
+ <Grid.RowDefinitions>\r
+ <RowDefinition />\r
+ <RowDefinition Height="Auto" />\r
+ </Grid.RowDefinitions>\r
+\r
+ <StackPanel Orientation="Horizontal">\r
+ <Canvas Width="250" Height="Auto">\r
+ <toolkit:Chart x:Name="chart1" Title="" Width="240" Height="220" Canvas.Left="0" Canvas.Top="0"\r
+ FontSize="10">\r
+ <toolkit:Chart.Series>\r
+ <toolkit:ScatterSeries x:Name="Fitted"\r
+ Title="Fitted"\r
+ ItemsSource="{Binding}"\r
+ IndependentValueBinding="{Binding c_abscissa}"\r
+ DependentValueBinding="{Binding c_ratio}"\r
+ >\r
+\r
+ <toolkit:ScatterSeries.DependentRangeAxis>\r
+ <toolkit:LinearAxis Title="" ShowGridLines="False" Orientation="Y" Minimum="0" Maximum="1">\r
+ </toolkit:LinearAxis>\r
+ </toolkit:ScatterSeries.DependentRangeAxis>\r
+ </toolkit:ScatterSeries>\r
+ <toolkit:ScatterSeries x:Name="Raw"\r
+ Title="Fitted"\r
+ ItemsSource="{Binding}"\r
+ IndependentValueBinding="{Binding abscissa}"\r
+ DependentValueBinding="{Binding ratio}"\r
+ >\r
+ <!--\r
+ <toolkit:ScatterSeries.IndependentAxis>\r
+ <toolkit:LinearAxis Title="" Orientation="X" Maximum="10" Minimum="0">\r
+ </toolkit:LinearAxis>\r
+ </toolkit:ScatterSeries.IndependentAxis>\r
+ -->\r
+\r
+ <toolkit:ScatterSeries.DependentRangeAxis>\r
+ <toolkit:LinearAxis Title="" ShowGridLines="False" Orientation="Y" Minimum="0" Maximum="1">\r
+ </toolkit:LinearAxis>\r
+ </toolkit:ScatterSeries.DependentRangeAxis>\r
+ </toolkit:ScatterSeries>\r
+ </toolkit:Chart.Series>\r
+ </toolkit:Chart>\r
+ <Slider x:Name="OrdinateSlider" Canvas.Left="0" Canvas.Top="10" Orientation="Vertical" Height="200"></Slider>\r
+ <Slider x:Name="AbscissaSlider" Canvas.Left="20" Canvas.Top="210" Width="200" MouseLeftButtonUp="AbscissaSlider_MouseLeftButtonUp"></Slider>\r
+ </Canvas>\r
+\r
+\r
+ <StackPanel Orientation="Vertical">\r
+ <sdk:DataGrid x:Name="dataGrid" Margin="0,5,0,10" RowHeight="40" AutoGenerateColumns="False" >\r
+ <sdk:DataGrid.Columns>\r
+ <sdk:DataGridTextColumn Header="Abscissa" Width="40" Binding="{Binding abscissa}" />\r
+ <sdk:DataGridTextColumn Header="Positive Cases" Width="40" Binding="{Binding positive}" />\r
+ <sdk:DataGridTextColumn Header="Negative Cases" Width="40" Binding="{Binding negative}" />\r
+ </sdk:DataGrid.Columns>\r
+ </sdk:DataGrid>\r
+ <Button x:Name="AddConditionButton" Content="Add Condition" Click="AddConditionButton_Click" HorizontalAlignment="Right" FontSize="10" Margin="0,12,0,0" Grid.Row="1" />\r
+ </StackPanel>\r
+ </StackPanel>\r
+\r
+ <TextBlock Text="Mean" x:Name="Parameter0Name" Width="40" Height="23" HorizontalAlignment="Left" Margin="0,12,0,0" Grid.Row="1" />\r
+ <TextBox x:Name="Parameter0" IsReadOnly="True" Width="50" Height="23" HorizontalAlignment="Left" Margin="40,12,0,0" Grid.Row="1" />\r
+ <TextBlock Text="S.D." x:Name="Parameter1Name" Width="40" Height="23" HorizontalAlignment="Left" Margin="110,12,0,0" Grid.Row="1" />\r
+ <TextBox x:Name="Parameter1" IsReadOnly="True" Width="50" Height="23" HorizontalAlignment="Left" Margin="150,12,0,0" Grid.Row="1" />\r
+ <Button x:Name="CalcButton" Content="Calculate" Click="CalcButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />\r
+ <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />\r
+ </Grid>\r
+</controls:ChildWindow>
\ No newline at end of file
--- /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
+ 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