private BestSoFar <double, double> OneDOptimizationInternal(Converter <double, double> oneDRealFunction, double logOddsLow, double logOddsHigh, double logOddsPrecision) { int gridLineCount = 10; double logOddsRangeIncrement = (logOddsHigh - logOddsLow) / (double)gridLineCount; BestSoFar <double, double> bestParameterSoFar = BestSoFar <double, double> .GetInstance(SpecialFunctions.DoubleGreaterThan); Debug.WriteLine(SpecialFunctions.CreateTabString("parameter", "parameterLogOdds", "score")); for (int gridLine = 0; gridLine <= gridLineCount; ++gridLine) { double parameterLogOdds = logOddsLow + gridLine * logOddsRangeIncrement; double parameter = SpecialFunctions.Probability(parameterLogOdds); double score = oneDRealFunction(parameter); Debug.WriteLine(SpecialFunctions.CreateTabString(parameter, parameterLogOdds, score)); bestParameterSoFar.Compare(score, parameterLogOdds); } Debug.WriteLine(""); if (logOddsHigh - logOddsLow < logOddsPrecision) { return(bestParameterSoFar); } return(OneDOptimizationInternal(oneDRealFunction, bestParameterSoFar.Champ - logOddsRangeIncrement, bestParameterSoFar.Champ + logOddsRangeIncrement, logOddsPrecision)); }
//private BestSoFar<double, double> OneDOptimizationInternal(oneDRealFunctionDelegate oneDRealFunction, // double start, double increment, int gridStart, int gridLines) //{ // BestSoFar<double, double> bestParameterSoFar = BestSoFar<double, double>.GetInstance(delegate(double champScore, double challengerScore) { return challengerScore > champScore; }); // for(int gridLine = gridStart; gridLine < gridLines; ++gridLine) // { // double parameter = start + gridLine * increment; // double score = oneDRealFunction(parameter); // bestParameterSoFar.Compare(score, parameter); // } // if (Math.Abs(bestParameterSoFar.Champ - increment) < increment * .1) // { // return OneDOptimizationInternal(oneDRealFunction, 0.0, increment * .1, 1, 9); // } // else if (Math.Abs((1.0 - bestParameterSoFar.Champ) - increment) < increment * .1) // { // return OneDOptimizationInternal(oneDRealFunction, bestParameterSoFar.Champ, increment * .1, 1, 9); // } // else // { // return bestParameterSoFar; // } //} static public BestSoFar <double, double> OneDOptimization(Converter <double, double> oneDRealFunction, double low, double high, double precision, int gridLineCount) { double rangeIncrement = (high - low) / (double)gridLineCount; BestSoFar <double, double> bestParameterSoFar = BestSoFar <double, double> .GetInstance(SpecialFunctions.DoubleGreaterThan); //Debug.WriteLine(SpecialFunctions.CreateTabString("parameter", "score")); //Debug.WriteLine(SpecialFunctions.CreateTabString(low, high, rangeIncrement)); for (int gridLine = 0; gridLine <= gridLineCount; ++gridLine) { double parameter = low + gridLine * rangeIncrement; //double parameter = SpecialFunctions.Probability(parameterLogOdds); double score = oneDRealFunction(parameter); //Debug.WriteLine(SpecialFunctions.CreateTabString(parameter, score)); bestParameterSoFar.Compare(score, parameter); } //Debug.WriteLine(""); if (high - low < precision) { return(bestParameterSoFar); } return(OneDOptimization(oneDRealFunction, bestParameterSoFar.Champ - rangeIncrement, bestParameterSoFar.Champ + rangeIncrement, precision, gridLineCount)); }
private void ReportPerHla(OptimizationParameterList qmrrParams, Dictionary <string, BestSoFar <double, TrueCollection> > peptideToBestHlaAssignmentSoFar, string directory, string name) { string fileName = string.Format(@"{0}\NoisyOr.PeptideHlaProbability.{1}.new.txt", directory, name); using (StreamWriter output = File.CreateText(fileName)) { output.WriteLine(SpecialFunctions.CreateTabString("Peptide", "HLA", "LogOdds", "Probability")); foreach (QmrrPartialModel qmrrPartialModel in QmrrPartialModelCollection) { QmrrModelMissingAssignment aQmrrModelMissingAssignment = QmrrModelMissingAssignment.GetInstance(ModelLikelihoodFactories, qmrrPartialModel, qmrrParams); BestSoFar <double, TrueCollection> bestHlaAssignment = peptideToBestHlaAssignmentSoFar[qmrrPartialModel.Peptide]; Set <Hla> trueCollectionFullAsSet = new Set <Hla>(bestHlaAssignment.Champ); double loglikelihoodFull = bestHlaAssignment.ChampsScore; foreach (Hla hla in trueCollectionFullAsSet) { bool known = qmrrPartialModel.KnownHlaSet.Contains(hla); if (!known) { Set <Hla> allLessOne = trueCollectionFullAsSet.SubtractElement(hla); TrueCollection trueCollectionWithout = TrueCollection.GetInstance(allLessOne); double loglikelihoodWithout = aQmrrModelMissingAssignment.LogLikelihoodOfCompleteModelConditionedOnKnownHlas(trueCollectionWithout); double logOdds = loglikelihoodFull - loglikelihoodWithout; double probabilityFull = Math.Exp(loglikelihoodFull); double probabilityWithout = Math.Exp(loglikelihoodWithout); double probability = probabilityFull / (probabilityFull + probabilityWithout); Debug.Assert(logOdds >= 0); // real assert output.WriteLine(SpecialFunctions.CreateTabString(qmrrPartialModel.Peptide, hla, logOdds, probability)); } } } } }
internal void CreateNoSwitchablesHlaAssignment() { BestHlaAssignmentSoFar = BestSoFar <double, TrueCollection> .GetInstance(SpecialFunctions.DoubleGreaterThan); TrueCollection trueCollection = TrueCollection.GetInstance(QmrrModelMissingAssignment.KnownHlaSet); double scoreOnNoSwitchables = QmrrModelMissingAssignment.LogLikelihoodOfCompleteModelConditionedOnKnownHlas(trueCollection); BestHlaAssignmentSoFar.Compare(scoreOnNoSwitchables, trueCollection); }
internal override Dictionary <Hla, PValueDetails> CreateHlaToPValueDetails(int nullIndex, string peptide, Dictionary <string, Set <Hla> > pidToHlaSetAll, Set <Hla> setOfHlasToConsiderAdding, TextWriter writer) { Dictionary <Hla, PValueDetails> hlaToPValueDetails = new Dictionary <Hla, PValueDetails>(); if (setOfHlasToConsiderAdding.Count == 0) { return(hlaToPValueDetails); } Dictionary <string, double> pidToReactValue = ReactTableUnfiltered[peptide]; Set <Hla> knownHlaSet = KnownTable(peptide); SpecialFunctions.CheckCondition(setOfHlasToConsiderAdding.Intersection(knownHlaSet).Count == 0); Set <Hla> bestHlaSetSoFar = Set <Hla> .GetInstance(); while (setOfHlasToConsiderAdding.Count > 0) { BestSoFar <PValueDetails, Hla> bestHlaToAddSoFar = BestSoFar <PValueDetails, Hla> .GetInstance(delegate(PValueDetails pValueDetails1, PValueDetails pValueDetails2) { return(pValueDetails1.Diff.CompareTo(pValueDetails2.Diff)); }); foreach (Hla hla in setOfHlasToConsiderAdding) //!!!only look at hla's of patients with reactivity to this peptide (how effects nulls?) { PValueDetails pValueDetails = CreateAPValueDetail(nullIndex, peptide, pidToHlaSetAll, knownHlaSet, bestHlaSetSoFar, hla); bestHlaToAddSoFar.Compare(pValueDetails, hla); } //Debug.WriteLine(""); PValueDetails bestPValueDetails = bestHlaToAddSoFar.ChampsScore; //!!!weird that PValue details is the score and the object if (bestPValueDetails.PValue() > PValueCutOff) { break; } Hla hlaToAdd = bestHlaToAddSoFar.Champ; setOfHlasToConsiderAdding.Remove(hlaToAdd); bestHlaSetSoFar = bestHlaSetSoFar.Union(hlaToAdd); hlaToPValueDetails.Add(hlaToAdd, bestPValueDetails); writer.WriteLine(bestPValueDetails); //Debug.WriteLine(bestPValueDetails); writer.Flush(); } return(hlaToPValueDetails); }
private void ReportPerHlaAssignment(Dictionary <string, BestSoFar <double, TrueCollection> > peptideToBestHlaAssignmentSoFar, string directory, string name) { string fileName = string.Format(@"{0}\NoisyOr.HlasPerPeptide.{1}.new.txt", directory, name); using (StreamWriter output = File.CreateText(fileName)) { output.WriteLine(SpecialFunctions.CreateTabString("Peptide", "HLAAssignment", "LogLikelihood")); foreach (QmrrPartialModel qmrrPartialModel in QmrrPartialModelCollection) { BestSoFar <double, TrueCollection> bestHlaAssignment = peptideToBestHlaAssignmentSoFar[qmrrPartialModel.Peptide]; TrueCollection trueCollectionFull = bestHlaAssignment.Champ; double loglikelihoodFull = bestHlaAssignment.ChampsScore; output.WriteLine(SpecialFunctions.CreateTabString(qmrrPartialModel.Peptide, trueCollectionFull, loglikelihoodFull)); } } }
static public double Optimize(FunctionToOptimizeDelegate functionToOptimize, ref List <double> point, List <double> low, List <double> high, OptimizationParameterList qmrrParamsStart, int numberOfIterationsOverParameters, double precision, int gridLineCount) { double eps = 1e-9; //Debug.WriteLine(qmrrParamsStart.ToStringHeader()); double oldScore = double.NaN; //Debug.WriteLine(SpecialFunctions.CreateTabString("iterationOverParameters", "iParameter", "Probability", "LogOdds", "Score")); for (int iterationOverParameters = 0; iterationOverParameters < numberOfIterationsOverParameters; ++iterationOverParameters) { double newScore = double.NaN; int doSearchParameterCount = 0; for (int iParameter = 0; iParameter < point.Count; ++iParameter) { if (qmrrParamsStart.DoSearch(iParameter)) { ++doSearchParameterCount; List <double> pointClone = new List <double>(point); BestSoFar <double, double> bestParamSoFar = OneDOptimization( delegate(double parameter) { pointClone[iParameter] = parameter; return(functionToOptimize(pointClone)); }, low[iParameter], high[iParameter], precision, gridLineCount); point[iParameter] = bestParamSoFar.Champ; //Debug.WriteLine(SpecialFunctions.CreateTabString(iterationOverParameters, iParameter, SpecialFunctions.Probability(bestParamSoFar.Champ), bestParamSoFar.Champ, bestParamSoFar.ChampsScore)); newScore = bestParamSoFar.ChampsScore; //Debug.WriteLine("END ITER:" + SpecialFunctions.CreateTabString2(point) + SpecialFunctions.CreateTabString("", newScore)); } } if ((!double.IsNaN(oldScore) && Math.Abs(oldScore - newScore) < eps) || doSearchParameterCount < 2) //If only 0 or 1 searchable params, then one pass is enough { oldScore = newScore; break; } oldScore = newScore; } return(oldScore); }
protected OptimizationParameterList FindBestParams(string peptide, Set <Hla> candidateHlaSet, Set <Hla> hlaWithLinkZero, Dictionary <string, Set <Hla> > patientList, //Dictionary<string, Dictionary<string,double>> reactTable, out double score) { //SpecialFunctions.CheckCondition(false, "Regression test this to be sure that switch to new optimization method didn't change anything important - cmk 5/1/2006"); Set <Hla> knownHlaSet = KnownTable(peptide); TrueCollection trueCollection = TrueCollection.GetInstance(candidateHlaSet, knownHlaSet); OptimizationParameterList qmrrParamsThisPeptide = CreateQmrrParamsStartForTheseCandidateHlas(trueCollection.CreateHlaAssignmentAsSet(), hlaWithLinkZero); //OptimizationParameterList qmrrParamsThisPeptide = CreateQmrrParamsX(causePrior, leakProbability, trueCollection.CreateHlaAssignmentAsSet()); ModelLikelihoodFactories modelLikelihoodFactories = ModelLikelihoodFactories.GetInstanceLinkPerHla(qmrrParamsThisPeptide, trueCollection.CreateHlaAssignmentAsSet()); QmrrPartialModelCollection singletonQmrrPartialModelCollection = QmrrPartialModelCollection.GetInstance( peptide, modelLikelihoodFactories, qmrrParamsThisPeptide, patientList, ReactTableUnfiltered, _knownTable, HlaFactory.Name //!!!would it be better to pass the actual factory??? ); BestSoFar <double, TrueCollection> bestSoFar = BestSoFar <double, TrueCollection> .GetInstance(SpecialFunctions.DoubleGreaterThan); bestSoFar.Compare(double.NegativeInfinity, trueCollection); Dictionary <string, BestSoFar <double, TrueCollection> > peptideToBestHlaAssignmentSoFar = new Dictionary <string, BestSoFar <double, TrueCollection> >(); peptideToBestHlaAssignmentSoFar.Add(peptide, bestSoFar); QmrrlModelMissingParametersCollection aQmrrlModelMissingParametersCollection = QmrrlModelMissingParametersCollection.GetInstance(modelLikelihoodFactories, singletonQmrrPartialModelCollection, peptideToBestHlaAssignmentSoFar); OptimizationParameterList qmrrParamsEnd = aQmrrlModelMissingParametersCollection.FindBestParams(qmrrParamsThisPeptide, out score); return(qmrrParamsEnd); }
override public double Run(Converter <OptimizationParameter, double> oneDRealFunction, OptimizationParameter param) { double low = param.LowForSearch; double high = param.HighForSearch; Converter <double, double> oneDRealFunctionInDoubleSpace = delegate(double d) { param.ValueForSearch = d; return(oneDRealFunction(param)); }; double initParamValue = param.ValueForSearch; BestSoFar <double, double> bestFound = OneDOptimizationX(oneDRealFunctionInDoubleSpace, low, high, GridLineCount, Tolerance); bestFound.Compare(oneDRealFunctionInDoubleSpace(initParamValue), initParamValue); // make sure we didn't get any worse //bestInput = bestFound.Champ; param.ValueForSearch = bestFound.Champ; return(bestFound.ChampsScore); }
internal static QmrrlModelMissingParameters GetInstance(ModelLikelihoodFactories modelLikelihoodFactories, QmrrPartialModel qmrrPartialModel, BestSoFar <double, TrueCollection> bestSoFar) { QmrrlModelMissingParameters aQmrrlModelMissingParameters = new QmrrlModelMissingParameters(); aQmrrlModelMissingParameters.QmrrPartialModel = qmrrPartialModel; aQmrrlModelMissingParameters.TrueCollection = bestSoFar.Champ; aQmrrlModelMissingParameters.ModelLikelihoodFactories = modelLikelihoodFactories; aQmrrlModelMissingParameters.LogLikelihoodOfCompleteModelConditionedOnKnownHlas = modelLikelihoodFactories.MissingParametersDelegateFactory(qmrrPartialModel, bestSoFar.Champ); return(aQmrrlModelMissingParameters); }
private void CreateBestParamsSoFar() { BestParamsSoFar = BestSoFar <double, OptimizationParameterList> .GetInstance(SpecialFunctions.DoubleGreaterThan); BestParamsSoFar.Compare(double.NegativeInfinity, QmrrParamsStart); }