Пример #1
0
void runSaltBridgeMC(
		     subSeq &_exposedPositions,
		     map<string,map<string,map<int, map<string,map<string, double> > > > > &_sbScoreTable,
		     System &_sys, 
		     Options &_opt,
		     std::priority_queue< std::pair<saltBridgeResult,subSeq>, std::vector< std::pair<saltBridgeResult,subSeq> >, compareScores> &_mcData){

  // WT score
  saltBridgeResult wt_sbresult = scoreSaltBridgePositions(_exposedPositions,_sbScoreTable,_sys);

  // Map to insure we don't fill priority queue with duplicates
  map<string,bool> mcDataMap;

  string possibleMutations = "KREDH";

  RandomNumberGenerator rng;
  rng.setTimeBasedSeed();
  MSLOUT.stream() << "RNG SEED: "<<rng.getSeed()<<endl;

  //MonteCarloManager MCMngr(_startingTemperature, _endingTemperature,_scheduleCycles, _scheduleShape, _maxRejectionsNumber, _convergedSteps, _convergedE);
  MonteCarloManager MCMngr(_opt.startMCtemp,_opt.endMCtemp,_opt.numMCcycles, MonteCarloManager::EXPONENTIAL,100,0,0.0);
  MCMngr.setRandomNumberGenerator(&rng);
  MCMngr.setEner(wt_sbresult.score);
  
  subSeq current   = _exposedPositions;
  string wtSeq     = _exposedPositions.seq;

  // TODO add options to Options opt; to take care of MC-related options..... get rid of hard-coded values.

  while (!MCMngr.getComplete()) {
    
    // Make change
    int mutIndex = rng.getRandomInt(0,possibleMutations.size()-1);
    int seqPosIndex = rng.getRandomInt(0,_exposedPositions.seq.size()-1);
    string mutAA = possibleMutations.substr(mutIndex,1);
    string previousAA = current.seq.substr(seqPosIndex,1);
    current.seq.replace(seqPosIndex,1,mutAA);

    // Eval
    saltBridgeResult sbResult = scoreSaltBridgePositions(current,_sbScoreTable,_sys);
    //MSLOUT.stream() << "SCORE: "<<score<<" wt: "<<wt_score<<endl;

    // MC test for Acceptance:
    if (MCMngr.accept(sbResult.score)){

      //cout << "New SEQ: "<<current.seq<<" score: "<<score<<endl;
      //cout << "WT  SEQ: "<<wtSeq<<" score: "<<wt_score<<endl;
      bool keepIt = false;
      map<string, bool>::iterator it;
      it = mcDataMap.find(sbResult.sbId);
      if (it == mcDataMap.end()){
	mcDataMap[sbResult.sbId] = true;
	if (_mcData.size() >= _opt.numSequenceModels){
	  if (sbResult.score < _mcData.top().first.score){
	    // Remove highest score, then add
	    _mcData.pop();
	    _mcData.push(pair<saltBridgeResult,subSeq>(sbResult,current));
	    keepIt = true;
	  }

	} else {
	  _mcData.push(pair<saltBridgeResult,subSeq>(sbResult,current));
	  keepIt = true;
	}

      } 
      if (!keepIt){
	current.seq.replace(seqPosIndex,1,previousAA);
      }
    } else {
      current.seq.replace(seqPosIndex,1,previousAA);
   }
  }
  MSLOUT.stream() << "MC Completed -> "<<MCMngr.getReasonCompleted()<<endl;

}