/// <summary> /// Aplica TEMPO de passo em MONTE CARLO! /// </summary> public static bool Run() { LatticeMoves objLatticeMoves = new LatticeMoves(); InitVariables.Do(); #region Criação Movimentação MoveSet StateControl.condStop = (GCPS.chain.r.Count + 1) * 2; StateControl.maxInterations = AppConfigClient.Param.dataToProcess.maxInterations; //numero maximo de tentativas StateControl.recPathEvery = 0; PrinterMessages.PrintHeader(AppConfigClient.CurrentGuid, StateControl.maxInterations);//, StateControl.condStop); //Salva a primeira configuração do monomero Recorder.RecTrajectoryFile(objLatticeMoves, AppConfigClient.Param.dataToProcess.splitFileEvery, true); //Salva snapshot calculo da "variação de energia" e salva em arquivo o valor de "U" CalculatingEnergy.existFileForSaveDebug = false; CalculatingEnergy.SaveValueOfDebugFile(); int maxValConTop = 0; DateTime startDateTime = DateTime.Now; Console.WriteLine("Start: {0}", startDateTime.ToString()); for (GCPS.mcStepsLoop01 = 0; GCPS.mcStepsLoop01 < StateControl.maxInterations; GCPS.mcStepsLoop01++) { //PRINT % PrinterMessages.PrintPercentCompleted(AppConfigClient.CurrentGuid); for (GCPS.mcStepsLoop02 = 0; GCPS.mcStepsLoop02 < GCPS.mcStepsLoop02_LIMITE; GCPS.mcStepsLoop02++) //loop externo de 5 passos { for (GCPS.mcStepsLoop03 = 0; GCPS.mcStepsLoop03 < GCPS.chain.r.Count; GCPS.mcStepsLoop03++) //loop para tamanha da cadeia { GCPS.chain.CopyToTempMonomero(); //Sorteiro o residuo para a tentativa de movimento LatticeMoves.SortMoviment(); //var occuredMotion armazena o boleano da ocorrência de movimentos dos três (3) tipos abaixo: bool occuredMotion = objLatticeMoves.LatticeTryModeSetCrankshaft(); if (!occuredMotion) { occuredMotion = objLatticeMoves.LatticeTryModeSetEnds(); if (!occuredMotion) { occuredMotion = objLatticeMoves.LatticeTryModeSetKink(); if (!occuredMotion) { GCPS.chain.contMoves.othersReject++; } } } //Verifica se ocorreu um movimento na cadeia temporária if (occuredMotion) { //Excluir valores energia (e) anterior se existentes ao node //CalculatingEnergy.DelEnergy(GCPS.tempMonomero.selectNode); //Rotina executa: Processa calculo da "variação de energia" e salva em arquivo o valor de "U" Reclassifica a cadeia TEMPORARIA //GCPS.tempMonomero.NeighborsUpdatePeerPoint(GCPS.tempMonomero.selectNode); //Reclassifica TODA A CADEIA GCPS.tempChain.NeighborsUpdateAll(); #region //Condição de Teste: //(1) deltaE <=0 -> "Aceita a nova configuração" //(2) deltaE >0 -> Então // - Calcula e^-deltaE*beta (calcE) // - Gerar um número randôico (r) entre 0 e 1 // Se r<=calcE então "Aceita a nova configuração" // Senão "Rejeita a nova configuração" #endregion //Efetua calcula das varívais do meio ambiente (deltaE, lastR e lastTransitionProbability, RG, DPP e etc) Structs.Environment.CalculateEnvironment(); if (AcceptMove()) { //Salva classificaca da cadeia GCPS.tempChain.NeighborsSave(GCPS.chain.isem, ref GCPS.chain.numberNeighborTopological); //Aceita o movimento GCPS.chain.AcceptMotion(); if (GCPS.chain.ECount() != (GCPS.chain.TotalNeighborTopological() / 2)) { new GridProteinFolding.Middle.Helpers.LoggingHelpers.Log().ErrorNeighborTopological(new ErrorNeighborTopological("GCPS.chain.ECount() != (GCPS.chain.TotalNeighborTopological() / 2"), Types.ErrorLevel.Warning); } //Snapshot(ref objLatticeMoves); //REC if (GCPS.chain.numberNeighborTopological >= (GCPS.chain.r.Count - 1)) { FoundData(startDateTime); Snapshot(ref objLatticeMoves); } //Condição de parada if (GCPS.chain.numberNeighborTopological >= (GCPS.chain.r.Count)) { FoundData(startDateTime); Snapshot(ref objLatticeMoves); if (Structs.Environment.rg == 1.41) { break; } } else { if (maxValConTop < GCPS.chain.numberNeighborTopological) { maxValConTop = GCPS.chain.numberNeighborTopological; FoundData(startDateTime); } } } GCPS.chain.interationEnergy = string.Empty; GCPS.chain.typeOfLattice = BasicEnums.Lattices.None; //Se movimento ocorreu, é necessário pré qualificar novamente toda a cadeia ClassificationMotion.PreClassificationOfMotion(); if (StateControl.condStop == GCPS.chain.TotalNeighborTopological()) { break; } } GCPS.McStepsDo(); } } } //Salva o movimento da cadeia Recorder.RecTrajectoryFileCalcSpinningRay(AppConfigClient.CurrentGuid, StateControl.maxInterations, objLatticeMoves); GICO.WriteLine(AppConfigClient.CurrentGuid, String.Format("MCSteps: {0}", GCPS.McSteps)); //Check Parse do ultimo arquivo valido if (!LatticeMoves.Parse()) { new GridProteinFolding.Middle.Helpers.LoggingHelpers.Log().ErroParseMoves(new ErroParseMovesException("ErroParseMoves"), Types.ErrorLevel.None); } //MoveSet de saída do movimento do ultimo arquivo valido Recorder.RecTrajectoryFile(objLatticeMoves, AppConfigClient.Param.dataToProcess.splitFileEvery); //MoveSet (RESULT) objLatticeMoves.RecMoveSet(AppConfigClient.CurrentGuid, SimulationResults + Directory.FileExtension); objLatticeMoves.Disposed(); objLatticeMoves = null; #endregion return(true); }
/// <summary> /// Aplica TEMPO de passo em MONTE CARLO! /// </summary> public static bool Run() { LatticeMoves objLatticeMoves = new LatticeMoves(); InitVariables.Do(); #region Criação Movimentação MoveSet //StateControl.condStop = (GCPS.chain.r.Count + 1) * 2; StateControl.maxInterations = AppConfigClient.Param.dataToProcess.maxInterations; //numero maximo de tentativas StateControl.recPathEvery = 0; PrinterMessages.PrintHeader(AppConfigClient.CurrentGuid, StateControl.maxInterations);//, StateControl.condStop); //Salva a primeira configuração do monomero Recorder.RecTrajectoryFile(objLatticeMoves, AppConfigClient.Param.dataToProcess.splitFileEvery, true); //Salva snapshot calculo da "variação de energia" e salva em arquivo o valor de "U" CalculatingEnergy.existFileForSaveDebug = false; CalculatingEnergy.SaveValueOfDebugFile(); //int maxValConTop = 0; bool stoped = false; DateTime startDateTime = DateTime.Now; Console.WriteLine("Start: {0}", startDateTime.ToString()); while (!stoped) { GCPS.chain.CopyToTempMonomero(); //Sorteiro o residuo para a tentativa de movimento LatticeMoves.SortMoviment(); //var occuredMotion armazena o boleano da ocorrência de movimentos dos três (3) tipos abaixo: bool occuredMotion = objLatticeMoves.LatticeTryModeSetCrankshaft(); if (!occuredMotion) { occuredMotion = objLatticeMoves.LatticeTryModeSetEnds(); if (!occuredMotion) { occuredMotion = objLatticeMoves.LatticeTryModeSetKink(); if (!occuredMotion) { GCPS.chain.contMoves.othersReject++; } } } //Verifica se ocorreu um movimento na cadeia temporária if (occuredMotion) { //Reclassifica TODA A CADEIA GCPS.tempChain.NeighborsUpdateAll(); //Efetua calcula das varívais do meio ambiente (deltaE, lastR e lastTransitionProbability, RG, DPP e etc) Structs.Environment.CalculateEnvironment(); if (AcceptMove()) { //Salva classificaca da cadeia GCPS.tempChain.NeighborsSave(GCPS.chain.isem, ref GCPS.chain.numberNeighborTopological); //Aceita o movimento GCPS.chain.AcceptMotion(); if (GCPS.chain.ECount() != (GCPS.chain.TotalNeighborTopological() / 2)) { new GridProteinFolding.Middle.Helpers.LoggingHelpers.Log().ErrorNeighborTopological(new ErrorNeighborTopological("GCPS.chain.ECount() != (GCPS.chain.TotalNeighborTopological() / 2"), Types.ErrorLevel.Warning); } //Condição de parada if (GCPS.chain.numberNeighborTopological >= (GCPS.chain.r.Count)) { FoundData(startDateTime); Snapshot(ref objLatticeMoves); if (CheckStruct()) { stoped = true; } } } GCPS.chain.interationEnergy = string.Empty; GCPS.chain.typeOfLattice = BasicEnums.Lattices.None; //Se movimento ocorreu, é necessário pré qualificar novamente toda a cadeia ClassificationMotion.PreClassificationOfMotion(); } GCPS.McStepsDo(); } //Salva o movimento da cadeia Recorder.RecTrajectoryFileCalcSpinningRay(AppConfigClient.CurrentGuid, StateControl.maxInterations, objLatticeMoves); GICO.WriteLine(AppConfigClient.CurrentGuid, String.Format("MCSteps: {0}", GCPS.McSteps)); //Check Parse do ultimo arquivo valido if (!LatticeMoves.Parse()) { new GridProteinFolding.Middle.Helpers.LoggingHelpers.Log().ErroParseMoves(new ErroParseMovesException("ErroParseMoves"), Types.ErrorLevel.None); } //MoveSet de saída do movimento do ultimo arquivo valido Recorder.RecTrajectoryFile(objLatticeMoves, AppConfigClient.Param.dataToProcess.splitFileEvery); //MoveSet (RESULT) objLatticeMoves.RecMoveSet(AppConfigClient.CurrentGuid, SimulationResults + Directory.FileExtension); //Compara estruturas com as TARGETS //ComparerTargets(GCPS.chain.r); #endregion //MoveSet de saída do movimento para SANDBOX Recorder.RecTrajectoryFileSandBox(objLatticeMoves); objLatticeMoves.Disposed(); objLatticeMoves = null; return(true); }