NN_in_Trading/Experts/Unsupervised/NetCreator/NetCreatorPanel.mqh
2026-03-14 22:28:53 +02:00

1695 líneas
125 KiB
MQL5

//+------------------------------------------------------------------+
//| NetCreatorPanel.mqh |
//| Copyright DNG® |
//| https://www.mql5.com/ru/users/dng |
//+------------------------------------------------------------------+
#property copyright "Copyright DNG®"
#property link "https://www.mql5.com/ru/users/dng"
#property version "1.00"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "..\..\NeuroNet_DNG\NeuroNet.mqh"
#include <Controls\Dialog.mqh>
#include <Controls\Label.mqh>
#include <Controls\ListView.mqh>
#include <Controls\SpinEdit.mqh>
#include <Controls\ComboBox.mqh>
#include <Controls\Button.mqh>
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
//--- indents and gaps
#define INDENT_LEFT (11) // indent from left (with allowance for border width)
#define INDENT_TOP (11) // indent from top (with allowance for border width)
#define INDENT_RIGHT (11) // indent from right (with allowance for border width)
#define INDENT_BOTTOM (11) // indent from bottom (with allowance for border width)
#define CONTROLS_GAP_X (5) // gap by X coordinate
#define CONTROLS_GAP_Y (5) // gap by Y coordinate
//--- for buttons
#define BUTTON_HEIGHT (20) // size by Y coordinate
//--- for the indication area
#define EDIT_WIDTH (100) // size by X coordinate
#define EDIT_HEIGHT (20) // size by Y coordinate
//--- for group controls
#define LIST_WIDTH (280) // size by X coordinate
#define ADDS_WIDTH (200) // size by X coordinate
//---
#define LABEL_NAME "Label"
#define EDIT_NAME "Edit"
//---
#define DEFAULT_NEURONS (1000)
#define DEFAULT_OPTIMIZATION ADAM
#define DEFAULT_ACTIVATION SIGMOID
#define DEFAULT_PROBABILITY (0.3)
//---
#define PANEL_WIDTH (2 * LIST_WIDTH + ADDS_WIDTH + \
2 * CONTROLS_GAP_X + \
INDENT_LEFT + INDENT_RIGHT + \
4 * CONTROLS_DIALOG_CLIENT_OFF)
#define PANEL_HEIGHT (INDENT_TOP + INDENT_BOTTOM + \
12 * (EDIT_HEIGHT + CONTROLS_GAP_Y) + \
BUTTON_HEIGHT + CONTROLS_GAP_Y + \
4 * CONTROLS_BORDER_WIDTH + \
CONTROLS_DIALOG_CAPTION_HEIGHT)
//---
#define EXTENSION ".nnw"
//---
#define KEY_UP 38
#define KEY_DOWN 40
#define KEY_DELETE 46
//---
#define ON_EVENT_CONTROL(event,control,handler) if(id==(event+CHARTEVENT_CUSTOM) && lparam==control.Id()) { handler(control); return(true); }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CNetModify : public CNet
{
public:
CNetModify(void) {};
~CNetModify(void) {};
//---
uint LayersTotal(void);
CArrayObj* GetLayersDiscriptions(void);
virtual bool AddLayer(CLayer* new_layer);
virtual bool AddLayers(CArrayObj* new_layers);
virtual CLayer* GetLayer(uint layer);
COpenCLMy* GetOpenCL(void) {return opencl;}
void SetOpenCL(COpenCLMy *OpenCL) {opencl = OpenCL;}
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
uint CNetModify::LayersTotal(void)
{
if(!layers)
return 0;
//---
return layers.Total();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CArrayObj* CNetModify::GetLayersDiscriptions(void)
{
CArrayObj* result = new CArrayObj();
for(uint i = 0; i < LayersTotal(); i++)
{
CLayer* layer = layers.At(i);
if(!layer)
break;
CNeuronBaseOCL* neuron = layer.At(0);
if(!neuron)
break;
if(!result.Add(neuron.GetLayerInfo()))
break;
}
//---
return result;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CLayer* CNetModify::GetLayer(uint layer)
{
if(!layers || LayersTotal() <= layer)
return NULL;
//---
return layers.At(layer);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetModify::AddLayer(CLayer *new_layer)
{
if(!new_layer)
return false;
if(!layers)
{
layers = new CArrayLayer();
if(!layers)
return false;
}
//---
return layers.Add(new_layer);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetModify::AddLayers(CArrayObj *new_layers)
{
if(!new_layers || new_layers.Total() <= 0)
return false;
//---
if(!layers || LayersTotal() <= 0)
{
Create(new_layers);
return true;
}
//---
CLayerDescription *desc = NULL, *next = NULL, *prev = NULL;
CLayer *temp;
//---
int shift = (int)LayersTotal() - 1;
CLayer* last_layer = layers.At(shift);
if(!last_layer)
return false;
//---
CNeuronBaseOCL* neuron = last_layer.At(0);
if(!neuron)
return false;
//---
desc = neuron.GetLayerInfo();
next = new_layers.At(0);
uint outputs = (next == NULL || (next.type != defNeuron && next.type != defNeuronBaseOCL) ? 0 : next.count);
if(!!next && next.type == defNeuronFQF)
outputs = next.count * next.window_out;
if(!neuron.numOutputs(outputs, next.optimization))
return false;
//---
int total = new_layers.Total();
for(int i = 0; i < total; i++)
{
if(i == 1 && !!prev)
delete prev;
prev = desc;
desc = new_layers.At(i);
next = new_layers.At(i + 1);
outputs = (next == NULL || (next.type != defNeuron && next.type != defNeuronBaseOCL) ? 0 : next.count);
if(!!next && next.type == defNeuronFQF)
outputs = next.count * next.window_out;
temp = new CLayer(outputs);
uint neurons = (desc.count + (desc.type == defNeuron || desc.type == defNeuronBaseOCL ? 1 : 0));
CNeuronBaseOCL *neuron_ocl = NULL;
CNeuronConvOCL *neuron_conv_ocl = NULL;
CNeuronProofOCL *neuron_proof_ocl = NULL;
CNeuronAttentionOCL *neuron_attention_ocl = NULL;
CNeuronMLMHAttentionOCL *neuron_mlattention_ocl = NULL;
CNeuronDropoutOCL *dropout = NULL;
CNeuronBatchNormOCL *batch = NULL;
CVAE *vae = NULL;
CNeuronLSTMOCL *lstm = NULL;
CNeuronSoftMaxOCL *softmax = NULL;
CNeuronFQF *fqf = NULL;
switch(desc.type)
{
case defNeuron:
case defNeuronBaseOCL:
neuron_ocl = new CNeuronBaseOCL();
if(CheckPointer(neuron_ocl) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!neuron_ocl.Init(outputs, 0, opencl, desc.count, desc.optimization, desc.batch))
{
delete neuron_ocl;
delete temp;
return false;
}
neuron_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_ocl))
{
delete neuron_ocl;
delete temp;
return false;
}
neuron_ocl = NULL;
break;
//---
case defNeuronConvOCL:
neuron_conv_ocl = new CNeuronConvOCL();
if(CheckPointer(neuron_conv_ocl) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!neuron_conv_ocl.Init(outputs, 0, opencl, desc.window, desc.step, desc.window_out, desc.count, desc.optimization, desc.batch))
{
delete neuron_conv_ocl;
delete temp;
return false;
}
neuron_conv_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_conv_ocl))
{
delete neuron_conv_ocl;
delete temp;
return false;
}
neuron_conv_ocl = NULL;
break;
//---
case defNeuronProofOCL:
neuron_proof_ocl = new CNeuronProofOCL();
if(!neuron_proof_ocl)
{
delete temp;
return false;
}
if(!neuron_proof_ocl.Init(outputs, 0, opencl, desc.window, desc.step, desc.count, desc.optimization, desc.batch))
{
delete neuron_proof_ocl;
delete temp;
return false;
}
neuron_proof_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_proof_ocl))
{
delete neuron_proof_ocl;
delete temp;
return false;
}
neuron_proof_ocl = NULL;
break;
//---
case defNeuronAttentionOCL:
neuron_attention_ocl = new CNeuronAttentionOCL();
if(CheckPointer(neuron_attention_ocl) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!neuron_attention_ocl.Init(outputs, 0, opencl, desc.window, desc.count, desc.optimization, desc.batch))
{
delete neuron_attention_ocl;
delete temp;
return false;
}
neuron_attention_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_attention_ocl))
{
delete neuron_attention_ocl;
delete temp;
return false;
}
neuron_attention_ocl = NULL;
break;
//---
case defNeuronMHAttentionOCL:
neuron_attention_ocl = new CNeuronMHAttentionOCL();
if(CheckPointer(neuron_attention_ocl) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!neuron_attention_ocl.Init(outputs, 0, opencl, desc.window, desc.count, desc.optimization, desc.batch))
{
delete neuron_attention_ocl;
delete temp;
return false;
}
neuron_attention_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_attention_ocl))
{
delete neuron_attention_ocl;
delete temp;
return false;
}
neuron_attention_ocl = NULL;
break;
//---
case defNeuronMLMHAttentionOCL:
neuron_mlattention_ocl = new CNeuronMLMHAttentionOCL();
if(CheckPointer(neuron_mlattention_ocl) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!neuron_mlattention_ocl.Init(outputs, 0, opencl, desc.window, desc.window_out, desc.step, desc.count, desc.layers, desc.optimization, desc.batch))
{
delete neuron_mlattention_ocl;
delete temp;
return false;
}
neuron_mlattention_ocl.SetActivationFunction(desc.activation);
if(!temp.Add(neuron_mlattention_ocl))
{
delete neuron_mlattention_ocl;
delete temp;
return false;
}
neuron_mlattention_ocl = NULL;
break;
//---
case defNeuronDropoutOCL:
dropout = new CNeuronDropoutOCL();
if(CheckPointer(dropout) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!dropout.Init(outputs, 0, opencl, desc.count, desc.probability, desc.optimization, desc.batch))
{
delete dropout;
delete temp;
return false;
}
if(!temp.Add(dropout))
{
delete dropout;
delete temp;
return false;
}
dropout = NULL;
break;
//---
case defNeuronBatchNormOCL:
batch = new CNeuronBatchNormOCL();
if(CheckPointer(batch) == POINTER_INVALID)
{
delete temp;
return false;
}
if(!batch.Init(outputs, 0, opencl, desc.count, desc.batch, desc.optimization))
{
delete batch;
delete temp;
return false;
}
batch.SetActivationFunction(desc.activation);
if(!temp.Add(batch))
{
delete batch;
delete temp;
return false;
}
batch = NULL;
break;
//---
case defNeuronVAEOCL:
vae = new CVAE();
if(!vae)
{
delete temp;
return false;
}
if(!vae.Init(outputs, 0, opencl, desc.count, desc.optimization, desc.batch))
{
delete vae;
delete temp;
return false;
}
if(!temp.Add(vae))
{
delete vae;
delete temp;
return false;
}
vae = NULL;
break;
case defNeuronLSTMOCL:
lstm = new CNeuronLSTMOCL();
if(!lstm)
{
delete temp;
return false;
}
if(!lstm.Init(outputs, 0, opencl, desc.count, desc.optimization, desc.batch))
{
delete lstm;
delete temp;
return false;
}
if(i > 0)
{
desc = new_layers.At(i - 1);
if(!lstm.SetInputs(desc.count))
{
delete lstm;
delete temp;
return false;
}
}
if(!temp.Add(lstm))
{
delete lstm;
delete temp;
return false;
}
lstm = NULL;
break;
//---
case defNeuronSoftMaxOCL:
softmax = new CNeuronSoftMaxOCL();
if(!softmax)
{
delete temp;
return false;
}
if(!softmax.Init(outputs, 0, opencl, desc.count * desc.step, desc.optimization, desc.batch))
{
delete softmax;
delete temp;
return false;
}
softmax.SetHeads(desc.step);
if(!temp.Add(softmax))
{
delete softmax;
delete temp;
return false;
}
softmax = NULL;
break;
//---
case defNeuronFQF:
fqf = new CNeuronFQF();
if(!fqf)
{
delete temp;
return false;
}
if(!fqf.Init(outputs, 0, opencl, desc.count, desc.window_out, prev.count * (prev.type == defNeuronConv ? prev.window_out : 1), desc.optimization, desc.batch))
{
delete fqf;
delete temp;
return false;
}
if(!temp.Add(fqf.AsObject()))
{
delete fqf;
delete temp;
return false;
}
fqf = NULL;
break;
//---
default:
delete temp;
return false;
break;
}
//---
if(!layers.Add(temp))
{
delete temp;
delete layers;
return false;
}
}
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CNetCreatorPanel : protected CAppDialog
{
protected:
//--- pre-trained model
CNetModify m_Model;
CEdit m_edPTModel;
CEdit m_edPTModelLayers;
CSpinEdit m_spPTModelLayers;
CListView m_lstPTModel;
CArrayObj* m_arPTModelDescription;
bool b_UseCommonDirectory;
virtual CLabel* CreateLabel(const int id, const string text, const int x1, const int y1, const int x2, const int y2);
virtual bool CreateEdit(const int id, CEdit& object, const int x1, const int y1, const int x2, const int y2, bool read_only);
virtual bool EditReedOnly(CEdit& object, const bool flag);
virtual string LayerTypeToString(int type);
virtual int LayerDescriptionToString(const CLayerDescription* layer, string& result[]);
virtual bool LoadModel(string file_name);
//--- add layers
CComboBox m_cbNewNeuronType;
CLabel* m_lbCount;
CEdit m_edCount;
CEdit m_edWindow;
CEdit m_edWindowOut;
CLabel* m_lbWindowOut;
CEdit m_edStep;
CLabel* m_lbStepHeads;
CEdit m_edLayers;
CEdit m_edBatch;
CEdit m_edProbability;
CComboBox m_cbActivation;
CComboBox m_cbOptimization;
CButton m_btAddLayer;
CButton m_btDeleteLayer;
CArrayObj m_arAddLayers;
virtual bool CreateComboBoxType(const int x1, const int y1, const int x2, const int y2);
virtual bool CreateComboBoxActivation(const int x1, const int y1, const int x2, const int y2);
virtual bool ActivationListMain(void);
virtual bool ActivationListEmpty(void);
virtual bool CreateComboBoxOptimization(const int x1, const int y1, const int x2, const int y2);
virtual bool SetCounts(const uint type);
//--- new model
CListView m_lstNewModel;
CButton m_btSave;
//--- events
virtual bool OpenPreTrainedModel(void);
virtual bool ChangeNumberOfLayers(void);
virtual bool OnChangeListPTModel(void);
virtual bool OnChangeListNewModel(void);
virtual bool OnChangeNeuronType(void);
virtual bool OnClickAddButton(void);
virtual bool OnClickDeleteButton(void);
virtual bool OnClickSaveButton(void);
virtual bool OnChangeWindowStep(void);
virtual bool OnEndEdit(CEdit& object);
virtual bool OnEndEditProbability(void);
public:
CNetCreatorPanel();
~CNetCreatorPanel();
//--- main application dialog creation and destroy
virtual bool Create(const long chart, const string name, const int subwin, const int x1, const int y1, bool common);
virtual void Destroy(const int reason = REASON_PROGRAM) override { CAppDialog::Destroy(reason); }
//--- chart event handler
void ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam);
virtual bool OnEvent(const int id, const long &lparam, const double &dparam, const string &sparam);
bool Run(void) { return CAppDialog::Run();}
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CNetCreatorPanel::CNetCreatorPanel()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CNetCreatorPanel::~CNetCreatorPanel()
{
if(!!m_arPTModelDescription)
delete m_arPTModelDescription;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::Create(const long chart, const string name, const int subwin, const int x1, const int y1, bool common)
{
if(!CAppDialog::Create(chart, name, subwin, x1, y1, x1 + PANEL_WIDTH, y1 + PANEL_HEIGHT))
return false;
//---
int lx1 = INDENT_LEFT;
int ly1 = INDENT_TOP;
int lx2 = lx1 + LIST_WIDTH;
int ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(0, "PreTrained model", lx1, ly1, lx2, ly2))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateEdit(0, m_edPTModel, lx1, ly1, lx2, ly2, true))
return false;
if(!m_edPTModel.Text("Select file"))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(1, "Layers Total", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateEdit(1, m_edPTModelLayers, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edPTModelLayers.Text("0"))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(2, "Transfer Layers", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!m_spPTModelLayers.Create(m_chart_id, "spPTMCopyLayers", m_subwin, lx2 - EDIT_WIDTH, ly1, lx2, ly2))
return false;
m_spPTModelLayers.MinValue(0);
m_spPTModelLayers.MaxValue(0);
m_spPTModelLayers.Value(0);
if(!Add(m_spPTModelLayers))
return false;
//---
lx1 = INDENT_LEFT;
lx2 = lx1 + LIST_WIDTH;
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ClientAreaHeight() - INDENT_BOTTOM;
if(!m_lstPTModel.Create(m_chart_id, "lstPTModel", m_subwin, lx1, ly1, lx2, ly2))
return false;
if(!m_lstPTModel.VScrolled(true))
return false;
if(!Add(m_lstPTModel))
return false;
//---
lx1 = lx2 + CONTROLS_GAP_X;
lx2 = lx1 + ADDS_WIDTH;
ly1 = INDENT_TOP;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(3, "Add layer", lx1, ly1, lx2, ly2))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateComboBoxType(lx1, ly1, lx2, ly2))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!(m_lbCount = CreateLabel(4, "Neurons", lx1, ly1, lx1 + EDIT_WIDTH, ly2)))
return false;
//---
if(!CreateEdit(2, m_edCount, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edCount.Text((string)DEFAULT_NEURONS))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(5, "Activation", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateComboBoxActivation(lx2 - EDIT_WIDTH, ly1, lx2, ly2))
return false;
m_cbActivation.Disable();
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(6, "Optimization", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateComboBoxOptimization(lx2 - EDIT_WIDTH, ly1, lx2, ly2))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(7, "Window", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateEdit(3, m_edWindow, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edWindow.Text((string)2))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
m_lbStepHeads = CreateLabel(8, "Step", lx1, ly1, lx1 + EDIT_WIDTH, ly2);
if(!m_lbStepHeads)
return false;
//---
if(!CreateEdit(4, m_edStep, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edStep.Text((string)1))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
m_lbWindowOut = CreateLabel(9, "Window Out", lx1, ly1, lx1 + EDIT_WIDTH, ly2);
if(!m_lbWindowOut)
return false;
//---
if(!CreateEdit(5, m_edWindowOut, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edWindowOut.Text((string)1))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(10, "Layers", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateEdit(6, m_edLayers, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edLayers.Text((string)1))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(11, "Batch size", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateEdit(7, m_edBatch, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edBatch.Text((string)1))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
if(!CreateLabel(12, "Probability", lx1, ly1, lx1 + EDIT_WIDTH, ly2))
return false;
//---
if(!CreateEdit(8, m_edProbability, lx2 - EDIT_WIDTH, ly1, lx2, ly2, true))
return false;
if(!m_edProbability.Text((string)DEFAULT_PROBABILITY))
return false;
if(!OnEndEditProbability())
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + BUTTON_HEIGHT;
if(!m_btAddLayer.Create(m_chart_id, "btAddLayer", m_subwin, lx1, ly1, lx1 + ADDS_WIDTH / 2, ly2))
return false;
if(!m_btAddLayer.Text("ADD LAYER"))
return false;
m_btAddLayer.Locking(false);
if(!Add(m_btAddLayer))
return false;
//---
if(!m_btDeleteLayer.Create(m_chart_id, "btDeleteLayer", m_subwin, lx2 - ADDS_WIDTH / 2, ly1, lx2, ly2))
return false;
if(!m_btDeleteLayer.Text("DELETE"))
return false;
m_btDeleteLayer.Locking(false);
if(!Add(m_btDeleteLayer))
return false;
//---
lx1 = lx2 + CONTROLS_GAP_X;
lx2 = lx1 + LIST_WIDTH;
ly1 = INDENT_TOP;
ly2 = ly1 + EDIT_HEIGHT;
int width = (LIST_WIDTH - CONTROLS_GAP_X) / 2;
if(!CreateLabel(99, "New model", lx1, ly1, lx1 + width, ly2))
return false;
//---
if(!m_btSave.Create(m_chart_id, "btSave", m_subwin, lx2 - width, ly1, lx2, ly2))
return false;
if(!m_btSave.Text("SAVE MODEL"))
return false;
m_btSave.Locking(false);
if(!Add(m_btSave))
return false;
//---
ly1 = ly2 + CONTROLS_GAP_Y;
ly2 = ly1 + EDIT_HEIGHT;
ly2 = ClientAreaHeight() - INDENT_BOTTOM;
if(!m_lstNewModel.Create(m_chart_id, "lstNewModel", m_subwin, lx1, ly1, lx2, ly2))
return false;
if(!m_lstNewModel.VScrolled(true))
return false;
if(!Add(m_lstNewModel))
return false;
//---
b_UseCommonDirectory = common;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CNetCreatorPanel)
ON_EVENT(ON_CLICK, m_edPTModel, OpenPreTrainedModel)
ON_EVENT(ON_CLICK, m_btAddLayer, OnClickAddButton)
ON_EVENT(ON_CLICK, m_btDeleteLayer, OnClickDeleteButton)
ON_EVENT(ON_CLICK, m_btSave, OnClickSaveButton)
ON_EVENT(ON_CHANGE, m_spPTModelLayers, ChangeNumberOfLayers)
ON_EVENT(ON_CHANGE, m_lstPTModel, OnChangeListPTModel)
ON_EVENT(ON_CHANGE, m_lstNewModel, OnChangeListNewModel)
ON_EVENT(ON_CHANGE, m_cbNewNeuronType, OnChangeNeuronType)
ON_EVENT(ON_END_EDIT, m_edWindow, OnChangeWindowStep)
ON_EVENT(ON_END_EDIT, m_edStep, OnChangeWindowStep)
ON_EVENT(ON_END_EDIT, m_edProbability, OnEndEditProbability)
ON_EVENT_CONTROL(ON_END_EDIT, m_edCount, OnEndEdit)
ON_EVENT_CONTROL(ON_END_EDIT, m_edWindowOut, OnEndEdit)
ON_EVENT_CONTROL(ON_END_EDIT, m_edLayers, OnEndEdit)
ON_EVENT_CONTROL(ON_END_EDIT, m_edBatch, OnEndEdit)
EVENT_MAP_END(CAppDialog)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OpenPreTrainedModel(void)
{
string filenames[];
if(FileSelectDialog("Выберите файлы для загрузки", NULL,
"Neuron Net (*.nnw;*.inv;*.fwd)|*.nnw;*.inv;*.fwd|All files (*.*)|*.*",
FSD_FILE_MUST_EXIST | (b_UseCommonDirectory ? FSD_COMMON_FOLDER : NULL), filenames, NULL) > 0)
{
if(!LoadModel(filenames[0]))
return false;
}
else
m_edPTModel.Text("Files not selected");
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::LoadModel(string file_name)
{
float error, undefine, forecast;
datetime time;
ResetLastError();
if(!m_Model.Load(file_name, error, undefine, forecast, time, b_UseCommonDirectory))
{
m_lstPTModel.ItemsClear();
m_lstPTModel.ItemAdd("Error of load model", 0);
m_lstPTModel.ItemAdd(file_name, 1);
int err = GetLastError();
if(err == 0)
m_lstPTModel.ItemAdd("The file is damaged");
else
m_lstPTModel.ItemAdd(StringFormat("error id: %d", GetLastError()), 2);
m_edPTModel.Text("Select file");
return false;
}
m_edPTModel.Text(file_name);
m_edPTModelLayers.Text((string)m_Model.LayersTotal());
if(!!m_arPTModelDescription)
delete m_arPTModelDescription;
m_arPTModelDescription = m_Model.GetLayersDiscriptions();
m_lstPTModel.ItemsClear();
int total = m_arPTModelDescription.Total();
for(int i = 0; i < total; i++)
{
CLayerDescription* temp = m_arPTModelDescription.At(i);
if(!temp)
return false;
//---
string items[];
int total_items = LayerDescriptionToString(temp, items);
if(total_items < 0)
{
printf("%s %d Error at layer %d: %d", __FUNCSIG__, __LINE__, i, GetLastError());
return false;
}
if(!m_lstPTModel.AddItem(StringFormat("____ Layer %d ____", i + 1), i + 1))
return false;
for(int it = 0; it < total_items; it++)
if(!m_lstPTModel.AddItem(items[it], i + 1))
return false;
}
m_spPTModelLayers.MaxValue(total);
m_spPTModelLayers.Value(total);
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string CNetCreatorPanel::LayerTypeToString(int type)
{
string result = "Unknown";
switch(type)
{
case defNeuronBaseOCL:
result = "Dense";
break;
case defNeuronConvOCL:
result = "Conolution";
break;
case defNeuronProofOCL:
result = "Proof";
break;
case defNeuronAttentionOCL:
result = "Self Attention";
break;
case defNeuronMHAttentionOCL:
result = "Multi-Head Attention";
break;
case defNeuronMLMHAttentionOCL:
result = "Multi-Layer MH Attention";
break;
case defNeuronDropoutOCL:
result = "Dropout";
break;
case defNeuronBatchNormOCL:
result = "Batchnorm";
break;
case defNeuronVAEOCL:
result = "VAE";
break;
case defNeuronLSTMOCL:
result = "LSTM";
break;
case defNeuronSoftMaxOCL:
result = "SoftMax";
break;
case defNeuronFQF:
result = "FQF";
break;
default:
result = StringFormat("%s %#x", result, type);
break;
}
//---
return result;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CNetCreatorPanel::LayerDescriptionToString(const CLayerDescription *layer, string& result[])
{
if(!layer)
return -1;
//---
string temp;
ArrayFree(result);
switch(layer.type)
{
case defNeuronBaseOCL:
temp = StringFormat("Dense (outputs %d, \activation %s, \optimization %s)", layer.count, EnumToString(layer.activation), EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronConvOCL:
temp = StringFormat("Conolution (outputs %d, \window %d, step %d, window out %d, \activation %s, \optimization %s)", layer.count * layer.window_out, layer.window, layer.step, layer.window_out, EnumToString(layer.activation), EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronProofOCL:
temp = StringFormat("Proof (outputs %d, \window %d, step %d, \optimization %s)", layer.count, layer.window, layer.step, EnumToString(layer.activation), EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronAttentionOCL:
temp = StringFormat("Self Attention (outputs %d, \units %d, window %d, \optimization %d)", layer.count * layer.window, layer.count, layer.window, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronMHAttentionOCL:
temp = StringFormat("Multi-Head Attention (outputs %d, \units %d, window %d, heads %d, \optimization %s)", layer.count * layer.window, layer.count, layer.window, layer.step, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronMLMHAttentionOCL:
temp = StringFormat("Multi-Layer MH Attention (outputs %d, \units %d, window %d, key size %d, \heads %d, layers %d, \optimization %s)", layer.count * layer.window, layer.count, layer.window, layer.window_out, layer.step, layer.layers, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronDropoutOCL:
temp = StringFormat("Dropout (outputs %d, \probability %d, \optimization %s)", layer.count, layer.probability, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronBatchNormOCL:
temp = StringFormat("Batchnorm (outputs %d, \batch size %d, \optimization %s)", layer.count, layer.batch, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronVAEOCL:
temp = StringFormat("VAE (outputs %d)", layer.count);
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronLSTMOCL:
temp = StringFormat("LSTM (outputs %d, \optimization %s)", layer.count, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronSoftMaxOCL:
temp = StringFormat("SoftMax (outputs %d, heads %d)", layer.count, layer.step);
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
case defNeuronFQF:
temp = StringFormat("FQF (outputs %d, quantiles %d, \optimization %s))", layer.count, layer.window_out, EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
default:
temp = StringFormat("Unknown type %#x (outputs %d, \activation %s, \optimization %s)", layer.type, layer.count, EnumToString(layer.activation), EnumToString(layer.optimization));
if(StringSplit(temp, '\\', result) < 0)
return -1;
break;
}
//---
return ArraySize(result);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::ChangeNumberOfLayers(void)
{
int total = m_spPTModelLayers.Value();
m_lstPTModel.SelectByValue(total);
//---
m_lstNewModel.ItemsClear();
for(int i = 0; i < total; i++)
{
CLayerDescription* temp = m_arPTModelDescription.At(i);
if(!temp)
return false;
//---
string items[];
int total_items = LayerDescriptionToString(temp, items);
if(total_items < 0)
{
printf("%s %d Error at layer %d: %d", __FUNCSIG__, __LINE__, i, GetLastError());
return false;
}
if(!m_lstNewModel.AddItem(StringFormat("____ Layer %d ____", i + 1), i + 1))
return false;
for(int it = 0; it < total_items; it++)
if(!m_lstNewModel.AddItem(items[it], i + 1))
return false;
}
//---
int shift = total;
total = m_arAddLayers.Total();
for(int i = 0; i < total; i++)
{
CLayerDescription* temp = m_arAddLayers.At(i);
if(!temp)
return false;
//---
string items[];
int total_items = LayerDescriptionToString(temp, items);
if(total_items < 0)
{
printf("%s %d Error at layer %d: %d", __FUNCSIG__, __LINE__, i, GetLastError());
return false;
}
if(!m_lstNewModel.AddItem(StringFormat("____ Layer %d ____", shift + i + 1), shift + i + 1))
return false;
for(int it = 0; it < total_items; it++)
if(!m_lstNewModel.AddItem(items[it], shift + i + 1))
return false;
}
m_lstNewModel.SelectByValue(shift + total);
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CLabel* CNetCreatorPanel::CreateLabel(const int id, const string text, const int x1, const int y1, const int x2, const int y2)
{
CLabel *tmp_label = new CLabel();
if(!tmp_label)
return NULL;
if(!tmp_label.Create(m_chart_id, StringFormat("%s%d", LABEL_NAME, id), m_subwin, x1, y1, x2, y2))
{
delete tmp_label;
return NULL;
}
if(!tmp_label.Text(text))
{
delete tmp_label;
return NULL;
}
if(!Add(tmp_label))
{
delete tmp_label;
return NULL;
}
//---
return tmp_label;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::CreateEdit(const int id, CEdit& object, const int x1, const int y1, const int x2, const int y2, bool read_only)
{
if(!object.Create(m_chart_id, StringFormat("%s%d", EDIT_NAME, id), m_subwin, x1, y1, x2, y2))
return false;
if(!object.TextAlign(ALIGN_RIGHT))
return false;
if(!EditReedOnly(object, read_only))
return false;
if(!Add(object))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::EditReedOnly(CEdit& object, const bool flag)
{
if(!object.ReadOnly(flag))
return false;
if(!object.ColorBackground(flag ? CONTROLS_DIALOG_COLOR_CLIENT_BG : CONTROLS_EDIT_COLOR_BG))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::CreateComboBoxType(const int x1, const int y1, const int x2, const int y2)
{
if(!m_cbNewNeuronType.Create(m_chart_id, "cbNewNeuronType", m_subwin, x1, y1, x2, y2))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronBaseOCL), defNeuronBaseOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronConvOCL), defNeuronConvOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronProofOCL), defNeuronProofOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronLSTMOCL), defNeuronLSTMOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronAttentionOCL), defNeuronAttentionOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronMHAttentionOCL), defNeuronMHAttentionOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronMLMHAttentionOCL), defNeuronMLMHAttentionOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronDropoutOCL), defNeuronDropoutOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronBatchNormOCL), defNeuronBatchNormOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronVAEOCL), defNeuronVAEOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronSoftMaxOCL), defNeuronSoftMaxOCL))
return false;
if(!m_cbNewNeuronType.ItemAdd(LayerTypeToString(defNeuronFQF), defNeuronFQF))
return false;
if(!Add(m_cbNewNeuronType))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::CreateComboBoxActivation(const int x1, const int y1, const int x2, const int y2)
{
if(!m_cbActivation.Create(m_chart_id, "cbNewNeuronActivation", m_subwin, x1, y1, x2, y2))
return false;
if(!ActivationListMain())
return false;
if(!Add(m_cbActivation))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::ActivationListMain(void)
{
if(!m_cbActivation.ItemsClear())
return false;
for(int i = -1; i < 3; i++)
if(!m_cbActivation.ItemAdd(EnumToString((ENUM_ACTIVATION)i), i + 2))
return false;
if(!m_cbActivation.SelectByValue((int)DEFAULT_ACTIVATION + 2))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::ActivationListEmpty(void)
{
if(!m_cbActivation.ItemsClear() || !m_cbActivation.ItemAdd(EnumToString((ENUM_ACTIVATION) - 1), 1))
return false;
if(!m_cbActivation.SelectByValue((int) 1))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::CreateComboBoxOptimization(const int x1, const int y1, const int x2, const int y2)
{
if(!m_cbOptimization.Create(m_chart_id, "cbNewNeuronOptimization", m_subwin, x1, y1, x2, y2))
return false;
for(int i = 0; i < 3; i++)
if(!m_cbOptimization.ItemAdd(EnumToString((ENUM_OPTIMIZATION)i), i + 2))
return false;
if(!m_cbOptimization.SelectByValue((int)DEFAULT_OPTIMIZATION + 2))
return false;
if(!Add(m_cbOptimization))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnChangeListPTModel(void)
{
long value = m_lstPTModel.Value();
//---
return m_spPTModelLayers.Value((int)value);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnChangeListNewModel(void)
{
long value = m_lstNewModel.Value();
//---
return m_lstNewModel.SelectByValue(value);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnClickAddButton(void)
{
int type = (int)m_cbNewNeuronType.Value();
if(StringFind(LayerTypeToString(type), "Unknown", 0) >= 0)
{
Print("Wrong type of new layer");
return false;
}
//---
int count = (int)StringToInteger(m_edCount.Text());
if(count <= 0)
{
Print("Layer don't have neurons");
return false;
}
//---
CLayerDescription *desc = new CLayerDescription();
if(!desc)
{
Print("Error of create description object: %d", GetLastError());
return false;
}
desc.type = type;
desc.count = count;
desc.activation = (ENUM_ACTIVATION)(m_cbActivation.Value() - 2);
desc.optimization = (ENUM_OPTIMIZATION)(m_cbOptimization.Value() - 2);
desc.batch = (int)StringToInteger(m_edBatch.Text());
desc.layers = (int)StringToInteger(m_edLayers.Text());
string text = m_edProbability.Text();
StringReplace(text, ",", ".");
StringReplace(text, " ", "");
desc.probability = (float)StringToDouble(text);
desc.step = (int)StringToInteger(m_edStep.Text());
desc.window = (int)StringToInteger(m_edWindow.Text());
desc.window_out = (int)StringToInteger(m_edWindowOut.Text());
//---
if(!m_arAddLayers.Add(desc))
{
Print("Error of adding description: %d", GetLastError());
return false;
}
//---
return ChangeNumberOfLayers();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnClickDeleteButton(void)
{
int shift = m_spPTModelLayers.Value();
int position = (int)m_lstNewModel.Value() - 1;
//---
if(position < 0)
{
Print("Layer not select");
return false;
}
//---
position -= shift;
if(position < 0)
{
Print("You can delete only added layers");
return false;
}
//---
if(!m_arAddLayers.Delete(position))
{
PrintFormat("Error of remove layer: %d", GetLastError());
return false;
}
//---
return ChangeNumberOfLayers();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnClickSaveButton(void)
{
string filenames[];
if(FileSelectDialog("Выберите файлы для сохранения", NULL,
"Neuron Net (*.nnw;*.inv;*.fwd)|*.nnw;*.inv;*.fwd|All files (*.*)|*.*",
FSD_WRITE_FILE | (b_UseCommonDirectory ? FSD_COMMON_FOLDER : NULL), filenames, "NewModel.nnw") <= 0)
{
Print("File not selected");
return false;
}
//---
string file_name = filenames[0];
if(StringLen(file_name) - StringLen(EXTENSION) > StringFind(file_name, "."))
file_name += EXTENSION;
CNetModify* new_model = new CNetModify();
if(!new_model)
return false;
int total = m_spPTModelLayers.Value();
if(total > 0 && !m_Model.TrainMode(false))
return false;
bool result = true;
for(int i = 0; i < total && result; i++)
{
if(!new_model.AddLayer(m_Model.GetLayer((uint)i)))
result = false;
}
//---
new_model.SetOpenCL(m_Model.GetOpenCL());
if(result && m_arAddLayers.Total() > 0)
if(!new_model.AddLayers(GetPointer(m_arAddLayers)))
result = false;
//---
if(result && !new_model.Save(file_name, 1.0e37f, 100, 0, 0, b_UseCommonDirectory))
result = false;
//---
if(!!new_model)
delete new_model;
LoadModel(m_edPTModel.Text());
//---
return result;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CNetCreatorPanel::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
CAppDialog::ChartEvent(id, lparam, dparam, sparam);
if(id == CHARTEVENT_KEYDOWN && m_spPTModelLayers.IsVisible())
{
switch((int)lparam)
{
case KEY_UP:
EventChartCustom(CONTROLS_SELF_MESSAGE, ON_CLICK, m_spPTModelLayers.Id() + 2, 0.0, m_spPTModelLayers.Name() + "Inc");
break;
case KEY_DOWN:
EventChartCustom(CONTROLS_SELF_MESSAGE, ON_CLICK, m_spPTModelLayers.Id() + 3, 0.0, m_spPTModelLayers.Name() + "Dec");
break;
case KEY_DELETE:
EventChartCustom(CONTROLS_SELF_MESSAGE, ON_CLICK, m_btDeleteLayer.Id(), 0.0, m_btDeleteLayer.Name());
break;
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnChangeNeuronType(void)
{
long type = m_cbNewNeuronType.Value();
switch((int)type)
{
case defNeuronBaseOCL:
if(!EditReedOnly(m_edCount, false) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!ActivationListMain())
return false;
break;
case defNeuronConvOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, false) ||
!EditReedOnly(m_edWindow, false) ||
!EditReedOnly(m_edWindowOut, false))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!m_lbStepHeads.Text("Step"))
return false;
if(!m_lbWindowOut.Text("Window Out"))
return false;
if(!ActivationListMain())
return false;
if(!SetCounts(defNeuronConvOCL))
return false;
break;
case defNeuronProofOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, false) ||
!EditReedOnly(m_edWindow, false) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!m_lbStepHeads.Text("Step"))
return false;
if(!SetCounts(defNeuronProofOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronLSTMOCL:
if(!EditReedOnly(m_edCount, false) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronDropoutOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, false) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!SetCounts(defNeuronDropoutOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronBatchNormOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, false) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!SetCounts(defNeuronBatchNormOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronAttentionOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, false) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!SetCounts(defNeuronAttentionOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronMHAttentionOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, false) ||
!EditReedOnly(m_edWindow, false) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!m_lbStepHeads.Text("Heads"))
return false;
if(!SetCounts(defNeuronMHAttentionOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronMLMHAttentionOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, false) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, false) ||
!EditReedOnly(m_edWindow, false) ||
!EditReedOnly(m_edWindowOut, false))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!m_lbStepHeads.Text("Heads"))
return false;
if(!m_lbWindowOut.Text("Keys size"))
return false;
if(!SetCounts(defNeuronMLMHAttentionOCL))
return false;
if(!ActivationListEmpty())
return false;
break;
case defNeuronVAEOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!ActivationListEmpty())
return false;
if(!SetCounts(defNeuronVAEOCL))
return false;
break;
case defNeuronSoftMaxOCL:
if(!EditReedOnly(m_edCount, true) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, false) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, true))
return false;
if(!m_lbCount.Text("Neurons"))
return false;
if(!m_lbStepHeads.Text("Heads"))
return false;
if(!m_edStep.Text("1"))
return false;
if(!ActivationListEmpty())
return false;
if(!SetCounts(defNeuronSoftMaxOCL))
return false;
break;
case defNeuronFQF:
if(!EditReedOnly(m_edCount, false) ||
!EditReedOnly(m_edBatch, true) ||
!EditReedOnly(m_edLayers, true) ||
!EditReedOnly(m_edProbability, true) ||
!EditReedOnly(m_edStep, true) ||
!EditReedOnly(m_edWindow, true) ||
!EditReedOnly(m_edWindowOut, false))
return false;
if(!m_lbWindowOut.Text("Quantiles"))
return false;
if(!m_edWindowOut.Text("32"))
return false;
if(!m_lbCount.Text("Actions"))
return false;
if(!m_edCount.Text("3"))
return false;
if(!ActivationListEmpty())
return false;
if(!SetCounts(defNeuronFQF))
return false;
break;
default:
return false;
break;
}
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::SetCounts(const uint type)
{
const uint position = m_arAddLayers.Total();
CLayerDescription *prev;
if(position <= 0)
{
if(!m_arPTModelDescription || m_spPTModelLayers.Value() <= 0)
return false;
prev = m_arPTModelDescription.At(m_spPTModelLayers.Value() - 1);
}
//---
else
{
if(m_arAddLayers.Total() < (int)position)
return false;
prev = m_arAddLayers.At(position - 1);
}
if(!prev)
return false;
//---
uint outputs = prev.count;
switch(prev.type)
{
case defNeuronAttentionOCL:
case defNeuronMHAttentionOCL:
case defNeuronMLMHAttentionOCL:
outputs *= prev.window;
break;
case defNeuronConvOCL:
outputs *= prev.window_out;
break;
}
//---
if(outputs <= 0)
return false;
//---
uint counts = 0;
int window = (int)StringToInteger(m_edWindow.Text());
int step = (int)StringToInteger(m_edStep.Text());
switch(type)
{
case defNeuronConvOCL:
case defNeuronProofOCL:
if(step <= 0)
break;
counts = (outputs - window - 1 + 2 * step) / step;
break;
case defNeuronAttentionOCL:
case defNeuronMHAttentionOCL:
case defNeuronMLMHAttentionOCL:
if(window <= 0)
break;
counts = (outputs + window - 1) / window;
break;
case defNeuronVAEOCL:
counts = outputs / 2;
break;
case defNeuronSoftMaxOCL:
counts = outputs / step;
break;
case defNeuronFQF:
return true;
default:
counts = outputs;
break;
}
//---
return m_edCount.Text((string)counts);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnChangeWindowStep(void)
{
if(!OnEndEdit(m_edWindow) || !OnEndEdit(m_edStep))
return false;
return SetCounts((uint)m_cbNewNeuronType.Value());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnEndEdit(CEdit& object)
{
long value = StringToInteger(object.Text());
return object.Text((string)fmax(1, value));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CNetCreatorPanel::OnEndEditProbability(void)
{
double value = StringToDouble(m_edProbability.Text());
return m_edProbability.Text(DoubleToString(fmax(0, fmin(1, value)), 2));
}
//+------------------------------------------------------------------+