public void ConstructorTest_Visibility()
        {
            var main = new MainViewModel();
            main.SetDistribution("Normal");

            Assert.IsTrue(main.SelectedDistribution.Instance is NormalDistribution);

            AnalysisViewModel target = main.Analysis;
            Assert.IsFalse(target.LeftValueVisible);

            target.ComparisonIndex = target.Comparisons.IndexOf(AnalysisViewModel.EqualTo);
            Assert.IsFalse(target.LeftValueVisible);

            target.ComparisonIndex = target.Comparisons.IndexOf(AnalysisViewModel.Outside);
            Assert.IsTrue(target.LeftValueVisible);

            target.ComparisonIndex = target.Comparisons.IndexOf(AnalysisViewModel.GreaterThan);
            Assert.IsFalse(target.LeftValueVisible);

            target.ComparisonIndex = target.Comparisons.IndexOf(AnalysisViewModel.Between);
            Assert.IsTrue(target.LeftValueVisible);

            target.ComparisonIndex = target.Comparisons.IndexOf(AnalysisViewModel.LessThan);
            Assert.IsFalse(target.LeftValueVisible);
        }
        public void ConstructorTest1()
        {
            MainViewModel target = new MainViewModel();

            Assert.AreEqual(1, target.Estimate.Values.Count);
            Assert.IsTrue(target.Distributions.Count > 0);
        }
        /// <summary>
        ///   Gets an array containing all distributions that can be dynamically build by
        ///   this application by inspecting Accord.NET assemblies using reflection.
        /// </summary>
        /// 
        public static DistributionViewModel[] GetDistributions(MainViewModel owner)
        {
            // This function iterates the Accord.Statistics assembly looking for
            // classes that are concrete (not abstract) and that implement the
            // IUnivariateDistribution interface. Then, it attempts to create a
            // DistributionViewModel from the distribution's type by using the
            // DistributionViewModel.TryParse method.

            var baseType = typeof(IUnivariateDistribution);

            var assembly = Assembly.GetAssembly(baseType);

            // Prepare and leave Accord.NET documentation parsed
            var doc = GetDocumentation(assembly);

            // Get all univariate distributions in Accord.NET:
            var distributions = assembly.GetTypes()
                .Where(p => baseType.IsAssignableFrom(p) && !p.IsAbstract && !p.IsInterface);

            // Get only those that can be dynamically built:
            var buildable = new List<DistributionViewModel>();
            foreach (Type type in distributions)
            {
                DistributionViewModel distribution;
                if (DistributionViewModel.TryParse(owner, type, doc, out distribution))
                    buildable.Add(distribution);
            }

            buildable.Sort((a, b) => a.Name.CompareTo(b.Name));

            return buildable.ToArray();
        }
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            // Create the main view model for the application
            MainViewModel mainViewModel = new MainViewModel();

            MainWindow wnd = new MainWindow()
            {
                DataContext = mainViewModel
            };

            wnd.Show();
        }
        public void ConstructorTest_Example01()
        {
            var main = new MainViewModel();

            main.SetDistribution("Normal");
            main.GetParameter("Mean").Value = 4.62;
            main.GetParameter("Std. Dev.").Value = 0.23;

            AnalysisViewModel target = main.Analysis;

            Assert.IsNotNull(target);

            compute(target, 4.35, AnalysisViewModel.Between, 4.85);
            Assert.AreEqual(0.721129, target.Probability, 1e-6);
        }
        public void ConstructorTest_Example02()
        {
            var main = new MainViewModel();

            main.SetDistribution("Normal");
            main.GetParameter("Mean").Value = 43.3;
            main.GetParameter("Std. Dev.").Value = 4.6;

            AnalysisViewModel target = main.Analysis;

            Assert.IsNotNull(target);

            probability(target, AnalysisViewModel.GreaterThan, 0.05);
            Assert.AreEqual(0, target.LeftValue, 1e-6);
            Assert.AreEqual(50.86, target.RightValue, 1e-2);
        }
        public void Paste_SuccessTest2()
        {
            var main = new MainViewModel();
            var target = main.Estimate;


            string text = ""
             + "0.111\t2.222\n"
             + "A\tB\n"
             + "2.421\t3.141";

            Clipboard.SetText(text);
            target.Paste_Executed(null);

            Assert.AreEqual(3, target.Values.Count);
            Assert.AreEqual(0, target.Values[0].Value);
            Assert.AreEqual(1, target.Values[0].Weight);
            Assert.AreEqual(0.111, target.Values[1].Value);
            Assert.AreEqual(2.222, target.Values[1].Weight);
            Assert.AreEqual(2.421, target.Values[2].Value);
            Assert.AreEqual(3.141, target.Values[2].Weight);
        }
        public void Generate_NotSupportedTest()
        {
            var main = new MainViewModel();

            // Select a Folded Normal distribution
            int index = main.Distributions.IndexOf(
                main.Distributions.Where(x => x.Name.Contains("Folded Normal")).First());

            main.SelectedDistributionIndex = index;

            SpinWait.SpinUntil(() => main.SelectedDistribution.IsInitialized);

            Assert.AreEqual(1, main.Estimate.Values.Count);
            Assert.IsTrue(String.IsNullOrEmpty(main.Estimate.Message));

            // Generate samples
            Assert.AreEqual(1000, main.Estimate.NumberOfSamplesToBeGenerated);
            main.Estimate.GenerateCommand.Execute(null);

            Assert.AreEqual(1000, main.Estimate.Values.Count);
            Assert.IsFalse(main.Estimate.Owner.SelectedDistribution.IsFittable);
            Assert.IsFalse(String.IsNullOrEmpty(main.Estimate.Message));
        }
        public void ConstructorTest_Example07()
        {
            var main = new MainViewModel();

            main.SetDistribution("Binomial");
            main.GetParameter("Trials").Value = 2000;
            main.GetParameter("Probability").Value = 0.063;

            Assert.AreEqual(126, main.GetProperty("Mean").Value);
            Assert.AreEqual(118.06, main.GetProperty("Variance").Value.Value, 0.005);

            AnalysisViewModel target = main.Analysis;

            Assert.IsNotNull(target);

            compute(target, 0, AnalysisViewModel.LessThan, 135);
            Assert.AreEqual(0.8099233, target.Probability, 1e-6);
        }
        public void Estimate_UpdateOnEditTest()
        {
            var main = new MainViewModel();

            SpinWait.SpinUntil(() => main.SelectedDistribution.IsInitialized);

            main.Estimate.IsUpdatedOnEdit = false;

            main.Estimate.Values.Add(new SampleViewModel() { Value = 2 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 3 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 4 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 5 });

            Assert.AreEqual(0, main.SelectedDistribution.Instance.Mean);
            Assert.AreEqual(1, main.SelectedDistribution.Instance.Variance);

            main.Estimate.IsUpdatedOnEdit = true;

            main.Estimate.NewCommand.Execute(null);
            main.Estimate.Values.Add(new SampleViewModel() { Value = 1 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 2 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 3 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 4 });
            main.Estimate.Values.Add(new SampleViewModel() { Value = 5 });

            Assert.AreEqual(2.5, main.SelectedDistribution.Instance.Mean);
            Assert.AreEqual(3.5, main.SelectedDistribution.Instance.Variance);
        }
        public void ConstructorTest_Rebind()
        {
            var main = new MainViewModel();

            main.SetDistribution("Binomial");
            main.GetParameter("Trials").Value = 2000;
            main.GetParameter("Probability").Value = 0.063;

            Assert.IsTrue(main.SelectedDistribution.Instance is BinomialDistribution);

            var target = main.Analysis;
            compute(target, 0, AnalysisViewModel.LessThan, 2);
            compute(target, 0, AnalysisViewModel.LessThan, 53);

            main.SetDistribution("Normal");
            target = main.Analysis;
            Assert.AreEqual(target.SelectedDistribution, main.SelectedDistribution);

            Assert.IsTrue(main.SelectedDistribution.Instance is NormalDistribution);
        }
        public void ConstructorTest_NoncentralT()
        {
            var main = new MainViewModel();

            main.SetDistribution("Noncentral T");
            Assert.AreEqual(1, main.GetParameter("Degrees Of Freedom").Value);
            Assert.AreEqual(0, main.GetParameter("Noncentrality").Value);

            var target = main.Analysis;
            var red = OxyColor.FromRgb(250, 0, 0);
            var plot = target.DensityFunction;
            var line = plot.Series[0] as LineSeries;
            var area = plot.Series[1] as AreaSeries;

            Assert.IsNotNull(line);
            Assert.IsNotNull(area);
        }
        public void ConstructorTest_DiscreteColors()
        {
            var main = new MainViewModel();

            main.SetDistribution("Binomial");
            main.GetParameter("Trials").Value = 9;
            main.GetParameter("Probability").Value = 0.5;

            var target = main.Analysis;
            Assert.AreEqual(main.SelectedDistribution, target.SelectedDistribution);

            var red = OxyColor.FromRgb(250, 0, 0);
            PlotModel plot; 
            ColumnSeries series;

            compute(target, 0, AnalysisViewModel.LessThan, 3);
            plot = target.DensityFunction;
            series = plot.Series[0] as ColumnSeries;
            Assert.AreEqual(1, plot.Series.Count);
            Assert.AreEqual(8, series.Items.Count);

            Assert.AreEqual(red, series.Items[0].Color);
            Assert.AreEqual(red, series.Items[1].Color);
            Assert.AreEqual(red, series.Items[2].Color);
            Assert.AreNotEqual(red, series.Items[3].Color);
            Assert.AreNotEqual(red, series.Items[4].Color);
            Assert.AreNotEqual(red, series.Items[5].Color);
            Assert.AreNotEqual(red, series.Items[6].Color);
            Assert.AreNotEqual(red, series.Items[7].Color);

            compute(target, 0, AnalysisViewModel.LessThan, 4);
            plot = target.DensityFunction;
            series = plot.Series[0] as ColumnSeries;
            Assert.AreEqual(1, plot.Series.Count);
            Assert.AreEqual(8, series.Items.Count);

            Assert.AreEqual(red, series.Items[0].Color);
            Assert.AreEqual(red, series.Items[1].Color);
            Assert.AreEqual(red, series.Items[2].Color);
            Assert.AreEqual(red, series.Items[3].Color);
            Assert.AreNotEqual(red, series.Items[4].Color);
            Assert.AreNotEqual(red, series.Items[5].Color);
            Assert.AreNotEqual(red, series.Items[6].Color);
            Assert.AreNotEqual(red, series.Items[7].Color);

            compute(target, 0, AnalysisViewModel.LessThan, 5);
            plot = target.DensityFunction;
            series = plot.Series[0] as ColumnSeries;
            Assert.AreEqual(1, plot.Series.Count);
            Assert.AreEqual(8, series.Items.Count);

            Assert.AreEqual(red, series.Items[0].Color);
            Assert.AreEqual(red, series.Items[1].Color);
            Assert.AreEqual(red, series.Items[2].Color);
            Assert.AreEqual(red, series.Items[3].Color);
            Assert.AreEqual(red, series.Items[4].Color);
            Assert.AreNotEqual(red, series.Items[5].Color);
            Assert.AreNotEqual(red, series.Items[6].Color);
            Assert.AreNotEqual(red, series.Items[7].Color);
        }
        public void ConstructorTest_Example10d()
        {
            var main = new MainViewModel();

            main.SetDistribution("Normal");
            main.GetParameter("Mean").Value = 37;
            main.GetParameter("Std. Dev.").Value = 0.4;

            var target = main.Analysis;

            compute(target, 0, AnalysisViewModel.LessThan, 35.8);
            Assert.AreEqual(0.001349, target.Probability, 5e-5);

            compute(target, 0, AnalysisViewModel.GreaterThan, 36.2);
            Assert.AreEqual(0.977249, target.Probability, 5e-5);

            compute(target, 35.8, AnalysisViewModel.Outside, 36.2);
            Assert.AreEqual(0.978599, target.Probability, 5e-6);
        }
        /// <summary>
        /// Attempts to create a new DistributionViewModel from a given type.
        /// </summary>
        public static bool TryParse(MainViewModel owner, Type type, Dictionary<string, DocumentationViewModel> doc, out DistributionViewModel distribution)
        {
            distribution = new DistributionViewModel(owner);

            if (!typeof(IUnivariateDistribution).IsAssignableFrom(type) || !doc.ContainsKey(type.Name))
                return false;


            string name = DistributionManager.GetDistributionName(type);


            // Extract all properties with return value of double
            //
            var properties = new List<PropertyViewModel>();
            foreach (PropertyInfo prop in type.GetProperties())
            {
                PropertyViewModel property;
                if (PropertyViewModel.TryParse(prop, distribution, out property))
                    properties.Add(property);
            }

            // Extract buildable constructors. A constructor is 
            // considered buildable if we can extract valid ranges
            // and default values from all of its parameters
            //
            var list = new List<ConstructorViewModel>();
            foreach (var ctor in type.GetConstructors())
            {
                ConstructorViewModel constructor;
                if (ConstructorViewModel.TryParse(ctor, distribution, out constructor))
                    list.Add(constructor);
            }

            if (list.Count == 0)
                return false;

            // For the time being, just consider the buildable 
            // constructor with the largest number of parameters.
            //
            var main = list.OrderByDescending(x => x.Parameters.Count).First();



            // Extract some documentation
            var documentation = doc[type.Name];
            documentation.Name = name;

            distribution.Constructor = main;
            distribution.Properties = new ObservableCollection<PropertyViewModel>(properties);
            distribution.Parameters = main.Parameters;
            distribution.Type = type;
            distribution.Name = name;
            distribution.Documentation = documentation;


            foreach (var parameter in distribution.Constructor.Parameters)
                parameter.ValueChanged += distribution.distribution_OnParameterChanged;

            distribution.Options = DistributionManager.GetFittingOptions(distribution.Type);

            return true;
        }
        public void ConstructorTest_Example04()
        {
            var main = new MainViewModel();

            main.SetDistribution("Binomial");
            main.GetParameter("Trials").Value = 3;
            main.GetParameter("Probability").Value = 0.02;

            AnalysisViewModel target = main.Analysis;

            Assert.IsNotNull(target);

            compute(target, 0, AnalysisViewModel.EqualTo, 3);
            Assert.AreEqual(0.000008, target.Probability, 1e-10);
        }
        /// <summary>
        ///   Initializes a new instance of the <see cref="EstimateViewModel"/> class.
        /// </summary>
        /// 
        public EstimateViewModel(MainViewModel owner)
        {
            this.Owner = owner;

            this.Values = new BindingList<SampleViewModel>();
            this.Values.ListChanged += data_ListChanged;
            this.Values.Add(new SampleViewModel() { Value = 0, Weight = 1 });

            this.Analysis = new ObservableCollection<GoodnessOfFitViewModel>();

            this.NumberOfSamplesToBeGenerated = 100;
            this.IsUpdatedOnEdit = false;

            this.NewCommand = new RelayCommand(New_Execute);
            this.SaveCommand = new RelayCommand(Save_Execute, Save_CanExecute);
            this.OpenCommand = new RelayCommand(Open_Execute);
            this.EstimateCommand = new RelayCommand(Estimate_Execute, Estimate_CanExecute);
            this.GenerateCommand = new RelayCommand(generate_Execute);

            CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste,
                (sender, e) => Paste_Executed(sender), Paste_CanExecute));
        }
        public void GompertzTest()
        {
            var main = new MainViewModel();

            main.SetDistribution("Gompertz");

            Assert.AreEqual(1, main.Estimate.Values.Count);
            Assert.IsTrue(String.IsNullOrEmpty(main.Estimate.Message));

            // Generate samples
            Assert.AreEqual(1000, main.Estimate.NumberOfSamplesToBeGenerated);
            main.Estimate.GenerateCommand.Execute(null);

            Assert.AreEqual(1000, main.Estimate.Values.Count);
            Assert.IsFalse(main.Estimate.Owner.SelectedDistribution.IsFittable);
            Assert.IsFalse(String.IsNullOrEmpty(main.Estimate.Message));
        }
        public void ConstructorTest_Example10a()
        {
            var main = new MainViewModel();

            main.SetDistribution("Normal");
            main.GetParameter("Mean").Value = 36;
            main.GetParameter("Std. Dev.").Value = 0.1;

            AnalysisViewModel target = main.Analysis;

            Assert.IsNotNull(target);

            compute(target, 0, AnalysisViewModel.LessThan, 35.8);
            Assert.AreEqual(0.0228, target.Probability, 5e-5);

            compute(target, 0, AnalysisViewModel.GreaterThan, 36.2);
            Assert.AreEqual(1.0 - 0.9772, target.Probability, 5e-5);

            compute(target, 35.8, AnalysisViewModel.Outside, 36.2);
            Assert.AreEqual(0.0455002, target.Probability, 5e-6);
        }
 /// <summary>
 ///   Initializes a new instance of the <see cref="DistributionViewModel"/> class.
 /// </summary>
 /// 
 public DistributionViewModel(MainViewModel owner)
 {
     this.Owner = owner;
     this.Parameters = new ObservableCollection<ParameterViewModel>();
     this.Properties = new ObservableCollection<PropertyViewModel>();
     this.Measures = new MeasuresViewModel();
 }