using Godot; using Nocturnis.DataStructures.Data; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.DataStructures.DataTypes; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; using Skeleton.DataStructure; namespace Enigmos.Modules.ComputationalModules.Unary; public abstract partial class V2ComponentModule : UnaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { private IDataPortGroup? VectorInputGroup { get; set; } private IDataPortGroup? ScalarOutputGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } = new(); public override void Init() { base.Init(); this.DataOutInit("Output", 2); VectorInputGroup = GlobalProvider.DataStructureProvider!.NewDataInGroup( this, DataInPorts, "Vector Input Type", DataTypeConstant.BaseDataTypes.R2, DataTypeConstant.DataTypeOptions.VectorTypes ); ScalarOutputGroup = GlobalProvider.DataStructureProvider.NewDataOutGroup( this, DataOutPorts, "", DataTypeConstant.BaseDataTypes.Real, DataTypeConstant.DataTypeOptions.ScalarTypes ); ConfigurablePortGroups = new HashSet { VectorInputGroup }; PostInit(); } public override void Define() { (object, DataType) Func1(CacheItem c) { DataVariable v = this.X(c); if (v.Type == DataTypeConstant.BaseDataTypes.R2) return (v.R2[1], DataTypeConstant.BaseDataTypes.Real); return (v.C2[1], DataTypeConstant.BaseDataTypes.Complex); } (object, DataType) Func2(CacheItem c) { DataVariable v = this.X(c); if (v.Type == DataTypeConstant.BaseDataTypes.R2) return (v.R2[2], DataTypeConstant.BaseDataTypes.Real); return (v.C2[2], DataTypeConstant.BaseDataTypes.Complex); } DataOutPorts[0].OutData.UpdateCalculation(Func1); DataOutPorts[1].OutData.UpdateCalculation(Func2); } public void Inference() => ScalarOutputGroup!.SelectedType = GlobalProvider.DataTypeProvider! .GetBaseField(VectorInputGroup!.SelectedType); }