protected override double[][] DefaultDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList discreteParameters)
        {
            double lambda = discreteParameters[(int)ParameterIndex.Lambda].Value;
            double x      = discreteParameters[(int)ParameterIndex.Equilibrium].Value;

            // in phylogenies, Lambda = site-specific mutation rate (in literature, "gamma"), Length = time*average mutation rate,
            // e^(-lambda*t) = Pr[no mutation), and 1 - e^(-lambda*t) = Pr[mutation]
            double expExp = 1.0 - Math.Exp(-lambda * branchOrLeaf.Length);

            //Debug.Assert(expExp > 0);

            // in phylogenies, X = equilibrium frequency of this A.A.
            double[][] yDist = new double[][] { new double[2], new double[2] };
            yDist[0][1] = x * expExp;        // Pr[mutation AND mutationToTrue]
            yDist[0][0] = 1.0 - yDist[0][1]; // that is, Pr[mutation AND mutationToFalse] + Pr[no mutation] = (1-X)*expExp + (1 - expExp) = 1 - X*expExp
            yDist[1][0] = (1 - x) * expExp;  // Pr[mutation AND mutationToFalse]
            yDist[1][1] = 1.0 - yDist[1][0];

#if DEBUG
            //foreach (double[] dArr in yDist)
            //{
            //    foreach (double d in dArr)
            //        Debug.Assert(!double.IsNaN(d) && d >= 0 && d <= 1);

            //}
#endif

            return(yDist);
        }
        //public virtual bool UsePredictorVariable(bool useParameter)
        //{
        //    return useParameter;
        //}

        public double[][] CreateDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList discreteParameters,
                                             Converter <Leaf, SufficientStatistics> predictorClassFunction)
        {
            if (branchOrLeaf is Branch)
            {
                return(CreateDistribution((Branch)branchOrLeaf, discreteParameters));
            }
            else
            {
                return(CreateDistribution((Leaf)branchOrLeaf, discreteParameters, predictorClassFunction));
            }
        }
 public ConditionalGaussianDistribution CreateDistributionGaussianOrNull(
     BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters, Converter <Leaf, SufficientStatistics> predictorLeafToBoolStats)
 {
     if (branchOrLeaf is Branch)
     {
         return(CreateDistributionGaussianOrNull((Branch)branchOrLeaf, gaussianParameters));
     }
     else
     {
         return(CreateDistributionGaussianOrNull((Leaf)branchOrLeaf, gaussianParameters, predictorLeafToBoolStats));
     }
 }
        public static Branch GetBranchInstance(StreamReader streamreader, bool isRoot)
        {
            Branch branch = new Branch();

            branch.IsRoot = isRoot;

            //!!!fix it so that it can parse empty lists
            bool first = true;

            while (true)
            {
                char peek = Peek(streamreader);
                if (!first && peek == ')')
                {
                    break;
                }

                char c = Read(streamreader);
                if (first)
                {
                    SpecialFunctions.CheckCondition(c == '(');
                    first = false;
                }
                else
                {
                    SpecialFunctions.CheckCondition(c == ',');
                }

                branch.BranchOrLeafCollection.Add(BranchOrLeaf.GetInstance(streamreader, false));
            }


            char rightChar = Read(streamreader);

            SpecialFunctions.CheckCondition(rightChar == ')');

            return(branch);
        }
 protected abstract double[][] DefaultDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList discreteParameters);
        protected override ConditionalGaussianDistribution GetPlainConditionalGaussianDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters)
        {
            double alphaTimesVariance = gaussianParameters["AlphaVariance"].Value;

            ConditionalGaussianDistribution plainConditionalDistribution = ConditionalGaussianDistribution.GetInstance();

            // 0 (const part of mean) ax + b, Mean := b
            plainConditionalDistribution.Mean = 0;
            // 1 (ax + b = x), linearCoefficent := a.
            plainConditionalDistribution.LinearCoefficent = 1;
            plainConditionalDistribution.Variance         = alphaTimesVariance * branchOrLeaf.Length;
            return(plainConditionalDistribution);
        }
        protected override ConditionalGaussianDistribution GetPlainConditionalGaussianDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters)
        {
            double alphaTimesVariance = gaussianParameters["AlphaVariance"].Value;
            double mean  = gaussianParameters["Mean"].Value;
            double alpha = gaussianParameters["Alpha"].Value;

            ConditionalGaussianDistribution plainConditionalDistribution = ConditionalGaussianDistribution.GetInstance();
            double root1MinusAlphaTimesBranchLength = Math.Sqrt(1 - alpha * branchOrLeaf.Length);

            // ax + b, Mean := b
            plainConditionalDistribution.Mean = mean * (1.0 - root1MinusAlphaTimesBranchLength);
            // ax + b = x, LinearCoefficent := a
            plainConditionalDistribution.LinearCoefficent = root1MinusAlphaTimesBranchLength;
            plainConditionalDistribution.Variance         = alphaTimesVariance * branchOrLeaf.Length;
            return(plainConditionalDistribution);
        }
 protected abstract ConditionalGaussianDistribution GetPlainConditionalGaussianDistribution(
     BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters);
예제 #9
0
        protected override ConditionalGaussianDistributionParams GetPlainConditionalGaussianDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters)
        {
            // NOTE: For BM, interpret Alpha as AlphaTimesVariance. Alpha is only used to multiply against variance, and searching is easier we we do
            // it this way, as otherwise alphaTimesVariance is affected by both alpha and variance when we're searching.
            double alphaTimesVariance = gaussianParameters["Alpha"].Value;
            //double alpha = gaussianParameters["Alpha"].Value;
            //double variance = gaussianParameters["Variance"].Value;

            // 0 (const part of mean) ax + b, Mean := b
            double mean = 0;
            // 1 (ax + b = x), linearCoefficent := a.
            double linearCoefficient = 1;
            //double conditionalVariance = alpha * variance * branchOrLeaf.Length;
            double conditionalVariance = alphaTimesVariance * branchOrLeaf.Length;

            ConditionalGaussianDistributionParams plainConditionalDistribution =
                ConditionalGaussianDistributionParams.GetInstance(mean, conditionalVariance, linearCoefficient);

            return(plainConditionalDistribution);
        }
예제 #10
0
        protected override ConditionalGaussianDistributionParams GetPlainConditionalGaussianDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters)
        {
            double variance = gaussianParameters["Variance"].Value;

            ConditionalGaussianDistributionParams plainConditionalDistribution =
                ConditionalGaussianDistributionParams.GetInstance(0, variance, 1);

            return(plainConditionalDistribution);
        }
예제 #11
0
        protected override ConditionalGaussianDistributionParams GetPlainConditionalGaussianDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList gaussianParameters)
        {
            double variance = gaussianParameters["Variance"].Value;
            //double alphaTimesVariance = gaussianParameters["AlphaVariance"].Value;
            double mean            = gaussianParameters["Mean"].Value;
            double alpha           = gaussianParameters["Alpha"].Value;
            double fOfBranchLength = FOfBranchLength(branchOrLeaf.Length, alpha);

            //ConditionalGaussianDistributionParams plainConditionalDistribution = ConditionalGaussianDistributionParams.GetInstance();
            //double root1MinusAlphaTimesBranchLength = Math.Sqrt(1 - alpha * branchOrLeaf.Length);
            double root1MinusFofBranchLength = Math.Sqrt(1 - FOfBranchLength(branchOrLeaf.Length, alpha));

            // ax + b, Mean := b
            double meanForGaussDistParams = mean * (1.0 - root1MinusFofBranchLength);
            //double meanForGausDistParams = mean * (1.0 - root1MinusAlphaTimesBranchLength);
            // ax + b = x, LinearCoefficent := a
            double linearCoeffForGaussDistParams = root1MinusFofBranchLength;
            //double linearCoeffForGausDistParams = root1MinusAlphaTimesBranchLength;
            //double varForGausDistParams = alphaTimesVariance * branchOrLeaf.Length;
            double varianceForGaussDistParams = fOfBranchLength * variance;

            ConditionalGaussianDistributionParams plainConditionalDistribution =
                ConditionalGaussianDistributionParams.GetInstance(meanForGaussDistParams, varianceForGaussDistParams, linearCoeffForGaussDistParams);

            return(plainConditionalDistribution);
        }
예제 #12
0
        protected override double[][] DefaultDistribution(BranchOrLeaf branchOrLeaf, OptimizationParameterList parameters)
        {
            double[][] P = GetTransitionProbabilityMatrix(parameters, branchOrLeaf.Length);

            return(P);
        }