internal static KeepTest <Dictionary <string, string> > GetInstance(bool keepIt)
        {
            if (keepIt)
            {
                return(AlwaysKeep <Dictionary <string, string> > .GetInstance());
            }

            KeepEndOfGag aKeepEndOfGag = new KeepEndOfGag();

            aKeepEndOfGag.KeepIt = keepIt;
            return(aKeepEndOfGag);
        }
        internal static KeepTest <Dictionary <string, string> > GetInstance(int k1)
        {
            if (k1 == 0)
            {
                return(AlwaysKeep <Dictionary <string, string> > .GetInstance());
            }

            K1 aK1 = new K1();

            aK1.k1 = k1;
            return(aK1);
        }
        public void ScoreTree(
            ModelScorer modelScorer,
            PhyloTree phyloTree,
            string predictorSparseFileName,
            string targetSparseFileName,
            string predictorVariableName,
            string targetVariableName,
            double[] nullModelArgs,
            double[] altModelArgs)
        {
            //Dictionary<string, Dictionary<string, SufficientStatistics>> predictorVariableToCaseIdToRealNonMissingValue = LoadSparseFileInMemory(predictorSparseFileName);
            IEnumerable <Pair <string, Dictionary <string, SufficientStatistics> > > predictorNameAndCaseIdToNonMissingValueEnumeration = LoadSparseFileEnumeration(predictorSparseFileName);
            IEnumerable <Pair <string, Dictionary <string, SufficientStatistics> > > targetNameAndCaseIdToNonMissingValueEnumeration    = LoadSparseFileEnumeration(targetSparseFileName);

            RangeCollection    nullIndexRangeCollection = RangeCollection.GetInstance(-1, -1);
            NullDataCollection nullDataGenerator        =
                CreateNullDataGenerator("PredictorPermutation", modelScorer, phyloTree, nullIndexRangeCollection,
                                        predictorNameAndCaseIdToNonMissingValueEnumeration, targetNameAndCaseIdToNonMissingValueEnumeration);

            UniversalWorkList workList = UniversalWorkList.GetInstance(
                predictorNameAndCaseIdToNonMissingValueEnumeration,
                targetNameAndCaseIdToNonMissingValueEnumeration,
                //targetNameAndCaseIdToNonMissingValueEnumeration,
                nullDataGenerator, nullIndexRangeCollection, AlwaysKeep <Dictionary <string, string> > .GetInstance());


            foreach (RowData rowAndTargetData in workList.List())
            {
                if (rowAndTargetData.Row[PhyloTree.PredictorVariableColumnName] == predictorVariableName &&
                    rowAndTargetData.Row[PhyloTree.TargetVariableColumnName] == targetVariableName)
                {
                    Dictionary <string, SufficientStatistics> caseIdToNonNullPredictorValue = rowAndTargetData.PredictorData;//workList.GetCaseIdToNonMissingValueForNullIndexAndPredictorVariable(-1, predictorVariableName);
                    Dictionary <string, SufficientStatistics> caseIdToNonMissingTargetValue = rowAndTargetData.TargetData;

                    Converter <Leaf, SufficientStatistics> targetDistributionMap = CreateSufficientStatisticsMap(caseIdToNonMissingTargetValue);
                    Converter <Leaf, SufficientStatistics> predictorDistributionClassFunction = CreateSufficientStatisticsMap(caseIdToNonNullPredictorValue);
                    Converter <Leaf, SufficientStatistics> altDistributionMap = CreateAlternativeSufficientStatisticsMap(predictorDistributionClassFunction, targetDistributionMap);
                    double                    logLikelihood;
                    Score                     scoreIndTarget, scoreIndPredictor, scoreAlt;
                    MessageInitializer        messageInitializer;
                    OptimizationParameterList nullParams = NullModelDistribution.GetParameters(nullModelArgs);
                    OptimizationParameterList altParams  = AltModelDistribution.GetParameters(altModelArgs);

                    Console.WriteLine(SpecialFunctions.CreateTabString("Variable", nullParams.ToStringHeader(), "LogL"));
                    messageInitializer = modelScorer.CreateMessageInitializer(predictorDistributionClassFunction, targetDistributionMap, NullModelDistribution);
                    logLikelihood      = modelScorer.ComputeLogLikelihoodModelGivenData(messageInitializer, nullParams);
                    scoreIndTarget     = Score.GetInstance(logLikelihood, nullParams);
                    Console.WriteLine("Target\t" + scoreIndTarget);

                    messageInitializer = modelScorer.CreateMessageInitializer(targetDistributionMap, predictorDistributionClassFunction, NullModelDistribution);
                    logLikelihood      = modelScorer.ComputeLogLikelihoodModelGivenData(messageInitializer, nullParams);
                    modelScorer.ComputeLogLikelihoodModelGivenData(messageInitializer, nullParams);
                    scoreIndPredictor = Score.GetInstance(logLikelihood, nullParams);
                    Console.WriteLine("Predictor\t" + scoreIndPredictor);

                    Console.WriteLine("\n" + SpecialFunctions.CreateTabString("Variable", altParams.ToStringHeader(), "LogL"));
                    messageInitializer = modelScorer.CreateMessageInitializer(null, altDistributionMap, AltModelDistribution);
                    logLikelihood      = modelScorer.ComputeLogLikelihoodModelGivenData(messageInitializer, altParams);
                    scoreAlt           = Score.GetInstance(logLikelihood, altParams);
                    Console.WriteLine(SpecialFunctions.CreateTabString(AltModelDistribution, scoreAlt));
                }
            }
        }
        static void Main(string[] argsx)
        {
            try
            {
                List <string> argumentCollection = new List <string>(argsx);

                bool   auditRowIndexValues = true;
                string noAuditFlag         = "-NoAudit";
                if (argumentCollection.Contains(noAuditFlag))
                {
                    argumentCollection.Remove(noAuditFlag);
                    auditRowIndexValues = false;
                }

                double maxPValue         = 1.0; // Ignore pValues greater than this
                string maxPValueFlag     = "-MaxPValue";
                int    maxPValuePosition = argumentCollection.IndexOf(maxPValueFlag);
                if (maxPValuePosition >= 0)
                {
                    argumentCollection.RemoveAt(maxPValuePosition);
                    SpecialFunctions.CheckCondition(maxPValuePosition < argumentCollection.Count, "pValue expected after -MaxPValue");
                    maxPValue = double.Parse(argumentCollection[maxPValuePosition]);
                    argumentCollection.RemoveAt(maxPValuePosition);
                }

                KeepTest <Dictionary <string, string> > keepTest; // Ignore pValues greater than this
                string keepTestFlag     = "-KeepTest";
                int    keepTestPosition = argumentCollection.IndexOf(keepTestFlag);
                if (keepTestPosition >= 0)
                {
                    argumentCollection.RemoveAt(keepTestPosition);
                    SpecialFunctions.CheckCondition(keepTestPosition < argumentCollection.Count, "KeepTest expected after -MaxPValue");
                    keepTest = KeepTest <Dictionary <string, string> > .GetInstance(null, argumentCollection[keepTestPosition]);

                    argumentCollection.RemoveAt(keepTestPosition);
                }
                else
                {
                    keepTest = new AlwaysKeep <Dictionary <string, string> >();
                }


                SpecialFunctions.CheckCondition(argumentCollection.Count > 1, "Expect 2 or more parameters");
                string outputFileName = argumentCollection[argumentCollection.Count - 1];
                argumentCollection.RemoveAt(argumentCollection.Count - 1);

                Tabulate.CreateTabulateReport(argumentCollection, outputFileName, keepTest, maxPValue, auditRowIndexValues);
            }
            catch (Exception e)
            {
                Console.WriteLine("");
                Console.WriteLine(e.Message);
                if (e.InnerException != null)
                {
                    Console.WriteLine(e.InnerException.Message);
                }
                Console.WriteLine(@"
Usage:
Tabulate {-NoAudit} {-MaxPValue maxPValue} {-KeepTest keeptest} broadInputFileNamePattern1 {broadInputFileNamePattern2 ...} outputFileName
 
Each broadInputFileNamePattern1 is of the form 
narrowInputFileNamePattern1{+narrowInputFileNamePattern2...}
 
Each broadInputFileNamePattern must cover the same range of nullIndexes (including -1, the real index).

Each narrowInputFileNamePattern within a broadInputFileNamePattern must cover a disjoint
set of nullIndexes.

For example 
Tabulate -MaxPValue .05  raw\GagEscape0606*-1-19*.txt raw\GagReversion0606*-1-9*.txt+raw\GagReversion0606*10-19*.txt AllGag.qValue.txt 
Notice that broad pattern
    raw\GagEscape0606*-1-19*.txt 
has one narrow pattern and covers nullIndex's -1 to 19

While broad pattern
    raw\GagReversion0606*-1-9*.txt+raw\GagReversion0606*10-19*.txt
has two narrow patterns:
   raw\GagReversion0606*-1-9*.txt, which covers nullIndexes -1 to 9 
   raw\GagReversion0606*10-19*.txt which covers nullIndexes 10 to 19 

 

By default, ""Tabulate"" will audit the ""rowIndex"" and ""rowCount"" values
in the input to remove duplicates and check that all rows are present.
Use ""-NoAudit"" when this is not desired.

Use ""-MaxPValue maxPValue"", where maxPValue is a double, to ignore rows with obviously bad rows 
");
                throw;
            }
        }