/// <inheritdoc/>
        public override void CreateBehaviors(ISimulation simulation)
        {
            var behaviors = new BehaviorContainer(Name);

            if (Parameters.Entities != null || Parameters.Entities.Count > 0)
            {
                // Create our local simulation and binding context to allow behaviors to do stuff
                var localSim = new ParallelSimulation(simulation, this);
                var context  = new ParallelBindingContext(this, localSim, behaviors);
                Entities.DependencyInjection.DI.Resolve(simulation, this, behaviors, context);

                // Run the simulation
                localSim.Run(Parameters.Entities);

                // Allow the behaviors to fetch the behaviors if they want
                foreach (var behavior in behaviors)
                {
                    if (behavior is IParallelBehavior parallelBehavior)
                    {
                        parallelBehavior.FetchBehaviors(context);
                    }
                }
            }
            simulation.EntityBehaviors.Add(behaviors);
        }
 public void AddToSimulator(ParallelSimulation ps, DllLoader loader)
 {
     Dictionary<string, ParallelAlgorithm> pas = new Dictionary<string, ParallelAlgorithm> ();
     foreach (NodeSpecification ns in this.Nodes) {
         ParallelAlgorithm pa = loader.CreateAlgorithm (ns.AlgorithmName);
         pa.Name = ns.NodeName;
         pas.Add (pa.Name, pa);
         ps.AddParallelAlgorithm (pa);
         if (ns.RelativePosition != null) {
             ps.AddRelativePosition (pa, ns.RelativePosition);
         }
         if(ns.InitializationArguments != null) {
             ps.AddInitArguments(pa,ns.InitializationArguments);
         }
     }
     foreach(EdgeSpecification es in this.Edges) {
         ps.AddEdge(pas[es.Node1],pas[es.Node2]);
     }
 }
Exemple #3
0
        /// <inheritdoc/>
        public override void CreateBehaviors(ISimulation simulation)
        {
            var behaviors = new BehaviorContainer(Name);

            if (Parameters.Entities != null || Parameters.Entities.Count > 0)
            {
                // Create our local simulation and binding context to allow behaviors to do stuff
                var localSim = new ParallelSimulation(simulation, this);
                var context  = new ParallelBindingContext(this, localSim, behaviors);

                // Let's create our behaviors
                // Note: we do this first, such that any parallel simulation states can be added to the local simulation
                behaviors.Build(simulation, context)
                .AddIfNo <ITemperatureBehavior>(context => new Temperature(context))
                .AddIfNo <IConvergenceBehavior>(context => new Convergence(context))
                .AddIfNo <IBiasingBehavior>(context => new Biasing(context))
                .AddIfNo <IBiasingUpdateBehavior>(context => new BiasingUpdate(context))
                .AddIfNo <IFrequencyBehavior>(context => new Frequency(context))
                .AddIfNo <IFrequencyUpdateBehavior>(context => new FrequencyUpdate(context))
                .AddIfNo <INoiseBehavior>(context => new ParallelComponents.Noise(context))
                .AddIfNo <ITimeBehavior>(context => new Time(context))
                .AddIfNo <IAcceptBehavior>(context => new Accept(context));

                // Run the simulation
                localSim.Run(Parameters.Entities);

                // Allow the behaviors to fetch the behaviors if they want
                foreach (var behavior in behaviors)
                {
                    if (behavior is IParallelBehavior parallelBehavior)
                    {
                        parallelBehavior.FetchBehaviors(context);
                    }
                }
            }
            simulation.EntityBehaviors.Add(behaviors);
        }