using Godot; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports; using Nocturnis.Enigmos.Ports.DataPorts.Directions; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; using Skeleton.DataStructure; namespace Enigmos.Modules.ComputationalModules.Binary; public partial class ScalarDivisionModule : BinaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { private IDataPortGroup? ScalarInputGroup { get; set; } private IDataPortGroup? TensorInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } public override IEnumerable Ports => base.Ports.Union(DataOutPorts); public override double MaintenanceAlpha => 0.77852142d; public override double MaintenanceBeta => 0.9544432d; public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() { base.Init(); this.DataOutInit("Output", 4); TensorInputGroup = GlobalProvider.DataStructureProvider!.NewDataInGroup( this, new IDataInPort[] { DataInPorts[0] }, "Tensor Input Type", EnigmosConstant.DataPortTypes.Real, EnigmosConstant.DataPortTypes.VectorTypes ); ScalarInputGroup =GlobalProvider.DataStructureProvider.NewDataInGroup( this, new IDataInPort[] { DataInPorts[1] }, "Scalar Input Type", EnigmosConstant.DataPortTypes.R2, EnigmosConstant.DataPortTypes.VectorTypes ); OutputGroup = GlobalProvider.DataStructureProvider.NewDataOutGroup( this, DataOutPorts, "", EnigmosConstant.DataPortTypes.Real, Array.Empty() ); ConfigurablePortGroups = new HashSet { ScalarInputGroup, TensorInputGroup }; SelectedOption = 0; PostInit(); } public override void Define() { (object, StringName) Func(CacheItem cache) => GlobalProvider.PolymorphismProvider!.ScalarDiv(this.X(cache), this.Y(cache)); this.Define(Func); } public void Inference() { if (GlobalProvider.DataPackageTypeProvider!.IsComplexTensorType(ScalarInputGroup!.SelectedType)) OutputGroup!.SelectedType = GlobalProvider.DataPackageTypeProvider.ComplexVersionOf(TensorInputGroup!.SelectedType); else OutputGroup!.SelectedType = TensorInputGroup!.SelectedType; } public int SelectedOption { get; set; } }