using Enigmos.Ports.DataPorts; using Godot; using Nocturnis.DataStructures; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; using Skeleton.DataStructure; using R2 = Skeleton.Algebra.CategoryOf.OnField.FVector; using C2 = Skeleton.Algebra.CategoryOf.OnField.FVector; namespace Enigmos.Modules.ComputationalModules.Binary; public abstract partial class V2Module : BinaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { private IDataPortGroup? ScalarInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } 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); ScalarInputGroup = GlobalProvider.DataStructureProvider!.NewDataInGroup( this, DataInPorts, "Scalar Input Type", EnigmosConstant.DataPortTypes.Real, EnigmosConstant.DataPortTypes.NumericTypes ); OutputGroup = GlobalProvider.DataStructureProvider.NewDataOutGroup( this, DataOutPorts, "", EnigmosConstant.DataPortTypes.R2, Array.Empty() ); ConfigurablePortGroups = new HashSet { ScalarInputGroup }; PostInit(); } public override void Define() { (object, StringName) Func(CacheItem cache) { IData x = this.X(cache); IData y = this.Y(cache); if (x.Type == EnigmosConstant.DataPortTypes.Complex || y.Type == EnigmosConstant.DataPortTypes.Complex) return (new C2(x.Complex, y.Complex), EnigmosConstant.DataPortTypes.C2); return (new R2(x.Double, y.Double), EnigmosConstant.DataPortTypes.Real); } this.Define(Func); } public void Inference() { OutputGroup!.SelectedType = GlobalProvider.DataTypeProvider!.BuildType(OutputGroup.SelectedType, 1, 2); } }