Exemplo n.º 1
0
        /// <summary>
        /// Creates simulations for all parameter and temperature sweeps.
        /// </summary>
        /// <param name="statement">Statement.</param>
        /// <param name="context">Context.</param>
        /// <param name="createSimulation">Create simulation factory.</param>
        /// <returns></returns>
        public List <BaseSimulation> CreateSimulations(Control statement, ICircuitContext context, Func <string, Control, ICircuitContext, BaseSimulation> createSimulation)
        {
            var result = new List <BaseSimulation>();

            ProcessTempParameterSweep(context);

            if (context.Result.SimulationConfiguration.ParameterSweeps.Count == 0)
            {
                result.AddRange(AllTemperaturesFactory.CreateSimulations(
                                    statement,
                                    context,
                                    createSimulation));

                return(result);
            }

            List <List <double> > sweeps = new List <List <double> >();
            int productCount             = 1;

            for (var i = 0; i < context.Result.SimulationConfiguration.ParameterSweeps.Count; i++)
            {
                var sweepValues = context.Result.SimulationConfiguration.ParameterSweeps[i].Sweep.Points.ToList();
                sweeps.Add(sweepValues);
                productCount *= sweepValues.Count;
            }

            int[] system = sweeps.Select(s => s.Count()).ToArray();

            for (var i = 0; i < productCount; i++)
            {
                int[] indexes = NumberSystem.GetValueInSystem(i, system);

                Func <string, Control, ICircuitContext, BaseSimulation> createSimulationWithSweepParametersFactory =
                    (name, control, modifiedContext) =>
                {
                    List <KeyValuePair <Parameter, double> > parameterValues =
                        GetSweepParameterValues(context, sweeps, system, indexes);
                    string suffix = GetSimulationNameSuffix(parameterValues);

                    var simulation = createSimulation($"{name} ({suffix})", control, modifiedContext);
                    SetSweepSimulation(context, parameterValues, simulation);

                    return(simulation);
                };

                result.AddRange(AllTemperaturesFactory.CreateSimulations(
                                    statement,
                                    context,
                                    createSimulationWithSweepParametersFactory));
            }

            return(result);
        }