Original_NNB/MQL5/Include/NeuroNetworksBook/realization/positionencoder.mqh
super.admin e81e22b7b8 convert
2025-05-30 16:15:14 +02:00

122 lines
9.3 KiB
MQL5

//+------------------------------------------------------------------+
//| positionencoder.mqh |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| Подключаем библиотеки |
//+------------------------------------------------------------------+
#include "bufferdouble.mqh"
//+------------------------------------------------------------------+
//| Class CPositionEncoder |
//| Назначение: Класс позиционного кодированиия |
//+------------------------------------------------------------------+
class CPositionEncoder : public CBufferDouble
{
protected:
uint m_iCount;
uint m_iDimension;
public:
CPositionEncoder(void) {};
~CPositionEncoder(void) {};
//---
virtual bool InitEncoder(uint count, uint dimension); // Метод инициализации
virtual bool AddEncoder(CBufferDouble *&buffer); // Метод добавление позиционного коирования к исходным данным
//--- Метод работы с файлами
virtual bool Save(const int file_handle);
virtual bool Load(const int file_handle);
};
//+------------------------------------------------------------------+
//| Метод инициализации |
//+------------------------------------------------------------------+
bool CPositionEncoder::InitEncoder(uint count, uint dimension)
{
//--- Сожраняем 5константы
m_iCount = count;
m_iDimension = dimension;
m_data_total = (int)(count * dimension);
//--- Подготовка буфера
if(ArrayResize(m_data, m_data_total) < m_data_total)
{
m_data_total = 0;
return false;
}
m_data_max = m_data_total;
//--- Заполнение буфера метками позиционного кодирования
for(int i = 0; i < (int)count; i++)
{
for(int d = 0; d < (int)dimension; d++)
{
int pos = i * (int)dimension + d;
double value = i / pow(1000, 2 * d / dimension);
switch(d % 2)
{
case 0:
m_data[pos]
= MathSin(value);
break;
case 1:
m_data[pos] = MathCos(value);
break;
}
}
}
//--- Создание буфера в контексте OpenCL
if(CheckPointer(m_cOpenCL) != POINTER_INVALID)
BufferCreate(m_cOpenCL);
//---
return true;
}
//+------------------------------------------------------------------+
//| Метод добавление позиционного колирования к исходным данным |
//+------------------------------------------------------------------+
bool CPositionEncoder::AddEncoder(CBufferDouble *&buffer)
{
//--- Блок контролей
if(CheckPointer(buffer) == POINTER_INVALID)
return false;
if(buffer.Total() > m_data_total)
if(!InitEncoder(1,buffer.Total()))
return false;
//--- Добавляем метки к буферу исходных данных
double result[];
int total = buffer.Total();
if(ArrayResize(result, total) < total)
return false;
for(int i = 0; i < total; i++)
buffer.m_data[i] += m_data[i];
//---
return true;
}
//+------------------------------------------------------------------+
//| Метод сохранения элементов класса в файл |
//+------------------------------------------------------------------+
bool CPositionEncoder::Save(const int file_handle)
{
//--- Блок контролей
if(file_handle == INVALID_HANDLE)
return false;
//--- Сохранение констант
if(!FileWriteInteger(file_handle, (int)m_iCount) ||
!FileWriteInteger(file_handle, (int)m_iDimension))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
//| Метод восстановления класса из сохранённых данных |
//+------------------------------------------------------------------+
bool CPositionEncoder::Load(const int file_handle)
{
//--- Блок контролей
if(file_handle == INVALID_HANDLE)
return false;
//--- Считываем константы
m_iCount = (uint)FileReadInteger(file_handle);
m_iDimension = (uint)FileReadInteger(file_handle);
//---
return InitEncoder(m_iCount, m_iDimension);
}
//+------------------------------------------------------------------+