516 lines
28 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| NeuroNet_InferenceSnapshot.mqh |
| |||
//| Copyright 2026, DNG |
| |||
//| https://www.mql5.com/ru/users/dng |
| |||
//+------------------------------------------------------------------+
| |||
#ifndef NEURONET_INFERENCE_SNAPSHOT_WORK_MQH
| |||
#define NEURONET_INFERENCE_SNAPSHOT_WORK_MQH
| |||
//--- Restricted native frozen-inference state path. Ordinary Load bytes/reset unchanged.
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeLoadActive |
| |||
//+------------------------------------------------------------------+
| |||
bool COpenCLMy::InferenceRuntimeLoadActive(void) const
| |||
{
| |||
return(CheckPointer(m_inference_owner) != POINTER_INVALID
| |||
&& m_inference_owner.InferenceRuntimeLoadActive(GetPointer(this)));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| NNInferenceRemaining |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceRemaining(const int handle, const ulong required)
| |||
{
| |||
if(handle == INVALID_HANDLE)
| |||
return(false);
| |||
const ulong position=FileTell(handle);
| |||
const ulong size=FileSize(handle);
| |||
return(position <= size && required <= size - position);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| NNInferenceHeader |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceHeader(const int handle, const bool restore, const uint value)
| |||
{
| |||
if(handle == INVALID_HANDLE)
| |||
return(false);
| |||
if(restore)
| |||
return(NNInferenceRemaining(handle, 4) && (uint)FileReadInteger(handle) == value);
| |||
return(FileWriteInteger(handle, (int)value) == 4);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| NNInferenceFinite |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceFinite(CBufferFloat *buffer)
| |||
{
| |||
if(buffer == NULL)
| |||
return(true);
| |||
if(CheckPointer(buffer) == POINTER_INVALID)
| |||
return(false);
| |||
if(buffer.Total() == 0)
| |||
return(true);
| |||
if(buffer.Total() < 0)
| |||
return(false);
| |||
if(buffer.GetIndex() >= 0)
| |||
{
| |||
COpenCLMy *receiver = dynamic_cast<COpenCLMy*>(buffer.GetOpenCL());
| |||
if(!receiver || receiver.GetBufferSize(buffer.GetIndex()) != (ulong)buffer.Total() * sizeof(float))
| |||
return(false);
| |||
if(!buffer.BufferRead())
| |||
return(false);
| |||
}
| |||
for(int i = 0; i < buffer.Total(); i++)
| |||
if(!MathIsValidNumber((double)(*buffer)[i]))
| |||
return(false);
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Validate an optional finite buffer |
| |||
//+------------------------------------------------------------------+
| |||
//--- CNeuronBaseOCL::Load uses DeleteObj for absent parameter buffers but does not null the pointer.
| |||
bool NNInferenceOptionalFinite(CBufferFloat *buffer)
| |||
{
| |||
return(buffer == NULL || CheckPointer(buffer) == POINTER_INVALID || NNInferenceFinite(buffer));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| NNInferenceOmittedBuffer |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceOmittedBuffer(const int handle, const bool restore, CBufferFloat *buffer)
| |||
{
| |||
if(buffer == NULL || CheckPointer(buffer) == POINTER_INVALID || buffer.Total() <= 0 || !buffer.GetOpenCL() || buffer.GetIndex() < 0
| |||
|| !NNInferenceHeader(handle, restore, (uint)buffer.Total()))
| |||
return(false);
| |||
if(!restore)
| |||
{
| |||
if(!NNInferenceFinite(buffer))
| |||
return(false);
| |||
for(int i = 0; i < buffer.Total(); i++)
| |||
if(FileWriteFloat(handle, (*buffer)[i]) != 4)
| |||
return(false);
| |||
return(true);
| |||
}
| |||
if(!NNInferenceRemaining(handle, (ulong)buffer.Total() * 4))
| |||
return(false);
| |||
float values[];
| |||
if(ArrayResize(values, buffer.Total()) != buffer.Total())
| |||
return(false);
| |||
for(int i = 0; i < buffer.Total(); i++)
| |||
{
| |||
values[i] = FileReadFloat(handle);
| |||
if(!MathIsValidNumber((double)values[i]))
| |||
return(false);
| |||
}
| |||
for(int i = 0; i < buffer.Total(); i++)
| |||
buffer.Update(i, values[i]);
| |||
return(buffer.BufferWrite());
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| Function NNInferenceRequired |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceRequired(CBufferFloat *buffer, COpenCLMy *receiver, const int count);
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronBaseOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(NNInferenceHeader(handle, restore, (uint)bTrain) && NNInferenceHeader(handle, restore, (uint)Type())
| |||
&& NNInferenceHeader(handle, restore, (uint)Neurons()) && NNInferenceRequired(Output, OpenCL, Neurons())
| |||
&& NNInferenceRequired(PrevOutput, OpenCL, Neurons()) && CheckPointer(Gradient) != POINTER_INVALID
| |||
&& NNInferenceRequired(Gradient, OpenCL, Gradient.Total()) && NNInferenceOptionalFinite(Weights)
| |||
&& NNInferenceOptionalFinite(DeltaWeights) && NNInferenceOptionalFinite(FirstMomentum)
| |||
&& NNInferenceOptionalFinite(SecondMomentum));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronSpikeActivation::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 101)
| |||
&& cLevels.InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 102)
| |||
&& cGates.InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 103)
| |||
&& cHV.Neurons() == Neurons() && NNInferenceOmittedBuffer(handle, restore, cHV.getOutput())
| |||
&& NNInferenceOmittedBuffer(handle, restore, cHV.getPrevOutput()));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronSpikeConvBlock::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 201)
| |||
&& cActivation.InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 202)
| |||
&& cConv.InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 203)
| |||
&& cStack.InferenceRuntimeSidecar(handle, restore));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronCogDriverData::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
if(iWindow == 0 || iVariables == 0 || iQuantiles == 0 || (ulong)iStateStackSize < 10 * (ulong)iQuantiles
| |||
|| iQuantStackSize < 2 || !MathIsValidNumber((double)fRange) || fRange <= 0)
| |||
return(false);
| |||
const ulong raw = (ulong)iWindow * iVariables, bins = 2 * (ulong)iQuantiles + 1;
| |||
if(raw > (ulong)INT_MAX || bins > (ulong)INT_MAX || raw * bins > (ulong)INT_MAX || (ulong)iStateStackSize * raw > (ulong)INT_MAX
| |||
|| (ulong)iQuantStackSize * raw * bins > (ulong)INT_MAX || cStateStack.Neurons() != (int)((ulong)iStateStackSize * raw)
| |||
|| cQuantStack.Neurons() != (int)((ulong)iQuantStackSize * raw * bins)
| |||
|| cPrevQuantStack.Neurons() != cQuantStack.Neurons())
| |||
return(false);
| |||
return(CNeuronSpikeConvBlock::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, iWindow)
| |||
&& NNInferenceHeader(handle, restore, iVariables) && NNInferenceHeader(handle, restore, iStateStackSize)
| |||
&& NNInferenceHeader(handle, restore, iQuantStackSize) && NNInferenceHeader(handle, restore, iQuantiles)
| |||
&& NNInferenceHeader(handle, restore, 301) && cNorm.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 302) && cStateStack.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 303) && cMSD.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 304) && cAffine.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 305) && cQuantStack.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 306) && cPrevQuantStack.InferenceRuntimeSidecar(handle, restore));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronCogDriverRankTCM::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
if(iInputDim == 0 || iQueryDim == 0 || iVariables == 0 || iHeads == 0 || iMemoryLen == 0 || iQueryDim % iHeads != 0
| |||
|| iHeadDim != iQueryDim / iHeads || (ulong)iVariables * iQueryDim != iTotalQueryDim
| |||
|| (ulong)iVariables * iHeads != iTotalHeads || iMemoryCount > iMemoryLen
| |||
|| (ulong)iMemoryLen * iTotalQueryDim > (ulong)INT_MAX
| |||
|| cMemoryQuery.Total() != (int)((ulong)iMemoryLen * iTotalQueryDim) || (ulong)iMemoryLen * iVariables > (ulong)INT_MAX
| |||
|| cMemoryAge.Total() != (int)((ulong)iMemoryLen * iVariables) || cMemoryScore.Total() != cMemoryAge.Total()
| |||
|| cMemoryValid.Total() != cMemoryAge.Total())
| |||
return(false);
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, iInputDim)
| |||
&& NNInferenceHeader(handle, restore, iQueryDim) && NNInferenceHeader(handle, restore, iVariables)
| |||
&& NNInferenceHeader(handle, restore, iHeads) && NNInferenceHeader(handle, restore, iMemoryLen)
| |||
&& NNInferenceHeader(handle, restore, iMemoryCount) && NNInferenceHeader(handle, restore, (uint)bLastQueryValid)
| |||
&& NNInferenceHeader(handle, restore, 401) && cQueryProjection.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 402) && cGateInput.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 403) && cGateProjection.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 404) && cMemoryContext.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceHeader(handle, restore, 405) && cSelfContext.InferenceRuntimeSidecar(handle, restore)
| |||
&& NNInferenceFinite(GetPointer(cMemoryQuery)) && NNInferenceFinite(GetPointer(cMemoryAge))
| |||
&& NNInferenceFinite(GetPointer(cMemoryScore)) && NNInferenceFinite(GetPointer(cMemoryValid)));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronOMPBOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
if(bCurrentTransactionPending || cReference == NULL || cCurrent == NULL || iReferenceCount > iReferenceCapacity
| |||
|| iCurrentCount > iCurrentCapacity)
| |||
return(false);
| |||
if(!CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) || !NNInferenceHeader(handle, restore, iDimension)
| |||
|| !NNInferenceHeader(handle, restore, iVariables) || !NNInferenceHeader(handle, restore, iSamples)
| |||
|| !NNInferenceHeader(handle, restore, iReferenceCapacity)
| |||
|| !NNInferenceHeader(handle, restore, iCurrentCapacity) || !NNInferenceHeader(handle, restore, iReferenceCount)
| |||
|| !NNInferenceHeader(handle, restore, iCurrentCount))
| |||
return(false);
| |||
uint mode = (uint)eMode, anchor = (uint)bSourceAnchor;
| |||
if(restore)
| |||
{
| |||
if(!NNInferenceRemaining(handle, 8))
| |||
return(false);
| |||
mode = (uint)FileReadInteger(handle);
| |||
anchor = (uint)FileReadInteger(handle);
| |||
if(mode != (uint)OMPB_INFERENCE || anchor > 1)
| |||
return(false);
| |||
}
| |||
else
| |||
if(mode != (uint)OMPB_INFERENCE || FileWriteInteger(handle, (int)mode) != 4
| |||
|| FileWriteInteger(handle, (int)anchor) != 4)
| |||
return(false);
| |||
if(!NNInferenceHeader(handle, restore, 501) || !cResidual.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 502) || !cGate.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 503) || !cReference.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 504) || !cCurrent.InferenceRuntimeSidecar(handle, restore))
| |||
return(false);
| |||
if(!NNInferenceHeader(handle, restore, 505) || !cAlpha.InferenceRuntimeSidecar(handle, restore))
| |||
return(false);
| |||
if(restore)
| |||
{
| |||
eMode = (ENUM_OMPB_MODE)mode;
| |||
bSourceAnchor = (anchor == 1);
| |||
}
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronScenarioForecast::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
if(!restore && bCodebookUpdate)
| |||
return(false);
| |||
const ulong vh = (ulong)iVariables * iHorizon;
| |||
if(iVariables == 0 || iHorizon == 0 || iDimension == 0 || iScenarios == 0 || iTopK == 0 || iTopK > iScenarios
| |||
|| vh > (ulong)INT_MAX)
| |||
return(false);
| |||
const ulong vhd = vh * iDimension;
| |||
if(vhd > (ulong)INT_MAX || (ulong)iScenarios * vhd > (ulong)INT_MAX / 2)
| |||
return(false);
| |||
const int conf = (int)((ulong)iScenarios * vh), latent = (int)((ulong)iScenarios * vhd), target = (int)vhd;
| |||
if(!NNInferenceRequired(Output, OpenCL, latent) || !NNInferenceRequired(GetPointer(cConfidence), OpenCL, conf)
| |||
|| !NNInferenceRequired(GetPointer(cLogConfidence), OpenCL, conf)
| |||
|| !NNInferenceRequired(GetPointer(cLogProbabilities), OpenCL, (int)iScenarios)
| |||
|| !NNInferenceRequired(GetPointer(cResponsibilities), OpenCL, (int)iScenarios)
| |||
|| !NNInferenceRequired(GetPointer(cTarget), OpenCL, target) || cGeneratorInput.Neurons() != 2 * latent
| |||
|| cConfidenceInput.Neurons() != 2 * latent
| |||
|| cRouterInput.Neurons() != (int)(2 * (ulong)iScenarios * iVariables * iDimension) || cGenerator.Neurons() != latent
| |||
|| cConfidenceHead.Neurons() != conf || cRouter.Neurons() != (int)iScenarios
| |||
|| cRouterSoftmax.Neurons() != (int)iScenarios || cResponsibilityScores.Neurons() != (int)iScenarios
| |||
|| cTopKSelector.Neurons() != (int)iTopK)
| |||
return(false);
| |||
if(!CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) || !NNInferenceHeader(handle, restore, iVariables)
| |||
|| !NNInferenceHeader(handle, restore, iScenarios) || !NNInferenceHeader(handle, restore, iTopK)
| |||
|| !NNInferenceHeader(handle, restore, iHorizon) || !NNInferenceHeader(handle, restore, iDimension)
| |||
|| !NNInferenceHeader(handle, restore, 600) || !cGeneratorInput.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 601) || !cRouterInput.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 602) || !cConfidenceInput.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 603) || !cGenerator.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 604) || !cRouter.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 605) || !cConfidenceHead.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 606) || !cRouterSoftmax.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 607) || !cResponsibilityScores.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceHeader(handle, restore, 608) || !cTopKSelector.InferenceRuntimeSidecar(handle, restore)
| |||
|| !NNInferenceFinite(cCodebook.GetPrototypes()) || !NNInferenceFinite(cCodebook.GetEMASums())
| |||
|| !NNInferenceFinite(cCodebook.GetEMACounts()) || !NNInferenceFinite(cCodebook.GetUsage())
| |||
|| !NNInferenceFinite(cCodebook.GetInactivityAge()) || !NNInferenceFinite(GetPointer(cConfidence))
| |||
|| !NNInferenceFinite(GetPointer(cLogConfidence)) || !NNInferenceFinite(GetPointer(cLogProbabilities))
| |||
|| !NNInferenceFinite(GetPointer(cResponsibilities)) || !NNInferenceFinite(GetPointer(cTarget)))
| |||
return(false);
| |||
if(restore)
| |||
bCodebookUpdate = false;
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceSnapshotGraph |
| |||
//+------------------------------------------------------------------+
| |||
bool CNet::InferenceSnapshotGraph(void) const
| |||
{
| |||
if(!layers || (layers.Total() != 5 && layers.Total() != 7) || !opencl || !bOwnOpenCL || pendingOpenCL != NULL)
| |||
return(false);
| |||
const int n = layers.Total();
| |||
const int tail[] =
| |||
{
| |||
defNeuronCogDriverData, defNeuronCogDriverRankTCM, defNeuronOMPBOCL, defNeuronScenarioForecast
| |||
}
| |||
;
| |||
for(int i = 0; i < n; i++)
| |||
{
| |||
CLayer *layer = layers.At(i);
| |||
if(!layer || layer.Total() != 1)
| |||
return(false);
| |||
CNeuronBaseOCL *node = layer.At(0);
| |||
if(!node || node.TrainMode())
| |||
return(false);
| |||
const int type = node.Type();
| |||
if(i >= n - 4)
| |||
{
| |||
const int expected = tail[i - (n - 4)];
| |||
if(type != expected &&
| |||
!(expected == defNeuronScenarioForecast && type == defNeuronScenarioForecastPriceOCL))
| |||
return(false);
| |||
}
| |||
else
| |||
if(type != (i == 0 ? defNeuronBaseOCL : (i == 1 ? defNeuronBatchNormOCL : defNeuronDropoutOCL)))
| |||
return(false);
| |||
}
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| SaveInferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNet::SaveInferenceRuntimeSidecar(const int handle)
| |||
{
| |||
if(m_inference_load_active || bWeightsUpdate || !InferenceSnapshotGraph()
| |||
|| !NNInferenceHeader(handle, false, 0x49534631) || !NNInferenceHeader(handle, false, (uint)layers.Total()))
| |||
return(false);
| |||
for(int i = 0; i < layers.Total(); i++)
| |||
{
| |||
CLayer *layer = layers.At(i);
| |||
CNeuronBaseOCL *node = layer.At(0);
| |||
if(!NNInferenceHeader(handle, false, (uint)i) || !node.InferenceRuntimeSidecar(handle, false))
| |||
return(false);
| |||
}
| |||
return(NNInferenceHeader(handle, false, 0x454e4431));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceSnapshotLoadFile |
| |||
//+------------------------------------------------------------------+
| |||
bool CNet::InferenceSnapshotLoadFile(const string file_name, const bool common)
| |||
{
| |||
const int handle = FileOpen(file_name, FILE_READ | FILE_BIN | (common ? FILE_COMMON : 0));
| |||
if(handle == INVALID_HANDLE)
| |||
return(false);
| |||
bool accepted = false;
| |||
do
| |||
{
| |||
if(FileSize(handle) < 48)
| |||
break;
| |||
const double error = FileReadDouble(handle), undefined = FileReadDouble(handle), forecast = FileReadDouble(handle);
| |||
const long stamp = FileReadLong(handle);
| |||
if(!MathIsValidNumber(error) || !MathIsValidNumber(undefined) || !MathIsValidNumber(forecast) || stamp <= 0
| |||
|| FileReadLong(handle) != -1 || FileReadInteger(handle) != layers.Type())
| |||
break;
| |||
const int count = FileReadInteger(handle);
| |||
if((count != 5 && count != 7))
| |||
break;
| |||
int loaded = 0;
| |||
for(int i = 0; i < count; i++)
| |||
{
| |||
CLayer *layer = new CLayer(0, handle, opencl);
| |||
if(layer == NULL)
| |||
break;
| |||
const ulong position = FileTell(handle);
| |||
const int tail[] =
| |||
{
| |||
defNeuronCogDriverData, defNeuronCogDriverRankTCM, defNeuronOMPBOCL, defNeuronScenarioForecast
| |||
}
| |||
;
| |||
const int expected = (i >= count - 4 ? tail[i - (count - 4)] : (i == 0 ? defNeuronBaseOCL : (i == 1 ? defNeuronBatchNormOCL : defNeuronDropoutOCL)));
| |||
bool framed = (NNInferenceRemaining(handle, 20) && FileReadLong(handle) == -1
| |||
&& FileReadInteger(handle) == layer.Type() && FileReadInteger(handle) == 1);
| |||
if(framed)
| |||
{
| |||
const int actual = FileReadInteger(handle);
| |||
framed = (actual == expected ||
| |||
(expected == defNeuronScenarioForecast && actual == defNeuronScenarioForecastPriceOCL));
| |||
}
| |||
if(!FileSeek(handle, (long)position, SEEK_SET) || !framed || !layer.Load(handle) || layer.Total() != 1
| |||
|| !layers.Add(layer))
| |||
{
| |||
delete layer;
| |||
break;
| |||
}
| |||
loaded++;
| |||
}
| |||
if(loaded != count || FileTell(handle) != FileSize(handle) || !InferenceSnapshotGraph())
| |||
break;
| |||
recentAverageError = (float)error;
| |||
accepted = true;
| |||
}
| |||
while(false);
| |||
FileClose(handle);
| |||
return(accepted);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| LoadInferenceRuntimeSnapshot |
| |||
//+------------------------------------------------------------------+
| |||
bool CNet::LoadInferenceRuntimeSnapshot(const string file_name, const int sidecar_handle, const bool common)
| |||
{
| |||
if(m_inference_load_active || pendingOpenCL != NULL || (layers && layers.Total() != 0) || (opencl && !bOwnOpenCL)
| |||
|| sidecar_handle == INVALID_HANDLE)
| |||
return(false);
| |||
if(!layers)
| |||
layers = new CArrayLayer();
| |||
if(!layers)
| |||
return(false);
| |||
if(!opencl && !OpenCLInit())
| |||
return(false);
| |||
m_inference_load_active = true;
| |||
bool accepted = InferenceSnapshotLoadFile(file_name, common);
| |||
if(accepted)
| |||
accepted = TrainMode(false) && SetWeightsUpdate(false) && NNInferenceHeader(sidecar_handle, true, 0x49534631)
| |||
&& NNInferenceHeader(sidecar_handle, true, (uint)layers.Total());
| |||
if(accepted)
| |||
{
| |||
for(int i = 0; i < layers.Total(); i++)
| |||
{
| |||
CLayer *layer = layers.At(i);
| |||
CNeuronBaseOCL *node = layer.At(0);
| |||
if(!NNInferenceHeader(sidecar_handle, true, (uint)i) || !node.InferenceRuntimeSidecar(sidecar_handle, true))
| |||
{
| |||
accepted = false;
| |||
break;
| |||
}
| |||
}
| |||
}
| |||
if(accepted)
| |||
accepted = NNInferenceHeader(sidecar_handle, true, 0x454e4431)
| |||
&& FileTell(sidecar_handle) == FileSize(sidecar_handle);
| |||
m_inference_load_active = false;
| |||
if(!accepted)
| |||
layers.Clear();
| |||
return(accepted);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| LoadInferenceFinite |
| |||
//+------------------------------------------------------------------+
| |||
bool CBufferFloat::LoadInferenceFinite(const int handle, COpenCLMy *receiver)
| |||
{
| |||
if(!receiver || !receiver.InferenceRuntimeLoadActive() || handle == INVALID_HANDLE)
| |||
return(false);
| |||
if(!NNInferenceRemaining(handle, 16))
| |||
return(false);
| |||
const ulong position = FileTell(handle), remaining = FileSize(handle) - position;
| |||
const long marker = FileReadLong(handle);
| |||
const int type = FileReadInteger(handle), count = FileReadInteger(handle);
| |||
if(!FileSeek(handle, (long)position, SEEK_SET) || marker != -1 || type != Type() || count < 0 || (ulong)count > 268435456
| |||
|| (ulong)count * 4 > remaining - 16)
| |||
return(false);
| |||
ResetLastError();
| |||
if(!CArrayFloat::Load(handle) || GetLastError() != 0 || m_data_total != count)
| |||
return(false);
| |||
for(int i = 0; i < count; i++)
| |||
if(!MathIsValidNumber((double)m_data[i]))
| |||
return(false);
| |||
BufferFree();
| |||
if(count > 0 && !BufferCreate(receiver))
| |||
return(false);
| |||
return(true);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| NNInferenceRequired |
| |||
//+------------------------------------------------------------------+
| |||
bool NNInferenceRequired(CBufferFloat *buffer, COpenCLMy *receiver, const int count)
| |||
{
| |||
return(buffer != NULL && CheckPointer(buffer) != POINTER_INVALID && CheckPointer(receiver) != POINTER_INVALID
| |||
&& count > 0 && buffer.Total() == count && buffer.GetOpenCL() == receiver
| |||
&& buffer.GetIndex() >= 0 && receiver.GetBufferSize(buffer.GetIndex()) == (ulong)count * 4
| |||
&& NNInferenceFinite(buffer));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronDropoutOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(!bTrain && MathIsValidNumber((double)OutProbability) && OutProbability >= 0 && OutProbability < 1
| |||
&& CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronConvOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore)
| |||
&& CheckPointer(WeightsConv) != POINTER_INVALID && NNInferenceRequired(WeightsConv, OpenCL, WeightsConv.Total())
| |||
&& NNInferenceFinite(DeltaWeightsConv)
| |||
&& NNInferenceFinite(FirstMomentumConv) && NNInferenceFinite(SecondMomentumConv));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronBatchNormOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore)
| |||
&& CheckPointer(BatchOptions) != POINTER_INVALID
| |||
&& NNInferenceRequired(BatchOptions, OpenCL, BatchOptions.Total()));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CParams::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 701)
| |||
&& cOne.InferenceRuntimeSidecar(handle, restore));
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
//| InferenceRuntimeSidecar |
| |||
//+------------------------------------------------------------------+
| |||
bool CNeuronBayesianLinearOCL::InferenceRuntimeSidecar(const int handle, const bool restore)
| |||
{
| |||
return(CNeuronBaseOCL::InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, iVariables)
| |||
&& NNInferenceHeader(handle, restore, iInputs) && NNInferenceHeader(handle, restore, iOutputs)
| |||
&& NNInferenceHeader(handle, restore, iSamples) && NNInferenceHeader(handle, restore, 801)
| |||
&& cWeights.InferenceRuntimeSidecar(handle, restore) && NNInferenceHeader(handle, restore, 802)
| |||
&& cBias.InferenceRuntimeSidecar(handle, restore));
| |||
}
| |||
#endif
| |||
//+------------------------------------------------------------------+
| |||
//+------------------------------------------------------------------+
|