Exemplo n.º 1
0
        public Dictionary <string, ResolverFunction> CreateFunctions()
        {
            var result = new Dictionary <string, ResolverFunction>(StringComparerProvider.Get(Context.CaseSettings.IsFunctionNameCaseSensitive));

            foreach (var functionName in Context.FunctionsBody.Keys)
            {
                var body = Context.FunctionsBody[functionName];
                if (body != null)
                {
                    var bodyNode = InternalParser.Parse(body);

                    result[functionName] = new StaticResolverFunction(
                        functionName,
                        bodyNode,
                        Context.FunctionArguments[functionName].Select(a => Node.Variable(a)).ToList());
                }
            }

            result["poly"]   = new PolyResolverFunction();
            result["if"]     = new IfResolverFunction();
            result["max"]    = new MaxResolverFunction();
            result["random"] = new RandomResolverFunction(Context);
            result["gauss"]  = new GaussResolverFunction(Context);

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SubcircuitNodeNameGenerator"/> class.
        /// </summary>
        /// <param name="subcircuitFullName">The fullname of subcircuit.</param>
        /// <param name="subCircuitName">The name of subcircuit.</param>
        /// <param name="currentSubCircuit">The current subcircuit.</param>
        /// <param name="pinInstanceNames">The names of pins.</param>
        /// <param name="globals">Global pin names.</param>
        /// <param name="isNodeNameCaseSensitive">Is node name case sensitive.</param>
        public SubcircuitNodeNameGenerator(string subcircuitFullName, string subCircuitName, SubCircuit currentSubCircuit, List <string> pinInstanceNames, IEnumerable <string> globals, bool isNodeNameCaseSensitive)
        {
            RootName = subCircuitName ?? throw new ArgumentNullException(nameof(subCircuitName));
            FullName = subcircuitFullName ?? throw new ArgumentNullException(nameof(subcircuitFullName));

            SubCircuit       = currentSubCircuit ?? throw new ArgumentNullException(nameof(currentSubCircuit));
            PinInstanceNames = pinInstanceNames ?? throw new ArgumentNullException(nameof(pinInstanceNames));
            if (globals == null)
            {
                throw new ArgumentNullException(nameof(globals));
            }

            _pinMap = new Dictionary <string, string>(StringComparerProvider.Get(isNodeNameCaseSensitive));

            if (SubCircuit.Pins.Count != PinInstanceNames.Count)
            {
                throw new SpiceSharpParserException($"Subcircuit: {subcircuitFullName} has wrong number of nodes");
            }

            for (var i = 0; i < SubCircuit.Pins.Count; i++)
            {
                var pinIdentifier         = SubCircuit.Pins[i].Image;
                var pinInstanceIdentifier = PinInstanceNames[i];
                _pinMap[pinIdentifier] = pinInstanceIdentifier;
            }

            IsNodeNameCaseSensitive = isNodeNameCaseSensitive;
            InitGlobals(globals);
        }
Exemplo n.º 3
0
 public EvaluationContext(
     string name,
     ISpiceNetlistCaseSensitivitySettings caseSettings,
     IRandomizer randomizer,
     IExpressionParserFactory expressionParserFactory,
     IExpressionFeaturesReader expressionFeaturesReader,
     IExpressionValueProvider expressionValueProvider,
     INameGenerator nameGenerator,
     IResultService resultService)
 {
     _caseSettings            = caseSettings;
     ExpressionParserFactory  = expressionParserFactory;
     ExpressionFeaturesReader = expressionFeaturesReader;
     ExpressionValueProvider  = expressionValueProvider;
     NameGenerator            = nameGenerator;
     ResultService            = resultService;
     Name               = name;
     Parameters         = new Dictionary <string, Expression>(StringComparerProvider.Get(caseSettings.IsParameterNameCaseSensitive));
     Arguments          = new Dictionary <string, Expression>(StringComparerProvider.Get(caseSettings.IsParameterNameCaseSensitive));
     Functions          = new Dictionary <string, List <IFunction> >(StringComparerProvider.Get(caseSettings.IsFunctionNameCaseSensitive));
     Children           = new List <EvaluationContext>();
     ExpressionRegistry = new ExpressionRegistry(caseSettings.IsParameterNameCaseSensitive, caseSettings.IsExpressionNameCaseSensitive);
     FunctionsBody      = new Dictionary <string, string>();
     FunctionArguments  = new Dictionary <string, List <string> >();
     Randomizer         = randomizer;
 }
        /// <summary>
        /// Sets the base parameters of a simulation.
        /// </summary>
        /// <param name="baseSimulation">The simulation to configure.</param>
        /// <param name="context">The reading context.</param>
        protected void ConfigureCommonSettings(BaseSimulation baseSimulation, ICircuitContext context)
        {
            var baseConfiguration = baseSimulation.Configurations.Get <BaseConfiguration>();

            if (context.Result.SimulationConfiguration.Gmin.HasValue)
            {
                baseConfiguration.Gmin = context.Result.SimulationConfiguration.Gmin.Value;
            }

            if (context.Result.SimulationConfiguration.AbsoluteTolerance.HasValue)
            {
                baseConfiguration.AbsoluteTolerance = context.Result.SimulationConfiguration.AbsoluteTolerance.Value;
            }

            if (context.Result.SimulationConfiguration.RelTolerance.HasValue)
            {
                baseConfiguration.RelativeTolerance = context.Result.SimulationConfiguration.RelTolerance.Value;
            }

            if (context.Result.SimulationConfiguration.DCMaxIterations.HasValue)
            {
                baseConfiguration.DcMaxIterations = context.Result.SimulationConfiguration.DCMaxIterations.Value;
            }

            baseSimulation.Configurations.Add(
                new CollectionConfiguration()
            {
                VariableComparer = StringComparerProvider.Get(context.CaseSensitivity.IsNodeNameCaseSensitive),
            });
        }
Exemplo n.º 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="StochasticModelsRegistry"/> class.
        /// </summary>
        /// <param name="modelNamesGenerators">The enumerable of model name generators.</param>
        /// <param name="isModelNameCaseSensitive">Is model names case sensitive.</param>
        public StochasticModelsRegistry(IEnumerable <INameGenerator> modelNamesGenerators, bool isModelNameCaseSensitive)
        {
            NamesGenerators          = modelNamesGenerators ?? throw new ArgumentNullException(nameof(modelNamesGenerators));
            IsModelNameCaseSensitive = isModelNameCaseSensitive;

            AllModels = new Dictionary <string, Entity>(StringComparerProvider.Get(isModelNameCaseSensitive));
        }
Exemplo n.º 6
0
        static SimpleDerivativeParserExtended()
        {
            DefaultFunctionsCaseSensitive =
                new ConcurrentDictionary <string, SimpleDerivativeParserHelper.DoubleDerivativesFunction>(
                    StringComparerProvider.Get(true));

            DefaultFunctionsCaseInSensitive =
                new ConcurrentDictionary <string, SimpleDerivativeParserHelper.DoubleDerivativesFunction>(
                    StringComparerProvider.Get(false));

            var dict = new Dictionary <string, SimpleDerivativeParserHelper.DoubleDerivativesFunction>()
            {
                { "Exp", SimpleDerivativeParserHelper.ApplyExp },
                { "Log", SimpleDerivativeParserHelper.ApplyLog },
                { "Pow", SimpleDerivativeParserHelper.ApplyPow },
                { "Log10", SimpleDerivativeParserHelper.ApplyLog10 },
                { "Sqrt", SimpleDerivativeParserHelper.ApplySqrt },
                { "Sin", SimpleDerivativeParserHelper.ApplySin },
                { "Cos", ApplyCos },
                { "Tan", ApplyTan },
                { "Asin", SimpleDerivativeParserHelper.ApplyAsin },
                { "Acos", SimpleDerivativeParserHelper.ApplyAcos },
                { "Atan", SimpleDerivativeParserHelper.ApplyAtan },
                { "Abs", SimpleDerivativeParserHelper.ApplyAbs },
                { "Round", SimpleDerivativeParserHelper.ApplyRound },
                { "Min", SimpleDerivativeParserHelper.ApplyMin },
                { "Max", SimpleDerivativeParserHelper.ApplyMax },
            };

            foreach (var function in dict)
            {
                DefaultFunctionsCaseSensitive.TryAdd(function.Key, function.Value);
                DefaultFunctionsCaseInSensitive.TryAdd(function.Key, function.Value);
            }
        }
        /// <summary>
        /// Returns a value indicating whether the mapper has a element for <paramref name="key"/>.
        /// </summary>
        /// <param name="key">
        /// A key.
        /// </param>
        /// <param name="caseSensitive">Is key case-sensitive.</param>
        /// <returns>
        /// A value indicating whether the mapper has a element with given <paramref name="key"/>.
        /// </returns>
        public bool ContainsKey(string key, bool caseSensitive)
        {
            if (caseSensitive)
            {
                return(Elements.ContainsKey(key));
            }

            return(Elements.Keys.Contains(key, StringComparerProvider.Get(false)));
        }
Exemplo n.º 8
0
        private void InitGlobals(IEnumerable <string> globals)
        {
            _globals = new HashSet <string>(StringComparerProvider.Get(IsNodeNameCaseSensitive));

            foreach (var global in globals)
            {
                _globals.Add(global);
            }
        }
Exemplo n.º 9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ExpressionRegistry"/> class.
 /// </summary>
 /// <param name="isParameterNameCaseSensitive">Is parameter name case-sensitive.</param>
 /// <param name="isExpressionNameCaseSensitive">Is expression name case-sensitive.</param>
 public ExpressionRegistry(bool isParameterNameCaseSensitive, bool isExpressionNameCaseSensitive)
 {
     IsExpressionNameCaseSensitive = isExpressionNameCaseSensitive;
     IsParameterNameCaseSensitive  = isParameterNameCaseSensitive;
     NamedExpressions = new Dictionary <string, NamedExpression>(StringComparerProvider.Get(isExpressionNameCaseSensitive));
     ParametersExpressionsDependencies = new Dictionary <string, List <Expression> >(StringComparerProvider.Get(isParameterNameCaseSensitive));
     ParametersDependencies            = new Dictionary <string, HashSet <string> >(StringComparerProvider.Get(isParameterNameCaseSensitive));
     UnnamedExpressions = new List <Expression>();
     Parameters         = new Dictionary <string, Expression>(StringComparerProvider.Get(isParameterNameCaseSensitive));
 }
Exemplo n.º 10
0
        public void SetParameter(Entity entity, string parameterName, Parameter parameter, bool beforeTemperature = true, bool onload = true)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }

            if (parameterName == null)
            {
                throw new ArgumentNullException(nameof(parameterName));
            }

            if (parameter == null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            string expression = null;

            if (parameter is SingleParameter sp)
            {
                expression = sp.Image;
            }

            if (parameter is AssignmentParameter asg)
            {
                expression = asg.Value;
            }

            IEqualityComparer <string> comparer = StringComparerProvider.Get(CaseSensitivity.IsEntityParameterNameCaseSensitive);

            try
            {
                double value = Evaluator.EvaluateDouble(expression);

                entity.SetParameter(parameterName, value, comparer);

                var context = Evaluator.GetEvaluationContext();

                bool isDynamic = context.HaveSpiceProperties(expression) ||
                                 context.HaveFunctions(expression) ||
                                 context.GetExpressionParameters(expression, false).Any();
                if (isDynamic)
                {
                    SimulationPreparations.SetParameter(entity, parameterName, expression, beforeTemperature, onload);
                }
            }
            catch (Exception ex)
            {
                Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning,
                                                          $"Exception during evaluation of parameter with expression: `{expression}`: {ex}", parameter.LineInfo));
            }
        }
Exemplo n.º 11
0
        public IModelsRegistry CreateChildRegistry(List <INameGenerator> generators)
        {
            var result = new StochasticModelsRegistry(generators, IsModelNameCaseSensitive)
            {
                AllModels        = new Dictionary <string, Entity>(AllModels, StringComparerProvider.Get(IsModelNameCaseSensitive)),
                ModelsWithDev    = new Dictionary <Model, Dictionary <Parameter, ParameterRandomness> >(ModelsWithDev),
                ModelsWithLot    = new Dictionary <Model, Dictionary <Parameter, ParameterRandomness> >(ModelsWithLot),
                StochasticModels = new Dictionary <BaseSimulation, Dictionary <Model, List <Model> > >(StochasticModels),
            };

            return(result);
        }
        /// <summary>
        /// Creates a new current export.
        /// </summary>
        /// <param name="name">Name of export.</param>
        /// <param name="type">A type of export.</param>
        /// <param name="parameters">A parameters of export.</param>
        /// <param name="context">Expression context.</param>
        /// <param name="caseSettings">Case settings.</param>
        /// <returns>
        /// A new export.
        /// </returns>
        public override Export CreateExport(string name, string type, ParameterCollection parameters, EvaluationContext context, ISpiceNetlistCaseSensitivitySettings caseSettings)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var comparer = StringComparerProvider.Get(false);

            var entityName   = (parameters[0] as VectorParameter)?.Elements[0].Image;
            var propertyName = (parameters[0] as VectorParameter)?.Elements[1].Image;

            if (entityName != null && propertyName != null)
            {
                if (entityName.Contains("#"))
                {
                    string objectName = $"{context.NameGenerator.GenerateObjectName(entityName)}_{context.Simulation.Name}";
                    return(new PropertyExport(name, context.Simulation, objectName, propertyName));
                }
                else
                {
                    string objectName = context.NameGenerator.GenerateObjectName(entityName);

                    if (context.ResultService.FindObject(objectName, out _))
                    {
                        return(new PropertyExport(name, context.Simulation, objectName, propertyName));
                    }
                    else
                    {
                        return(new PropertyExport(name, context.Simulation, entityName, propertyName));
                    }
                }
            }

            throw new SpiceSharpParserException("Invalid property export", parameters.LineInfo);
        }
Exemplo n.º 13
0
        private void InitGlobals(IEnumerable <string> globals)
        {
            if (globals == null)
            {
                throw new ArgumentNullException(nameof(globals));
            }

            _globals = new HashSet <string>(StringComparerProvider.Get(IsNodeNameCaseSensitive));

            foreach (var global in globals)
            {
                _globals.Add(global);
            }
        }
Exemplo n.º 14
0
        private void SetModelLotModelParameters(Simulation simulation, string baseModel, IEntity componentModel, Dictionary <Parameter, ParameterRandomness> stochasticLotParameters)
        {
            var comparer = StringComparerProvider.Get(false);

            foreach (var stochasticParameter in stochasticLotParameters)
            {
                var parameter        = stochasticParameter.Key;
                var parameterPercent = stochasticParameter.Value;

                if (parameter is AssignmentParameter asg)
                {
                    var    parameterName = asg.Name;
                    var    currentValue  = simulation.EntityBehaviors[componentModel.Name].GetProperty <double>(parameterName);
                    var    percentValue  = _context.Evaluator.EvaluateDouble(parameterPercent.Tolerance.Image, simulation);
                    double newValue      = GetValueForLotParameter(_context.Evaluator.GetEvaluationContext(simulation), baseModel, parameterName, currentValue, percentValue, parameterPercent.RandomDistributionName, comparer);

                    _context.SimulationPreparations.SetParameter(componentModel, simulation, parameterName, newValue, true, false);
                }
            }
        }
Exemplo n.º 15
0
        public void SetParameter(Entity entity, string parameterName, string expression, bool beforeTemperature = true, bool onload = true)
        {
            if (entity == null)
            {
                throw new ArgumentNullException(nameof(entity));
            }

            if (parameterName == null)
            {
                throw new ArgumentNullException(nameof(parameterName));
            }

            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }

            IEqualityComparer <string> comparer = StringComparerProvider.Get(CaseSensitivity.IsEntityParameterNameCaseSensitive);

            double value = Evaluator.EvaluateDouble(expression);

            try
            {
                entity.SetParameter(parameterName, value, comparer);
                var context = Evaluator.GetEvaluationContext();

                bool isDynamic = context.HaveSpiceProperties(expression) ||
                                 context.HaveFunctions(expression) ||
                                 context.GetExpressionParameters(expression, false).Any();

                if (isDynamic)
                {
                    SimulationPreparations.SetParameter(entity, parameterName, expression, beforeTemperature, onload);
                }
            }
            catch (Exception e)
            {
                Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, $"Problem with setting parameter = {parameterName} with value = {value}"));
            }
        }
Exemplo n.º 16
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Randomizer"/> class.
        /// </summary>
        /// <param name="isDistributionNameCaseSensitive">Is distribution name case-sensitive.</param>
        /// <param name="cdfPoints">Number of cdf points.</param>
        /// <param name="normalLimit">Normal limit.</param>
        /// <param name="seed">Seed.</param>
        public Randomizer(
            bool isDistributionNameCaseSensitive = false,
            int?cdfPoints      = null,
            double?normalLimit = null,
            int?seed           = null,
            Dictionary <string, Func <Pdf> > pdfDictionary = null,
            Dictionary <string, Pdf> pdfInstances          = null,
            Dictionary <string, Cdf> cdfDictionary         = null,
            Dictionary <string, CustomRandomNumberProviderFactory> customRandomNumberProviderFactories = null)
        {
            _isDistributionNameCaseSensitive = isDistributionNameCaseSensitive;
            _pdfDictionary          = pdfDictionary ?? new Dictionary <string, Func <Pdf> >(StringComparerProvider.Get(isDistributionNameCaseSensitive));
            _pdfInstancesDictionary = pdfInstances ?? new Dictionary <string, Pdf>(StringComparerProvider.Get(isDistributionNameCaseSensitive));
            _cdfDictionary          = cdfDictionary ?? new Dictionary <string, Cdf>(StringComparerProvider.Get(isDistributionNameCaseSensitive));
            _customRandomNumberProviderFactories = customRandomNumberProviderFactories ?? new Dictionary <string, CustomRandomNumberProviderFactory>(StringComparerProvider.Get(isDistributionNameCaseSensitive));

            CurrentPdfName = null;
            CdfPoints      = cdfPoints ?? DefaultCdfPoints;
            NormalLimit    = normalLimit ?? DefaultNormalLimit;
            Seed           = seed;
            RegisterDefaultPdfs();
        }
Exemplo n.º 17
0
        private void SetModelDevModelParameters(BaseSimulation simulation, Entity baseModel, Entity componentModel, Dictionary <Parameter, ParameterRandomness> stochasticDevParameters)
        {
            var comparer = StringComparerProvider.Get(_context.CaseSensitivity.IsEntityParameterNameCaseSensitive);

            foreach (var stochasticParameter in stochasticDevParameters)
            {
                var parameter        = stochasticParameter.Key;
                var parameterPercent = stochasticParameter.Value;

                if (parameter is AssignmentParameter assignmentParameter)
                {
                    var parameterName         = assignmentParameter.Name;
                    var currentValueParameter = simulation.EntityParameters[componentModel.Name].GetParameter <Parameter <double> >(parameterName, comparer);
                    var currentValue          = currentValueParameter.Value;
                    var percentValue          = _context.Evaluator.EvaluateDouble(parameterPercent.Tolerance.Image, simulation);

                    var random   = _context.Evaluator.GetEvaluationContext(simulation).Randomizer.GetRandomProvider(parameterPercent.RandomDistributionName);
                    var r        = random.NextSignedDouble();
                    var newValue = currentValue + ((percentValue / 100.0) * currentValue * r);

                    _context.SimulationPreparations.SetParameter(componentModel, simulation, parameterName, newValue, true, false);
                }
            }
        }
Exemplo n.º 18
0
        public Node Resolve(string expression)
        {
            var node = InternalParser.Parse(expression);

            try
            {
                var resolver = new Resolver();
                var comparer = StringComparerProvider.Get(CaseSettings.IsParameterNameCaseSensitive);

                if (Context.NameGenerator.NodeNameGenerator is SubcircuitNodeNameGenerator)
                {
                    resolver.UnknownVariableFound += (sender, args) =>
                    {
                        if (args.Node.NodeType == NodeTypes.Voltage)
                        {
                            if (resolver.VariableMap.Any(v => comparer.Equals(v.Key, args.Node.Name)))
                            {
                                var node = resolver.VariableMap.First(v => comparer.Equals(v.Key, args.Node.Name)).Value;
                                args.Result = VariableNode.Voltage(node.ToString());
                            }
                            else
                            {
                                args.Result = VariableNode.Voltage(Context.NameGenerator.ParseNodeName(args.Node.Name));
                            }
                        }

                        if (args.Node.NodeType == NodeTypes.Current)
                        {
                            args.Result = VariableNode.Current(Context.NameGenerator.GenerateObjectName(args.Node.Name));
                        }
                    };
                }
                else
                {
                    resolver.UnknownVariableFound += (sender, args) =>
                    {
                        if (args.Node.NodeType == NodeTypes.Voltage)
                        {
                            if (resolver.VariableMap.Any(v => comparer.Equals(v.Key, args.Node.Name)))
                            {
                                var node = resolver.VariableMap.First(v => comparer.Equals(v.Key, args.Node.Name)).Value;
                                args.Result = VariableNode.Voltage(node.ToString());
                            }
                            else
                            {
                                args.Result = VariableNode.Voltage(args.Node.Name);
                            }
                        }

                        if (args.Node.NodeType == NodeTypes.Current)
                        {
                            args.Result = VariableNode.Current(args.Node.Name);
                        }
                    };
                }

                resolver.FunctionMap = CreateFunctions();
                resolver.VariableMap = new Dictionary <string, Node>(StringComparerProvider.Get(CaseSettings.IsParameterNameCaseSensitive));

                foreach (var variable in DoubleBuilder.Variables)
                {
                    if (variable.Constant)
                    {
                        resolver.VariableMap[variable.Name] = variable.Value();
                    }
                    else
                    {
                        resolver.VariableMap[variable.Name] = variable.VariableNode;
                    }
                }

                // TIME variable is handled well in SpiceSharpBehavioral
                resolver.VariableMap.Remove("TIME");

                var resolved = resolver.Resolve(node);
                return(resolved);
            }
            catch (Exception)
            {
                if (ThrowOnErrors)
                {
                    throw;
                }
            }

            return(node);
        }
Exemplo n.º 19
0
        private void OnVariableFound(object sender, SpiceSharpBehavioral.Builders.Direct.VariableFoundEventArgs <double> e)
        {
            if (e.Node.NodeType != NodeTypes.Voltage && e.Node.NodeType != NodeTypes.Current && e.Node.NodeType != NodeTypes.Property)
            {
                var found = Variables.SingleOrDefault(variable => StringComparerProvider.Get(_caseSettings.IsParameterNameCaseSensitive).Equals(variable.Name, e.Node.Name));
                if (found != null)
                {
                    e.Result = found.Value();
                }
            }
            else
            {
                if (Context.Simulation == null)
                {
                    e.Result = 0;
                }
                else
                {
                    if (e.Node.NodeType == NodeTypes.Current)
                    {
                        var name = e.Node.Name;

                        var parameters      = new ParameterCollection();
                        var vectorParameter = new VectorParameter();
                        vectorParameter.Elements.Add(new IdentifierParameter(e.Node.Name.ToString()));
                        parameters.Add(vectorParameter);

                        string key = $"{Context.Name}_I_{parameters}_{Context.Simulation?.Name}";

                        if (_exporterInstances.TryGetValue(key, out Export cachedExport))
                        {
                            e.Result = cachedExport.Extract();
                        }
                        else
                        {
                            var currentExporter = new CurrentExporter();

                            var export = currentExporter.CreateExport(
                                key,
                                "I",
                                parameters,
                                Context,
                                _caseSettings);

                            _exporterInstances[key] = export;

                            e.Result = export.Extract();
                        }
                    }
                    else if (e.Node.NodeType == NodeTypes.Voltage)
                    {
                        var name = e.Node.Name;

                        var variable = Variables.FirstOrDefault(v => v.Name == name);
                        if (variable != null)
                        {
                            name = variable.Value().ToString();
                        }

                        var parameters      = new ParameterCollection();
                        var vectorParameter = new VectorParameter();
                        vectorParameter.Elements.Add(new IdentifierParameter(name));
                        parameters.Add(vectorParameter);

                        string key = $"{Context.Name}_V_{parameters}_{Context.Simulation?.Name}";

                        if (_exporterInstances.TryGetValue(key, out Export cachedExport))
                        {
                            e.Result = cachedExport.Extract();
                        }
                        else
                        {
                            var currentExporter = new VoltageExporter();

                            var export = currentExporter.CreateExport(
                                key,
                                "V",
                                parameters,
                                Context,
                                _caseSettings);

                            _exporterInstances[key] = export;

                            try
                            {
                                e.Result = export.Extract();
                            }
                            catch (Exception ex)
                            {
                                if (ThrowOnErrors)
                                {
                                    throw;
                                }

                                e.Result = 0;
                            }
                        }
                    }
                }
            }
        }
        public void Apply(BaseSimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            simulation.BeforeLoad += (sender, args) =>
            {
                foreach (var entity in CommonUpdates.Keys)
                {
                    var beforeLoads = CommonUpdates[entity].ParameterUpdatesBeforeLoad;

                    foreach (var entityUpdate in beforeLoads)
                    {
                        var parameter = GetEntitySimulationParameter(entityUpdate.ParameterName, entity, simulation, StringComparerProvider.Get(IsParameterNameCaseSensitive));

                        if (parameter != null)
                        {
                            Common.Evaluation.EvaluationContext context = GetEntityContext(simulation, entity);

                            var value = entityUpdate.GetValue(context);

                            if (!double.IsNaN(value))
                            {
                                parameter.Value = value;
                            }
                        }
                    }
                }

                if (SimulationSpecificUpdates.ContainsKey(simulation))
                {
                    foreach (var entityPair in SimulationSpecificUpdates[simulation])
                    {
                        var beforeLoads = entityPair.Value.ParameterUpdatesBeforeLoad;

                        foreach (var entityUpdate in beforeLoads)
                        {
                            var parameter = GetEntitySimulationParameter(entityUpdate.ParameterName, entityPair.Key, simulation, StringComparerProvider.Get(IsParameterNameCaseSensitive));

                            if (parameter != null)
                            {
                                Common.Evaluation.EvaluationContext context = GetEntityContext(simulation, entityPair.Key);

                                var value = entityUpdate.GetValue(context);
                                if (!double.IsNaN(value))
                                {
                                    parameter.Value = value;
                                }
                            }
                        }
                    }
                }
            };

            simulation.BeforeTemperature += (sender, args) =>
            {
                foreach (var entity in CommonUpdates.Keys)
                {
                    var beforeTemperature = CommonUpdates[entity].ParameterUpdatesBeforeTemperature;

                    foreach (var entityUpdate in beforeTemperature)
                    {
                        var parameter = GetEntitySimulationParameter(entityUpdate.ParameterName, entity, simulation, StringComparerProvider.Get(IsParameterNameCaseSensitive));

                        if (parameter != null)
                        {
                            Common.Evaluation.EvaluationContext context = GetEntityContext(simulation, entity);
                            var value = entityUpdate.GetValue(context);

                            if (!double.IsNaN(value))
                            {
                                parameter.Value = value;
                            }
                        }
                    }
                }

                if (SimulationSpecificUpdates.ContainsKey(simulation))
                {
                    foreach (var entityPair in SimulationSpecificUpdates[simulation])
                    {
                        var beforeTemperature = entityPair.Value.ParameterUpdatesBeforeTemperature;

                        foreach (var entityUpdate in beforeTemperature)
                        {
                            var parameter = GetEntitySimulationParameter(entityUpdate.ParameterName, entityPair.Key, simulation, StringComparerProvider.Get(IsParameterNameCaseSensitive));

                            if (parameter != null)
                            {
                                Common.Evaluation.EvaluationContext context = GetEntityContext(simulation, entityPair.Key);

                                var value = entityUpdate.GetValue(context);
                                if (!double.IsNaN(value))
                                {
                                    parameter.Value = value;
                                }
                            }
                        }
                    }
                }
            };
        }
Exemplo n.º 21
0
 /// <summary>
 /// Gets expression names.
 /// </summary>
 /// <returns>
 /// Enumerable of expression names.
 /// </returns>
 public HashSet <string> GetExpressionNames()
 {
     return(new HashSet <string>(NamedExpressions.Keys, StringComparerProvider.Get(IsExpressionNameCaseSensitive)));
 }
Exemplo n.º 22
0
        /// <summary>
        /// Translates Netlist object mode to SpiceSharp netlist.
        /// </summary>
        /// <param name="netlist">A object model of the netlist.</param>
        /// <returns>
        /// A new SpiceSharp netlist.
        /// </returns>
        public SpiceModel <SpiceSharp.Circuit, Simulation> Read(SpiceNetlist netlist)
        {
            if (netlist == null)
            {
                throw new System.ArgumentNullException(nameof(netlist));
            }

            // Get result netlist
            var result = new SpiceModel <Circuit, Simulation>(
                new Circuit(StringComparerProvider.Get(Settings.CaseSensitivity.IsEntityNameCaseSensitive)),
                netlist.Title);

            // Get reading context
            var resultService     = new ResultService(result);
            var nodeNameGenerator = new MainCircuitNodeNameGenerator(
                new [] { "0" },
                Settings.CaseSensitivity.IsNodeNameCaseSensitive);
            var            objectNameGenerator = new ObjectNameGenerator(string.Empty);
            INameGenerator nameGenerator       = new NameGenerator(nodeNameGenerator, objectNameGenerator);
            IRandomizer    randomizer          = new Randomizer(
                Settings.CaseSensitivity.IsDistributionNameCaseSensitive,
                seed: Settings.Seed);

            IExpressionParserFactory  expressionParserFactory  = new ExpressionParserFactory(Settings.CaseSensitivity);
            IExpressionFeaturesReader expressionFeaturesReader = new ExpressionFeaturesReader(expressionParserFactory);
            IExpressionValueProvider  expressionValueProvider  = new ExpressionValueProvider(expressionParserFactory);

            EvaluationContext expressionContext = new SpiceEvaluationContext(
                string.Empty,
                Settings.EvaluatorMode,
                Settings.CaseSensitivity,
                randomizer,
                expressionParserFactory,
                expressionFeaturesReader,
                expressionValueProvider,
                nameGenerator,
                resultService);

            var simulationEvaluationContexts = new SimulationEvaluationContexts(expressionContext);
            ISimulationPreparations simulationPreparations = new SimulationPreparations(
                new EntityUpdates(Settings.CaseSensitivity.IsParameterNameCaseSensitive, simulationEvaluationContexts),
                new SimulationsUpdates(simulationEvaluationContexts));

            ICircuitEvaluator      circuitEvaluator = new CircuitEvaluator(simulationEvaluationContexts, expressionContext);
            ISpiceStatementsReader statementsReader = new SpiceStatementsReader(Settings.Mappings.Controls,
                                                                                Settings.Mappings.Models, Settings.Mappings.Components);
            IWaveformReader waveformReader = new WaveformReader(Settings.Mappings.Waveforms);

            ICircuitContext circuitContext = new CircuitContext(
                "Root circuit context",
                null,
                circuitEvaluator,
                simulationPreparations,
                resultService,
                nameGenerator,
                statementsReader,
                waveformReader,
                Settings.CaseSensitivity,
                Settings.Mappings.Exporters,
                Settings.WorkingDirectory,
                null);

            // Set initial seed
            circuitContext.Evaluator.Seed = Settings.Seed;

            // Read statements form input netlist using created context
            circuitContext.Read(netlist.Statements, Settings.Orderer);

            // Set final seed
            result.Seed = circuitContext.Evaluator.Seed;

            return(result);
        }