internal static string GetOrCreateDataFolder(ParametersPack args)
        {
            args.ThrowIfNull(nameof(args));

            return(PathHelper.GetOrCreateFolderUsingFilePath(
                       args.OutputFilenamePattern, PredefinedPaths.DefaultDataFolderPath
                       ));
        }
 public AnalysisContext CreateWith(ParametersPack args)
 {
     return(new AnalysisContext(
                args: args,
                launchContext: LaunchContext,
                outputExcelFile: OutputExcelFile,
                phaseOnePartOne: PhaseOnePartOne,
                phaseOnePartTwo: PhaseOnePartTwo,
                phaseTwo: PhaseTwo,
                goodnessOfFit: GoodnessOfFit
                ));
 }
 public AnalysisContext(
     ParametersPack args,
     AnalysisLaunchContext launchContext,
     FileInfo outputExcelFile,
     PhaseOnePartOneAnalysisKind phaseOnePartOne,
     PhaseOnePartTwoAnalysisKind phaseOnePartTwo,
     PhaseTwoAnalysisKind phaseTwo,
     GoodnessOfFitKind goodnessOfFit)
 {
     Args            = args.ThrowIfNull(nameof(args));
     LaunchContext   = launchContext.ThrowIfNull(nameof(launchContext));
     OutputExcelFile = outputExcelFile.ThrowIfNull(nameof(outputExcelFile));
     PhaseOnePartOne = phaseOnePartOne.ThrowIfNull(nameof(phaseOnePartOne));
     PhaseOnePartTwo = phaseOnePartTwo.ThrowIfNull(nameof(phaseOnePartTwo));
     PhaseTwo        = phaseTwo.ThrowIfNull(nameof(phaseTwo));
     GoodnessOfFit   = goodnessOfFit.ThrowIfNull(nameof(goodnessOfFit));
 }
        internal static IAnalysisPhaseOnePartOne CreateAnalysisPhaseOnePartOne(
            PhaseOnePartOneAnalysisKind phaseOnePartOne, ParametersPack args)
        {
            phaseOnePartOne.ThrowIfNull(nameof(phaseOnePartOne));

            if (PhaseOnePartOneAnalysisKind.NormalDistribution.Equals(phaseOnePartOne))
            {
                return(new NormalDistributionAnalysisPhaseOnePartOne(args));
            }
            if (PhaseOnePartOneAnalysisKind.BetaDistribution.Equals(phaseOnePartOne))
            {
                // TODO: add formulas for solution based on beta distribution.
                throw new NotImplementedException(
                          "Beta distribution analysis for phase 1 part 1 is not implemented."
                          );
            }

            throw new ArgumentOutOfRangeException(
                      nameof(phaseOnePartOne), phaseOnePartOne,
                      $"Unknown analysis kind for phase 1 part 1 value: {phaseOnePartOne.ToLogString()}"
                      );
        }
        internal static IAnalysisPhaseTwo CreateAnalysisPhaseTwo(
            PhaseTwoAnalysisKind phaseTwo, IFunctionSelector goodnessOfFit, ParametersPack args)
        {
            phaseTwo.ThrowIfNull(nameof(phaseTwo));

            if (PhaseTwoAnalysisKind.NormalDistribution.Equals(phaseTwo))
            {
                // TODO: add formulas for solution based on Sturges's formula.
                throw new NotImplementedException(
                          "Normal distribution analysis for phase 2 is not implemented."
                          );
            }
            if (PhaseTwoAnalysisKind.BetaDistribution.Equals(phaseTwo))
            {
                var regression = Regression.Create(goodnessOfFit);
                return(new BetaDistributionAnalysisPhaseTwo(args, regression));
            }

            throw new ArgumentOutOfRangeException(
                      nameof(phaseTwo), phaseTwo,
                      $"Unknown analysis kind for phase 2 value: {phaseTwo.ToLogString()}"
                      );
        }
        internal static IAnalysisPhaseOnePartTwo CreateAnalysisPhaseOnePartTwo(
            PhaseOnePartTwoAnalysisKind phaseOnePartTwo, ParametersPack args)
        {
            phaseOnePartTwo.ThrowIfNull(nameof(phaseOnePartTwo));

            if (PhaseOnePartTwoAnalysisKind.BetaDistributionWithScott.Equals(phaseOnePartTwo))
            {
                return(new BetaDistributionAnalysisPhaseOnePartTwo(
                           new ScottFrequencyHistogramBuilder(args), args
                           ));
            }
            if (PhaseOnePartTwoAnalysisKind.BetaDistributionWithSturges.Equals(phaseOnePartTwo))
            {
                // TODO: add formulas for solution based on Sturges's formula.
                throw new NotImplementedException(
                          "Sturges's analysis for phase 1 part 2 is not implemented."
                          );
            }

            throw new ArgumentOutOfRangeException(
                      nameof(phaseOnePartTwo), phaseOnePartTwo,
                      $"Unknown analysis kind for phase 1 part 2 value: {phaseOnePartTwo.ToLogString()}"
                      );
        }