コード例 #1
0
        protected override SortedDictionary<UInt32, Double> CalculateCycles3Trajectory()
        {
            // Retrieving research parameters from network. //
            // TODO without parce
            if(network.ResearchParameterValues == null)
                throw new CoreException("Research parameters are not set.");
            UInt32 stepCount = UInt32.Parse(network.ResearchParameterValues[ResearchParameter.EvolutionStepCount].ToString());
            Single nu = Single.Parse(network.ResearchParameterValues[ResearchParameter.Nu].ToString());
            bool permanentDistribution = Boolean.Parse(network.ResearchParameterValues[ResearchParameter.PermanentDistribution].ToString());
            object v = network.ResearchParameterValues[ResearchParameter.TracingStepIncrement];
            UInt16 tracingStepIncrement = ((v != null) ? UInt16.Parse(v.ToString()) : (ushort)0);

            // keep initial container
            NonHierarchicContainer initialContainer = container.Clone();

            SortedDictionary<UInt32, double> trajectory = new SortedDictionary<UInt32, double>();
            uint currentStep = 0;
            uint currentTracingStep = tracingStepIncrement;
            double currentCycle3Count = CalculateCycles3();
            trajectory.Add(currentStep, currentCycle3Count);

            NonHierarchicContainer previousContainer = new NonHierarchicContainer();
            RNGCrypto rand = new RNGCrypto();
            while (currentStep != stepCount)
            {
                previousContainer = container.Clone();
                try
                {
                    ++currentStep;

                    long deltaCount = permanentDistribution ?
                        container.PermanentRandomization() :
                        container.NonPermanentRandomization();
                    double newCycle3Count = currentCycle3Count + deltaCount;

                    int delta = (int)(newCycle3Count - currentCycle3Count);
                    if (delta > 0)
                    {
                        // accept
                        trajectory.Add(currentStep, newCycle3Count);
                        currentCycle3Count = newCycle3Count;
                    }
                    else
                    {
                        double probability = Math.Exp((-nu * Math.Abs(delta)));
                        if (rand.NextDouble() < probability)
                        {
                            // accept
                            trajectory.Add(currentStep, newCycle3Count);
                            currentCycle3Count = newCycle3Count;
                        }
                        else
                        {
                            // reject
                            trajectory.Add(currentStep, currentCycle3Count);
                            container = previousContainer;
                        }
                    }

                    if (currentTracingStep == currentStep - 1)
                    {
                        container.Trace(network.ResearchName,
                            "Realization_" + network.NetworkID.ToString(),
                            "Matrix_" + currentTracingStep.ToString());
                        currentTracingStep += tracingStepIncrement;
                    }
                }
                catch (Exception ex)
                {
                    container = initialContainer;
                    //log.Error(String.Format("Error occurred in step {0} ,Error message {1} ", currentStep, ex.InnerException));
                }
            }

            container = initialContainer;
            return trajectory;
        }
コード例 #2
0
        protected override SortedDictionary<Double, Double> CalculateCycles3Trajectory()
        {
            // Retrieving research parameters from network. Research MUST be Evolution. //
            Debug.Assert(network.ResearchParameterValues != null);
            Debug.Assert(network.ResearchParameterValues.ContainsKey(ResearchParameter.EvolutionStepCount));
            Debug.Assert(network.ResearchParameterValues.ContainsKey(ResearchParameter.TracingStepIncrement));
            Debug.Assert(network.ResearchParameterValues.ContainsKey(ResearchParameter.Nu));
            Debug.Assert(network.ResearchParameterValues.ContainsKey(ResearchParameter.PermanentDistribution));

            UInt32 stepCount = Convert.ToUInt32(network.ResearchParameterValues[ResearchParameter.EvolutionStepCount]);
            Double nu = Convert.ToDouble(network.ResearchParameterValues[ResearchParameter.Nu]);
            bool permanentDistribution = Convert.ToBoolean(network.ResearchParameterValues[ResearchParameter.PermanentDistribution]);
            object v = network.ResearchParameterValues[ResearchParameter.TracingStepIncrement];
            UInt32 tracingStepIncrement = ((v != null) ? Convert.ToUInt32(v) : 0);

            // keep initial container
            NonHierarchicContainer initialContainer = container.Clone();

            SortedDictionary<Double, Double> trajectory = new SortedDictionary<Double, Double>();
            uint currentStep = 0;
            uint currentTracingStep = tracingStepIncrement;
            double currentCycle3Count = CalculateCycles3();
            trajectory.Add(currentStep, currentCycle3Count);

            NonHierarchicContainer previousContainer = new NonHierarchicContainer();
            RNGCrypto rand = new RNGCrypto();
            while (currentStep != stepCount)
            {
                previousContainer = container.Clone();
                try
                {
                    ++currentStep;

                    long deltaCount = permanentDistribution ?
                        container.PermanentRandomization() :
                        container.NonPermanentRandomization();
                    double newCycle3Count = currentCycle3Count + deltaCount;

                    int delta = (int)(newCycle3Count - currentCycle3Count);
                    if (delta > 0)
                    {
                        // accept
                        trajectory.Add(currentStep, newCycle3Count);
                        currentCycle3Count = newCycle3Count;
                    }
                    else
                    {
                        double probability = Math.Exp((-nu * Math.Abs(delta)));
                        if (rand.NextDouble() < probability)
                        {
                            // accept
                            trajectory.Add(currentStep, newCycle3Count);
                            currentCycle3Count = newCycle3Count;
                        }
                        else
                        {
                            // reject
                            trajectory.Add(currentStep, currentCycle3Count);
                            container = previousContainer;
                        }
                    }

                    network.UpdateStatus(NetworkStatus.StepCompleted);

                    if (currentTracingStep == currentStep)
                    {
                        container.Trace(network.ResearchName,
                            "Realization_" + network.NetworkID.ToString(),
                            "Matrix_" + currentTracingStep.ToString());
                        currentTracingStep += tracingStepIncrement;

                        network.UpdateStatus(NetworkStatus.StepCompleted);
                    }
                }
                catch (SystemException)
                {
                    container = initialContainer;
                }
            }

            container = initialContainer;
            return trajectory;
        }