using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.DataStructures.DataTypes; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports.DataPorts.Directions; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; using Skeleton.DataStructure; namespace Enigmos.Modules.ComputationalModules.Binary; public abstract partial class PowerModule : BinaryComputationalModule, IPolymorphismModule, IDuplicateOutputModule { private IDataPortGroup? TensorInputGroup { get; set; } private IDataPortGroup? OutputGroup { get; set; } 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] }, "Base Tensor Type", DataTypeConstant.BaseDataTypes.Real, DataTypeConstant.DataTypeOptions.ScalarTypes ); DataInPorts[1].SetDataType(DataTypeConstant.BaseDataTypes.Complex); OutputGroup = GlobalProvider.DataStructureProvider.NewDataOutGroup( this, DataOutPorts, "", DataTypeConstant.BaseDataTypes.Real, DataTypeConstant.DataTypeOptions.ScalarTypes ); ConfigurablePortGroups = new HashSet { TensorInputGroup }; PostInit(); } public override void Define() { (object, DataType) Func(CacheItem cache) => GlobalProvider.PolymorphismProvider!.Pow(this.X(cache), this.Y(cache)); this.Define(Func); } public void Inference() => OutputGroup!.SelectedType = GlobalProvider.DataTypeProvider!.ComplexVersionOf(TensorInputGroup!.SelectedType); }