refactor programmable modules
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
using Nocturnis.Enigmos.Modules;
|
||||
using Nocturnis.Enigmos.Ports.DataPorts.Directions;
|
||||
|
||||
namespace Enigmos.Modules.ProgrammableModules.FilterModule;
|
||||
|
||||
public partial class FilterIndicateModule : SubModule
|
||||
{
|
||||
public IDataInPort? Indicate { get; set; }
|
||||
|
||||
public override void Init()
|
||||
{
|
||||
base.Init();
|
||||
Indicate = this.GetPort<IDataInPort>("Indicate");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using Enigmos.Boards;
|
||||
using Godot;
|
||||
using Nocturnis.DataStructures;
|
||||
using Nocturnis.Enigmos.Modules.ComputationalModules;
|
||||
using Nocturnis.Enigmos.Ports;
|
||||
using Nocturnis.Enigmos.Ports.DataPorts.Directions;
|
||||
using Skeleton.DataStructure;
|
||||
|
||||
namespace Enigmos.Modules.ProgrammableModules.FilterModule;
|
||||
|
||||
public partial class FilterInputProviderModule : SubModule, IComputationalModule
|
||||
{
|
||||
public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty<IDataOutPort>();
|
||||
public override IEnumerable<IBasePort> Ports => DataOutPorts;
|
||||
public IDataOutPort? Output { get; set; }
|
||||
|
||||
public FilterModuleBoard? ParentBoard { get; set; }
|
||||
|
||||
public void Init(FilterModuleBoard board)
|
||||
{
|
||||
base.Init();
|
||||
ParentBoard = board;
|
||||
this.DataOutInit("Output", 1);
|
||||
Output = DataOutPorts[0];
|
||||
PostInit();
|
||||
}
|
||||
|
||||
public void Define()
|
||||
{
|
||||
(object, StringName) Func(CacheItem c)
|
||||
{
|
||||
IData w = ParentBoard!.FilterModule!.CachedInputArray[ParentBoard.FilterModule.ProcessingIndex];
|
||||
return (w.Data, w.Type)!;
|
||||
}
|
||||
Output!.OutData.UpdateCalculation(Func);
|
||||
}
|
||||
}
|
||||
127
Modules/ProgrammableModules/FilterModule/FilterModule.cs
Normal file
127
Modules/ProgrammableModules/FilterModule/FilterModule.cs
Normal file
@@ -0,0 +1,127 @@
|
||||
using Enigmos.Boards;
|
||||
using Enigmos.Modules.InterlayerModules;
|
||||
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.FilterModule;
|
||||
|
||||
public partial class FilterModule : ProgrammableModule, IPolymorphismModule, IFilterModule
|
||||
{
|
||||
public IDataInPort? InputArray { get; set; }
|
||||
public FilterOutputModule? OutputArrayModule { get; set; }
|
||||
private IInterlayerDataInModule[] ExplicitInputs { get; set; } = Array.Empty<IInterlayerDataInModule>();
|
||||
|
||||
private IDataPortGroup[] InterLayerGroups { get; set; } = Array.Empty<IDataPortGroup>();
|
||||
private IDataPortGroup? ArrayGroup { get; set; }
|
||||
public IData[] CachedInputArray { get; set; } = Array.Empty<IData>();
|
||||
public IData[] CachedResult { get; set; } = Array.Empty<IData>();
|
||||
public bool FilterFinished { get; set; }
|
||||
public bool FilterStarted { get; set; }
|
||||
|
||||
private List<IData> CachedListResult { get; set; } = new();
|
||||
public int ProcessingIndex { get; set; }
|
||||
|
||||
public new FilterModuleBoard UnderlyingBoard
|
||||
{
|
||||
get => (base.UnderlyingBoard as FilterModuleBoard)!;
|
||||
set => base.UnderlyingBoard = value;
|
||||
}
|
||||
|
||||
public override IEnumerable<IBasePort> Ports => new IBasePort[] { InputArray!, OutputArrayModule!.Output! };
|
||||
|
||||
public override IBaseModule[] SubModules => ExplicitInputs;
|
||||
|
||||
public override IEnumerable<IBasePort> ExplicitPorts =>
|
||||
new IBasePort[] { InputArray!, OutputArrayModule!.Output! }
|
||||
.Union(ExplicitInputs.Select(c => c.DataIn))!
|
||||
.ToArray<IBasePort>();
|
||||
|
||||
public override IEnumerable<IBasePort> ImplicitPorts =>
|
||||
new IBasePort[] { OutputArrayModule!.Output!, InputArray! }
|
||||
.Union(UnderlyingBoard.FilterInputProxy.Select(c => c.DataOut))
|
||||
.ToArray()!;
|
||||
|
||||
public HashSet<IDataPortGroup> ConfigurablePortGroups { get; set; } = new();
|
||||
|
||||
public void Inference()
|
||||
{
|
||||
}
|
||||
|
||||
public void Filter()
|
||||
{
|
||||
if (!FilterStarted)
|
||||
{
|
||||
CachedInputArray = InputArray!.GetData.Get!.Array;
|
||||
ProcessingIndex = 0;
|
||||
CachedListResult = new List<IData>();
|
||||
FilterStarted = true;
|
||||
}
|
||||
|
||||
while (ProcessingIndex < CachedInputArray.Length)
|
||||
{
|
||||
SoftReset();
|
||||
UnderlyingBoard.InputProvider!.Define();
|
||||
UnderlyingBoard.InputProvider.Output!.OutData.Expire();
|
||||
if(UnderlyingBoard.Indicate!.Indicate!.GetData.Get!.Bit)
|
||||
CachedListResult.Add(CachedInputArray[ProcessingIndex]);
|
||||
ProcessingIndex += 1;
|
||||
}
|
||||
|
||||
CachedResult = CachedListResult.ToArray();
|
||||
FilterFinished = true;
|
||||
FilterStarted = false;
|
||||
}
|
||||
|
||||
|
||||
private void SoftReset() => UnderlyingBoard.Reset();
|
||||
|
||||
public override void Init()
|
||||
{
|
||||
base.Init();
|
||||
InputArray = this.GetPort<IDataInPort>("InputArray");
|
||||
OutputArrayModule = GetModule<FilterOutputModule>("OutputArray");
|
||||
UnderlyingBoard = GlobalProvider.SceneProvider!
|
||||
.AssetMapper<FilterModuleBoard>()
|
||||
.Instantiate<FilterModuleBoard>();
|
||||
ExplicitInputs = new IInterlayerDataInModule[3];
|
||||
for (int i = 0; i < 3; i++)
|
||||
ExplicitInputs[i] = GetModule<InterlayerDataInModule>($"EI{i + 1}");
|
||||
OutputArrayModule.Init(this);
|
||||
UnderlyingBoard.Init(this);
|
||||
|
||||
FilterFinished = false;
|
||||
FilterStarted = false;
|
||||
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
InterLayerGroups[i] = GlobalProvider.DataStructureProvider!.NewDataPortGroup(
|
||||
this,
|
||||
new IDataPort[] { ExplicitInputs[i].DataIn!, UnderlyingBoard.FilterInputProxy[i].DataOut! },
|
||||
$"Exterior In -> Interior Out{i}",
|
||||
EnigmosConstant.DataPortTypes.Real,
|
||||
EnigmosConstant.DataPortTypes.AnyType
|
||||
);
|
||||
ExplicitInputs[i].Board = Board;
|
||||
}
|
||||
|
||||
ArrayGroup = GlobalProvider.DataStructureProvider!.NewDataPortGroup(
|
||||
this,
|
||||
new IDataPort[] { InputArray, OutputArrayModule.Output! },
|
||||
"Array Type",
|
||||
EnigmosConstant.DataPortTypes.RealArray,
|
||||
EnigmosConstant.DataPortTypes.AnyArray
|
||||
);
|
||||
|
||||
ConfigurablePortGroups = InterLayerGroups.Union(new[] { ArrayGroup }).ToHashSet();
|
||||
|
||||
PostInit();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using Godot;
|
||||
using Nocturnis.Enigmos.Modules;
|
||||
using Nocturnis.Enigmos.Modules.ComputationalModules;
|
||||
using Nocturnis.Enigmos.Ports;
|
||||
using Nocturnis.Enigmos.Ports.DataPorts.Directions;
|
||||
using Nocturnis.GlobalManagement.Constants;
|
||||
using Skeleton.DataStructure;
|
||||
|
||||
namespace Enigmos.Modules.ProgrammableModules.FilterModule;
|
||||
|
||||
public partial class FilterOutputModule : SubModule, IComputationalModule
|
||||
{
|
||||
public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty<IDataOutPort>();
|
||||
public IDataOutPort? Output { get; set; }
|
||||
public override IEnumerable<IBasePort> Ports => DataOutPorts;
|
||||
public new IFilterModule? ParentModule {
|
||||
get => base.ParentModule as IFilterModule;
|
||||
set => base.ParentModule = value;
|
||||
}
|
||||
|
||||
public void Init(IFilterModule parent)
|
||||
{
|
||||
base.Init();
|
||||
this.DataOutInit("Output", 1);
|
||||
Output = DataOutPorts[0];
|
||||
ParentModule = parent;
|
||||
PostInit();
|
||||
}
|
||||
|
||||
public void Define()
|
||||
{
|
||||
(object, StringName) Func(CacheItem c)
|
||||
{
|
||||
if (!ParentModule!.FilterFinished)
|
||||
ParentModule!.Filter();
|
||||
return (ParentModule!.CachedResult, EnigmosConstant.DataPortTypes.AnyArrayType);
|
||||
}
|
||||
Output!.OutData.UpdateCalculation(Func);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user