195 lines
15 KiB
MQL5
195 lines
15 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ArrayLayers.mqh |
|
|
//| Copyright 2021, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2021, MetaQuotes Ltd."
|
|
#property link "https://www.mql5.com"
|
|
//+------------------------------------------------------------------+
|
|
//| Костанты класса |
|
|
//+------------------------------------------------------------------+
|
|
#define ArrayLayers CArrayLayers
|
|
//+------------------------------------------------------------------+
|
|
//| Подключаем классы нейронных слоёв |
|
|
//+------------------------------------------------------------------+
|
|
#include <Arrays\ArrayObj.mqh>
|
|
#include "neuronconv.mqh"
|
|
#include "neuronlstm.mqh"
|
|
#include "neuronattention.mqh"
|
|
#include "neuronmhattention.mqh"
|
|
#include "neurondropout.mqh"
|
|
#include "neuronbatchnorm.mqh"
|
|
//+------------------------------------------------------------------+
|
|
//| Class CArrayLayers |
|
|
//| Назначение: Класс динамического массива коллекции нейронных слоёв|
|
|
//+------------------------------------------------------------------
|
|
class CArrayLayers : public CArrayObj
|
|
{
|
|
protected:
|
|
CMyOpenCL *m_cOpenCL;
|
|
int m_iFileHandle;
|
|
public:
|
|
CArrayLayers(int file_handle = INVALID_HANDLE)
|
|
{ m_cOpenCL = NULL; m_iFileHandle = file_handle; }
|
|
~CArrayLayers(void) {};
|
|
//---
|
|
virtual bool SetOpencl(CMyOpenCL *opencl);
|
|
virtual bool Load(const int file_handle);
|
|
//--- method of creating an element of array
|
|
virtual bool CreateElement(const int index);
|
|
virtual bool CreateElement(const int index, CLayerDescription *description);
|
|
//--- method of identifying the object
|
|
virtual int Type(void) const { return(defArrayLayers); }
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Модель GPT использует данный класс для организации внутренних |
|
|
//| нейроных слоёв. Поэтому данный слой подключаем после объявления |
|
|
//| класса |
|
|
//+------------------------------------------------------------------+
|
|
#include "neurongpt.mqh"
|
|
//+------------------------------------------------------------------+
|
|
//| Метод создания элемента динамического массива |
|
|
//+------------------------------------------------------------------+
|
|
bool CArrayLayers::CreateElement(const int index)
|
|
{
|
|
//--- Блок проверки исходных данных
|
|
if(index < 0 || m_iFileHandle == INVALID_HANDLE)
|
|
return false;
|
|
//--- Резервированиие элемента массива под новый объект
|
|
if(!Reserve(index + 1))
|
|
return false;
|
|
//--- Считываем из файла тип нужного объекта и создаём соответсвующий нейронный слой
|
|
CNeuronBase *temp = NULL;
|
|
int type = FileReadInteger(m_iFileHandle);
|
|
switch(type)
|
|
{
|
|
case defNeuronBase:
|
|
temp = new CNeuronBase();
|
|
break;
|
|
case defNeuronConv:
|
|
temp = new CNeuronConv();
|
|
break;
|
|
case defNeuronProof:
|
|
temp = new CNeuronProof();
|
|
break;
|
|
case defNeuronLSTM:
|
|
temp = new CNeuronLSTM();
|
|
break;
|
|
case defNeuronAttention:
|
|
temp = new CNeuronAttention();
|
|
break;
|
|
case defNeuronMHAttention:
|
|
temp = new CNeuronMHAttention();
|
|
break;
|
|
case defNeuronGPT:
|
|
temp = new CNeuronGPT();
|
|
break;
|
|
case defNeuronDropout:
|
|
temp = new CNeuronDropout();
|
|
break;
|
|
case defNeuronBatchNorm:
|
|
temp = new CNeuronBatchNorm();
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
//--- Контроль создания нового объекта
|
|
if(CheckPointer(temp) == POINTER_INVALID)
|
|
return false;
|
|
//--- Добавляем указатель на созданный объект в массив
|
|
if(CheckPointer(m_data[index]) != POINTER_INVALID)
|
|
delete m_data[index];
|
|
temp.SetOpenCL(m_cOpenCL);
|
|
m_data[index] = temp;
|
|
//---
|
|
return true;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Метод создания элемента динамического массива |
|
|
//+------------------------------------------------------------------+
|
|
bool CArrayLayers::CreateElement(const int index, CLayerDescription *description)
|
|
{
|
|
//--- Блок проверки исходных данных
|
|
if(index < 0 || CheckPointer(description) == POINTER_INVALID)
|
|
return false;
|
|
//--- Резервированиие элемента массива под новый объект
|
|
if(!Reserve(index + 1))
|
|
return false;
|
|
//--- Создаём соответсвующий нейронный слой
|
|
CNeuronBase *temp = NULL;
|
|
switch(description.type)
|
|
{
|
|
case defNeuronBase:
|
|
temp = new CNeuronBase();
|
|
break;
|
|
case defNeuronConv:
|
|
temp = new CNeuronConv();
|
|
break;
|
|
case defNeuronProof:
|
|
temp = new CNeuronProof();
|
|
break;
|
|
case defNeuronLSTM:
|
|
temp = new CNeuronLSTM();
|
|
break;
|
|
case defNeuronAttention:
|
|
temp = new CNeuronAttention();
|
|
break;
|
|
case defNeuronMHAttention:
|
|
temp = new CNeuronMHAttention();
|
|
break;
|
|
case defNeuronGPT:
|
|
temp = new CNeuronGPT();
|
|
break;
|
|
case defNeuronDropout:
|
|
temp = new CNeuronDropout();
|
|
break;
|
|
case defNeuronBatchNorm:
|
|
temp = new CNeuronBatchNorm();
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
//--- Контроль создания нового объекта
|
|
if(CheckPointer(temp) == POINTER_INVALID)
|
|
return false;
|
|
//--- Добавляем указатель на созданный объект в массив
|
|
if(!temp.Init(description))
|
|
return false;
|
|
if(CheckPointer(m_data[index]) != POINTER_INVALID)
|
|
delete m_data[index];
|
|
temp.SetOpenCL(m_cOpenCL);
|
|
m_data[index] = temp;
|
|
m_data_total = fmax(m_data_total, index + 1);
|
|
//---
|
|
return true;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Метод передачи указателя на контекст OpenCL |
|
|
//+------------------------------------------------------------------+
|
|
bool CArrayLayers::SetOpencl(CMyOpenCL *opencl)
|
|
{
|
|
//--- Блок проверки исходных данных
|
|
if(CheckPointer(m_cOpenCL) != POINTER_INVALID)
|
|
delete m_cOpenCL;
|
|
m_cOpenCL = opencl;
|
|
//--- Передача указателя во все элементы массива
|
|
for(int i = 0; i < m_data_total; i++)
|
|
{
|
|
if(CheckPointer(m_data[i]) == POINTER_INVALID)
|
|
return false;
|
|
CNeuronBase *temp = m_data[i];
|
|
if(!temp.SetOpenCL(m_cOpenCL))
|
|
return false;
|
|
}
|
|
//---
|
|
return(CheckPointer(m_cOpenCL) != POINTER_INVALID);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Метод считывания динамического массива из файла |
|
|
//+------------------------------------------------------------------+
|
|
bool CArrayLayers::Load(const int file_handle)
|
|
{
|
|
m_iFileHandle = file_handle;
|
|
return CArrayObj::Load(file_handle);
|
|
}
|
|
//+------------------------------------------------------------------+
|