/// <summary> /// Initializes a new instance of the Optimizer class. /// </summary> public Optimizer() { maxBoundsArray = new List <double>(); minBoundsArray = new List <double>(); pValues = new List <double>(); pNames = new List <string>(); rr = new RoadRunner(); }
public OptimizationResult optimizeWithGeneticAlgo(string sbmlInput, AlgorithmArguments algoArgs , Action <ArrayList> updateStatus = null) { hasUpdateStatusMethod = updateStatus != null; evalOption = algoArgs.EvalOption; try { isProcessActive = true; if (rr == null) { rr = new RoadRunner(); } rr.loadSBML(sbmlInput); rr.setNumPoints(numPoints); #region OSCillator if (algoArgs.EvalOption == OSCILLATOR || algoArgs.EvalOption == TURNINGPOINT) { //Read num of Generations numOfGenerations = algoArgs.Args.NumOfGenerations; //Read num of Members in Population numOfMembers = algoArgs.Args.NumOfMembers; //Read num of Parameters in Member numOfParameters = 0; pNames.Clear(); pValues.Clear(); minBoundsArray.Clear(); maxBoundsArray.Clear(); foreach (var nameValueBound in algoArgs.NameValueBounds) { pNames.Add(nameValueBound.Item1); pValues.Add(nameValueBound.Item2); minBoundsArray.Add(nameValueBound.Item3); maxBoundsArray.Add(nameValueBound.Item4); ++numOfParameters; } //Read num of Members to Select from Population numOfMemSelect = algoArgs.Args.NumOfMemSelect; //Read the value of Pc - Crossover probability Pc = algoArgs.Args.Pc; //Read the value of Pm - Mutation probability Pm = algoArgs.Args.Pm; //Read the value of TOLERANCE Level Tolerance = algoArgs.Args.Tolerance; //Read the value of Random_Number Seed randomSeed = algoArgs.Args.RandomSeed; simulationTime = algoArgs.Args.SimulationTime; //Read the number of iterations after which you want to receive the update nUpdate = algoArgs.Args.NUpdate; //Try to compute the steady state using the initial parameter values. //If steady state cannot be reached throw an exception to user asking him //to reset the initial parameter values. initMember = new Member { numOfParameters = pValues.Count, pValuesArray = new List <double>(pValues) }; try { compObjFnFitnessForInitMem(ref initMember); } catch (SBWException) { var ex = new BifException( "Unable to calculate steadystate value with the current initial parameter values.", "Please start with different set of parameter values!!! "); throw ex; } var generationArray = new[] { new Generation(), new Generation() }; //using only two generation objects generationArray[0].allocMemberArray(algoArgs.Args.NumOfMembers); var m = new Member(); rnd = algoArgs.Args.RandomSeed == 0 ? new MT19937Generator() : new MT19937Generator(algoArgs.Args.RandomSeed); for (int i = 0; i < algoArgs.Args.NumOfMembers; i++) { m.initParamArray(pValues, minBoundsArray, maxBoundsArray); evalObjFnFitness(ref m); generationArray[0].setMember(i, m); //cout << "Member: " << i << endl; if (!isProcessActive) { return(new OptimizationResult { Iterations = 0, Score = generationArray[0].genFitScore, Values = generationArray[0].memArray[0].pValuesArray, RealEigenValues = generationArray[0].memArray[0].realEigenValueArray, ImagEigenValues = generationArray[0].memArray[0].complexEigenValueArray }); } //Send status update after every nUpdate simulations. NotifyAboutNumberOfSImulations(updateStatus, i); } generationArray[0].sortMemberArray(); generationArray[0].setFitScore(); //update status after first generation var updateParamValuesArray = new List <double>(); Member best = generationArray[0].getMember(0); for (int i = 0; i < numOfParameters; i++) { updateParamValuesArray.Add(best.pValuesArray[i]); } int minRealEigenIndex; if (hasUpdateStatusMethod) { try { var update = new ArrayList { 1, 0, generationArray[0].genFitScore, updateParamValuesArray }; if (best.realEigenValueArray.Count > 0) { minRealEigenIndex = findMinRealEigenValueIndex( best.realEigenValueArray); update.Add(best.realEigenValueArray[minRealEigenIndex]); update.Add(best.complexEigenValueArray[minRealEigenIndex]); } else { update.Add(0.0); update.Add(0.0); } update.Add(best.realEigenValueArray); update.Add(best.complexEigenValueArray); updateStatus(update); } catch (SBWException ae) { ae = new BifException("Error in sbwBifGAOptimize", "Unable to call update status!!!"); throw ae; } } generationArray[1].allocMemberArray(algoArgs.Args.NumOfMembers); if (algoArgs.Args.NumOfGenerations == 1) { generationArray[1] = generationArray[0]; } int Iterations = 1; for (int j = 1; j < algoArgs.Args.NumOfGenerations; j++) { for (int k = 0; k < (algoArgs.Args.NumOfMembers); k = k + 2) { var parent1 = selectMember(generationArray[0]); var parent2 = selectMember(generationArray[0]); var child1 = new Member(); var child2 = new Member(); crossOver(parent1, parent2, ref child1, ref child2); mutate(ref child1); evalObjFnFitness(ref child1); mutate(ref child2); evalObjFnFitness(ref child2); Member bestMem1; Member bestMem2; selectBestTwo(parent1, parent2, child1, child2, out bestMem1, out bestMem2); generationArray[1].setMember(k, bestMem1); generationArray[1].setMember(k + 1, bestMem2); if (!isProcessActive) { return(new OptimizationResult { Iterations = 0, Score = generationArray[0].genFitScore, Values = generationArray[0].memArray[0].pValuesArray, RealEigenValues = generationArray[0].memArray[0].realEigenValueArray, ImagEigenValues = generationArray[0].memArray[0].complexEigenValueArray }); } //Send status update after every predefined number of simulations. NotifyAboutNumberOfSImulations(updateStatus, k); } generationArray[1].sortMemberArray(); generationArray[1].setFitScore(); if (generationArray[1].genFitScore > generationArray[0].genFitScore) { generationArray[1].setMember(0, best); generationArray[1].genFitScore = generationArray[0].genFitScore; } //os << j << "\t" << generationArray[1].getGenFitScore() << "\t"; updateParamValuesArray.Clear(); best = generationArray[1].getMember(0); for (int i = 0; i < numOfParameters; i++) { updateParamValuesArray.Add(best.pValuesArray[i]); //os << generationArray[1].getMember(0).pValuesArray[i] << "\t"; } //os << endl; //Call update status once you finish calculating the fitness score. if (hasUpdateStatusMethod) { try { var update = new ArrayList { 1, j, generationArray[1].genFitScore, updateParamValuesArray }; if (best.realEigenValueArray.Count > 0) { minRealEigenIndex = findMinRealEigenValueIndex(best.realEigenValueArray); update.Add(best.realEigenValueArray[minRealEigenIndex]); update.Add(best.complexEigenValueArray[minRealEigenIndex]); } else { update.Add(0.0); update.Add(0.0); } update.Add(best.realEigenValueArray); update.Add(best.complexEigenValueArray); updateStatus(update); } catch (SBWException ae) { ae = new BifException("Error in sbwBifGAOptimize", "Unable to call update status!!!"); throw ae; } } //Code to check if the Tolerance level has reached var bufferArray = new List <double>(); bufferArray.Clear(); double realPart; double complexPart; int eigenArraySize = best.eigenValueArrayDim; if (algoArgs.EvalOption == OSCILLATOR) { for (int i = 0; i < eigenArraySize; i++) { realPart = best.realEigenValueArray[i]; complexPart = best.complexEigenValueArray[i]; if (Math.Abs(complexPart) == 0.0) // Check if the imaginary part is eqaul to zero. { // If it is so then assign 10^6 to bufferArray Element. bufferArray.Add(10E6); } else // Else store the absolute value of real eigen value. { bufferArray.Add(Math.Abs(realPart)); } } } if (algoArgs.EvalOption == TURNINGPOINT) { for (int i = 0; i < eigenArraySize; i++) { realPart = best.realEigenValueArray[i]; complexPart = best.complexEigenValueArray[i]; if (Math.Abs(complexPart) > 0.0) // Check if the imaginary part is greater than zero. { // If it is so then assign 10^6 to bufferArray Element. bufferArray.Add(10E6); } else // Else store the absolute value of real eigen value. { bufferArray.Add(Math.Abs(realPart)); } } } if (bufferArray.Count > 0) { minRealEigenIndex = findMinRealEigenValueIndex(bufferArray); if (Math.Abs(bufferArray[minRealEigenIndex]) < algoArgs.Args.Tolerance) { break; } } generationArray[0] = generationArray[1]; ++Iterations; //Check the isProcessActive Flag here and gracefully exit the optimizer if it is false. if (!isProcessActive) { break; } } return(new OptimizationResult { Iterations = Iterations, Score = generationArray[0].genFitScore, Values = generationArray[0].memArray[0].pValuesArray, RealEigenValues = generationArray[0].memArray[0].realEigenValueArray, ImagEigenValues = generationArray[0].memArray[0].complexEigenValueArray }); } #endregion } catch (SBWException) { throw; } catch { throw new BifException("Problem occured in main method", " "); } return(null); }
static MainForm() { Simulator = new RoadRunner(); SelectForm = null; }
static MainForm() { Simulator = new RoadRunner(); SelectForm = null; }
private void cmdSteadyState_Click(object sender, EventArgs e) { thread.QueueItem(() => { if (m_sSBML != null) { if (m_sSBML.Length > 0) { try { if (sim == null) { sim = new RoadRunner(); } sim.loadSBML(m_sSBML); sim.simulate(); double steadyState = sim.steadyState(); if ( MessageBox.Show( "Found steady state with sums of squares: " + steadyState + ". Do you want to use this state to be used?", "Steady state calculated", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return; } sim.simulate(); ArrayList floatingSpeciesNames = sim.getFloatingSpeciesNames(); double[] speciesConcentrations1 = sim.getFloatingSpeciesConcentrations(); ArrayList boundarySpeciesNames = sim.getBoundarySpeciesNames(); double[] speciesConcentrations2 = sim.getBoundarySpeciesConcentrations(); ArrayList parameterTupleList = sim.getAllGlobalParameterTupleList(); NOM.loadSBML(m_sSBML); for (int index = 0; index < floatingSpeciesNames.Count; ++index) { NOM.setValue((string)floatingSpeciesNames[index], speciesConcentrations1[index]); } for (int index = 0; index < boundarySpeciesNames.Count; ++index) { NOM.setValue((string)boundarySpeciesNames[index], speciesConcentrations2[index]); } foreach (ArrayList arrayList in parameterTupleList) { NOM.setValue((string)arrayList[0], (double)arrayList[1]); } m_sSBML = NOM.getSBML(); loadSBML(m_sSBML); return; } catch (Exception ex) { MessageBox.Show("Could not compute steady state due to: " + ex.Message, "Steady state could not be computed ...", MessageBoxButtons.OK, MessageBoxIcon.Hand); return; } } } MessageBox.Show("There is no model to analyze. Load a model first.", "No Model loaded", MessageBoxButtons.OK, MessageBoxIcon.Hand); }); }