using Enigmos.Modules.ControllingModules; using Enigmos.Ports; using Enigmos.Ports.DataPorts; using Nocturnis.DataStructures.ConfigurableParameters; using Nocturnis.Enigmos.Modules; using Skeleton.Utils.RandomEngines; using TabulaSmaragdina; using TabulaSmaragdina.Constants; namespace Enigmos.Modules.ComputationalModules.Nullary; public partial class NormalDistributionModule : NullaryComputationalModule, IParameterizedModule { private HashSet OutputGroup { get; set; } = new(); private DataOutPort? Output1 { get; set; } private DataOutPort? Output2 { get; set; } private DataOutPort? Output3 { get; set; } private DataOutPort? Output4 { get; set; } public override IEnumerable Ports => base.Ports.Union(new[] { Output1, Output2, Output3, Output4 })!; private IDoubleParameter? Mu { get; set; } private IDoubleParameter? Sigma { get; set; } public override void Init() { base.Init(); Output1 = GetPort("Output1"); Output2 = GetPort("Output2"); Output3 = GetPort("Output3"); Output4 = GetPort("Output4"); OutputGroup = new HashSet(new[] { Output1, Output2, Output3, Output4 }); foreach (DataOutPort port in OutputGroup) port.SetDataType(EnigmosConstant.DataPortTypes.Real); Mu = GlobalProvider.DataStructureProvider!.NewDoubleParameter("mu", -1, 1, 0); Sigma = GlobalProvider.DataStructureProvider.NewDoubleParameter("sigma", 0, 2, 1); ConfigurableParameters = new HashSet { Mu, Sigma }; PostInit(); } protected override void Compute(IRootModule root) { foreach (DataOutPort port in OutputGroup) { port.ResultData.Real = Normal.Get() * Sigma.ParameterValue - Mu.ParameterValue; } } public HashSet ConfigurableParameters { get; set; } = new(); }