forked from kelmut/NeuroBook
111 lines
8.7 KiB
MQL5
111 lines
8.7 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| positionencoder.mqh |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#property copyright "Copyright 2021, MetaQuotes Ltd."
| |
#property link "https://www.mql5.com"
| |
//+------------------------------------------------------------------+
| |
//| Connect libraries |
| |
//+------------------------------------------------------------------+
| |
#include "buffer.mqh"
| |
//+------------------------------------------------------------------+
| |
//| Class CPositionEncoder |
| |
//| Purpose: Positional encoding class |
| |
//+------------------------------------------------------------------+
| |
class CPositionEncoder : public CBufferType
| |
{
| |
protected:
| |
ulong m_iCount;
| |
ulong m_iDimension;
| |
public:
| |
CPositionEncoder(void) {};
| |
~CPositionEncoder(void) {};
| |
//---
| |
virtual bool InitEncoder(ulong count, ulong dimension); // Initialization method
| |
virtual bool AddEncoder(CBufferType *&buffer); // Method for adding positional copying to input data
| |
//--- File handling method
| |
virtual bool Save(const int file_handle);
| |
virtual bool Load(const int file_handle);
| |
};
| |
//+------------------------------------------------------------------+
| |
//| Initialization method |
| |
//+------------------------------------------------------------------+
| |
bool CPositionEncoder::InitEncoder(ulong count, ulong dimension)
| |
{
| |
//--- Save constants
| |
m_iCount = count;
| |
m_iDimension = dimension;
| |
//--- Prepare buffer
| |
if(!m_mMatrix.Resize(count, dimension))
| |
return false;
| |
//--- Fill buffer with positional encoding labels
| |
for(int r = 0; r < (int)count; r++)
| |
{
| |
for(int c = 0; c < (int)dimension; c++)
| |
{
| |
TYPE value = (TYPE)(r / pow(1000, 2 * c / dimension));
| |
switch(c % 2)
| |
{
| |
case 0:
| |
m_mMatrix[r, c] = (TYPE)MathSin(value);
| |
break;
| |
case 1:
| |
m_mMatrix[r, c] = (TYPE)MathCos(value);
| |
break;
| |
}
| |
}
| |
}
| |
//--- Create a buffer in the OpenCL context
| |
if(m_cOpenCL)
| |
BufferCreate(m_cOpenCL);
| |
//---
| |
return true;
| |
}
| |
//+------------------------------------------------------------------+
| |
//| Method for adding positional encoding to input data |
| |
//+------------------------------------------------------------------+
| |
bool CPositionEncoder::AddEncoder(CBufferType *&buffer)
| |
{
| |
//--- Control block
| |
if(!buffer)
| |
return false;
| |
if(buffer.m_mMatrix.Rows() != m_mMatrix.Rows() ||
| |
buffer.m_mMatrix.Cols() != m_mMatrix.Cols())
| |
if(!InitEncoder(buffer.m_mMatrix.Rows(), buffer.m_mMatrix.Cols()))
| |
return false;
| |
//--- Add labels to input data buffer
| |
buffer.m_mMatrix += m_mMatrix;
| |
//---
| |
return true;
| |
}
| |
//+------------------------------------------------------------------+
| |
//| Method for saving class elements to a file |
| |
//+------------------------------------------------------------------+
| |
bool CPositionEncoder::Save(const int file_handle)
| |
{
| |
//--- Control block
| |
if(file_handle == INVALID_HANDLE)
| |
return false;
| |
//--- Save constants
| |
if(!FileWriteInteger(file_handle, (int)m_iCount) ||
| |
!FileWriteInteger(file_handle, (int)m_iDimension))
| |
return false;
| |
//---
| |
return true;
| |
}
| |
//+------------------------------------------------------------------+
| |
//| Method for restoring the class from saved data |
| |
//+------------------------------------------------------------------+
| |
bool CPositionEncoder::Load(const int file_handle)
| |
{
| |
//--- Control block
| |
if(file_handle == INVALID_HANDLE)
| |
return false;
| |
//--- Read constants
| |
m_iCount = (uint)FileReadInteger(file_handle);
| |
m_iDimension = (uint)FileReadInteger(file_handle);
| |
//---
| |
return InitEncoder(m_iCount, m_iDimension);
| |
}
| |
//+------------------------------------------------------------------+
|