/// <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);
        }
Esempio n. 3
0
 static MainForm()
 {
     Simulator  = new RoadRunner();
     SelectForm = null;
 }
Esempio n. 4
0
 static MainForm()
 {
     Simulator = new RoadRunner();
     SelectForm = null;
 }
Esempio n. 5
0
        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);
            });
        }