| //+------------------------------------------------------------------+
|
| //| 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
|
| //+------------------------------------------------------------------+
|
| //+------------------------------------------------------------------+
|