Files
Enigmos/Modules/ProgrammableModules/FilterModule.cs
2024-07-03 12:20:08 +08:00

140 lines
5.1 KiB
C#

using Enigmos.Boards;
using Enigmos.Exceptions;
using Enigmos.Modules.ControllingModules;
using Enigmos.Modules.InterlayerModules;
using Enigmos.Modules.Other;
using Enigmos.Ports.DataPorts;
using Nocturnis.DataStructures;
using Nocturnis.DataStructures.DataPortGroups;
using Nocturnis.Enigmos.Modules;
using Nocturnis.Enigmos.Modules.InterlayerModules;
using Nocturnis.Enigmos.Ports;
using Nocturnis.Enigmos.Ports.DataPorts;
using Nocturnis.Enigmos.Ports.DataPorts.Directions;
using Nocturnis.GlobalManagement.Constants;
using Nocturnis.GlobalManagement.Providers;
namespace Enigmos.Modules.ProgrammableModules;
public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFilterModule
{
private IDataInPort? Input { get; set; }
private IInterlayerDataInModule[] ExplicitInputs { get; set; } = Array.Empty<IInterlayerDataInModule>();
private FilterOutputModule? Output { get; set; }
private IterativeOutputModule? IterativeOutput { get; set; }
private IndicateInputModule? Indicate { get; set; }
private IDataPortGroup[] InterLayerGroups { get; set; } = Array.Empty<IDataPortGroup>();
private IDataPortGroup? ArrayGroup { get; set; }
private bool FilterEnded { get; set; }
private IData[] CachedInputArray { get; set; } = Array.Empty<IData>();
public IData[] CachedResult { get; set; } = Array.Empty<IData>();
private List<IData> CachedListResult { get; set; } = new();
//private List<IData> CachedResult { get; set; } = new();
private int CachedIndex { get; set; }
public new FilterModuleBoard UnderlyingBoard
{
get => (base.UnderlyingBoard as FilterModuleBoard)!;
set => base.UnderlyingBoard = value;
}
public override IEnumerable<IBasePort> Ports => new[] { Input! };
public override IBaseModule[] SubModules() => ExplicitInputs.Union<IBaseModule>(new[] { Output! }).ToArray();
public override IEnumerable<IBasePort> ExplicitPorts =>
new IBasePort[] { Output!.Output! }
.Union(ExplicitInputs.Select(c => c.DataIn))!
.ToArray<IBasePort>();
public override IEnumerable<IBasePort> ImplicitPorts =>
new IBasePort[] { IterativeOutput!.Output!, Indicate!.Input! }
.Union(UnderlyingBoard.Outputs.Select(c => c.DataOut))
.ToArray()!;
public HashSet<IDataPortGroup> ConfigurablePortGroups { get; set; } = new();
public void Inference() => IterativeOutput!.Output!
.SetDataType(GlobalProvider.DataStructureProvider!.ArrayToElement(ArrayGroup!.SelectedType));
public void Filter()
{
if (FilterEnded)
{
CachedInputArray = Input!.GetData.Get!.Array;
CachedIndex = 0;
CachedListResult = new List<IData>();
}
while (CachedIndex < CachedInputArray.Length)
{
SoftReset();
IterativeOutput!.Output!.OutData.UpdateCalculation(cache =>
(CachedInputArray[CachedIndex].Data, IterativeOutput.Output.DataType)!);
IterativeOutput.Output.OutData.Expire();
if(Indicate!.Input!.GetData.Get!.Bit)
CachedListResult.Add(CachedInputArray[CachedIndex]);
CachedIndex += 1;
}
CachedResult = CachedListResult.ToArray();
FilterEnded = true;
}
private void SoftReset() => UnderlyingBoard.Reset();
public override void Init()
{
base.Init();
UnderlyingBoard = GlobalProvider.SceneProvider!
.AssetMapper<FilterModuleBoard>()
.Instantiate<FilterModuleBoard>();
UnderlyingBoard.Init();
ExplicitInputs = new InterlayerDataInModule[3];
InterLayerGroups = new IDataPortGroup[3];
IterativeOutput = UnderlyingBoard.IterativeOutput;
IterativeOutput.Output.SetDataType(EnigmosConstant.DataPortTypes.Real);
Indicate = UnderlyingBoard.Indicate;
for (int i = 0; i < 3; i++)
{
ExplicitInputs[i] = GetModule<InterlayerDataInModule>($"EI{i + 1}");
ExplicitInputs[i].DualModule = UnderlyingBoard.Outputs[i];
UnderlyingBoard.Outputs[i].DualModule = ExplicitInputs[i];
}
FilterEnded = true;
Input = this.GetPort<DataInPort>("Input");
Output = GetModule<FilterOutputModule>("Output");
for (int i = 0; i < 3; i++)
{
InterLayerGroups[i] = GlobalProvider.DataStructureProvider.NewDataPortGroup(
this,
new IDataPort[] { ExplicitInputs[i].DataIn, UnderlyingBoard.Outputs[i].DataOut },
$"Exterior In -> Interior Out{i}",
EnigmosConstant.DataPortTypes.Real,
EnigmosConstant.DataPortTypes.AnyType
);
ExplicitInputs[i].Board = Board;
}
ArrayGroup = GlobalProvider.DataStructureProvider!.NewDataPortGroup(
this,
new IDataPort[] { Input, Output.Output! },
"Array Type",
EnigmosConstant.DataPortTypes.RealArray,
EnigmosConstant.DataPortTypes.AnyArray
);
ConfigurablePortGroups = InterLayerGroups.Union(new[] { ArrayGroup }).ToHashSet();
PostInit();
}
}