NeuroNetworksBook/Include/realization/arraylayers.mqh
super.admin 4a9222852c convert
2025-05-30 16:12:34 +02:00

198 lines
14 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 "neuronbase.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(!temp)
return false;
//--- Добавляем указатель на созданный объект в массив
if(m_data[index])
delete m_data[index];
temp.SetOpenCL(m_cOpenCL);
m_data[index] = temp;
//---
return true;
}
//+------------------------------------------------------------------+
//| Метод создания элемента динамического массива |
//+------------------------------------------------------------------+
bool CArrayLayers::CreateElement(const int index, CLayerDescription *desc)
{
//--- Блок проверки исходных данных
if(index < 0 || !desc)
return false;
//--- Резервированиие элемента массива под новый объект
if(!Reserve(index + 1))
return false;
//--- Создаём соответсвующий нейронный слой
CNeuronBase *temp = NULL;
switch(desc.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(!temp)
return false;
//--- Добавляем указатель на созданный объект в массив
if(!temp.Init(desc))
return false;
if(m_data[index])
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(m_cOpenCL)
delete m_cOpenCL;
m_cOpenCL = opencl;
//--- Передача указателя во все элементы массива
for(int i = 0; i < m_data_total; i++)
{
if(!m_data[i])
return false;
if(!((CNeuronBase *)m_data[i]).SetOpenCL(m_cOpenCL))
return false;
}
//---
return(!!m_cOpenCL);
}
//+------------------------------------------------------------------+
//| Метод считывания динамического массива из файла |
//+------------------------------------------------------------------+
bool CArrayLayers::Load(const int file_handle)
{
m_iFileHandle = file_handle;
return CArrayObj::Load(file_handle);
}
//+------------------------------------------------------------------+