📄 gstabsearch.cpp
字号:
#include "GStabSearch.h"#include "GBits.h"#include <math.h>#include <stdio.h>GStabSearch::GStabSearch(GRealVectorCritic* pCritic, double dMin, double dRange): GRealVectorSearch(pCritic){ m_dMin = dMin; m_dRange = dRange; m_dTolerance = .00001; m_nDimensions = pCritic->GetVectorSize(); m_pMins = new double[m_nDimensions]; m_pRanges = new double[m_nDimensions]; m_pVector = new double[m_nDimensions]; m_nMask[0] = 0; m_nMask[1] = 0; m_nMask[2] = 0; m_nMask[3] = 0; Reset(); m_nMask[0] = 0; // undo the increment that Reset() does}/*virtual*/ GStabSearch::~GStabSearch(){ delete(m_pMins); delete(m_pRanges); delete(m_pVector);}void GStabSearch::Reset(){ m_nCurrentDim = 0; m_nMaskPos = 0; // Start at the global scope int i; for(i = 0; i < m_nDimensions; i++) { m_pMins[i] = m_dMin; m_pRanges[i] = m_dRange; } // Increment the mask i = 0; while(++m_nMask[i] == 0) i++;}/*virtual*/ void GStabSearch::Iterate(){ // Test the center of both halves int i; for(i = 0; i < m_nDimensions; i++) m_pVector[i] = m_pMins[i] + .5 * m_pRanges[i]; m_pVector[m_nCurrentDim] = m_pMins[m_nCurrentDim] + .25 * m_pRanges[m_nCurrentDim]; double dError1 = m_pCritic->Critique(m_pVector); m_pVector[m_nCurrentDim] = m_pMins[m_nCurrentDim] + .75 * m_pRanges[m_nCurrentDim]; double dError2 = m_pCritic->Critique(m_pVector); // If the mask bit is zero, pick the better half, otherwise pick the worse half m_pRanges[m_nCurrentDim] *= .5; if(m_nMask[m_nMaskPos / 32] & (1 << (m_nMaskPos % 32))) { if(dError2 >= dError1) m_pMins[m_nCurrentDim] += m_pRanges[m_nCurrentDim]; } else { if(dError2 < dError1) m_pMins[m_nCurrentDim] += m_pRanges[m_nCurrentDim]; } // Advance if(++m_nCurrentDim >= m_nDimensions) m_nCurrentDim = 0; if(++m_nMaskPos >= 128) m_nMaskPos = 127; if(m_pRanges[m_nCurrentDim] < m_dTolerance) Reset();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -