30 #ifndef SHARK_UNSUPERVISED_RBM_SAMPLING_TEMPEREDMARKOVCHAIN_H 31 #define SHARK_UNSUPERVISED_RBM_SAMPLING_TEMPEREDMARKOVCHAIN_H 37 #include "Impl/SampleTypes.h" 44 template<
class Operator>
47 typedef typename Operator::HiddenSample HiddenSample;
48 typedef typename Operator::VisibleSample VisibleSample;
58 typedef typename Operator::RBM
RBM;
70 SampleBatch m_temperedChains;
74 void metropolisSwap(reference low,
double betaLow, reference high,
double betaHigh){
76 double betaDiff = betaLow - betaHigh;
77 double energyDiff = low.energy - high.energy;
78 double baseRateDiff =
inner_prod(low.visible.state,baseRate) -
inner_prod(high.visible.state,baseRate);
79 double r = betaDiff * energyDiff + betaDiff*baseRateDiff;
84 if( r >= 0 || (z > 0 && std::log(z) < r) ){
104 std::size_t visibles=m_operator.rbm()->numberOfVN();
105 std::size_t hiddens=m_operator.rbm()->numberOfHN();
106 m_temperedChains =
SampleBatch(temperatures,visibles,hiddens);
107 m_betas.resize(temperatures);
116 for(std::size_t i = 0; i != temperatures; ++i){
117 double factor = temperatures - 1.0;
125 return m_betas.size();
129 SHARK_CHECK(batchSize == 1,
"[TemperedMarkovChain::setBatchSize] markov chain can only compute batches of size 1.");
140 double beta(std::size_t i)
const{
155 return m_temperedChains;
160 return m_temperedChains;
168 if(m_temperedChains.size()==0)
169 throw SHARKEXCEPTION(
"you did not initialize the number of temperatures bevor initializing the chain!");
171 std::size_t visibles = m_operator.rbm()->numberOfVN();
172 RealMatrix sampleData(m_temperedChains.size(),visibles);
174 for(std::size_t i = 0; i != m_temperedChains.size(); ++i){
185 if(m_temperedChains.size()==0)
186 throw SHARKEXCEPTION(
"you did not initialize the number of temperatures bevor initializing the chain!");
188 m_operator.createSample(m_temperedChains.hidden,m_temperedChains.visible,sampleData,m_betas);
190 m_temperedChains.energy = m_operator.calculateEnergy(
191 m_temperedChains.hidden,
192 m_temperedChains.visible
197 for(std::size_t i = 0; i != k; ++i){
199 m_operator.stepVH(m_temperedChains.hidden, m_temperedChains.visible,1,m_betas);
202 m_temperedChains.energy = m_operator.calculateEnergy(
203 m_temperedChains.hidden,
204 m_temperedChains.visible
208 std::size_t elems = m_temperedChains.size();
209 for(std::size_t i = 0; i < elems-1; i+=2){
211 reference(m_temperedChains,i),m_betas(i),
212 reference(m_temperedChains,i+1),m_betas(i+1)
216 for(std::size_t i = 1; i < elems-1; i+=2){
218 reference(m_temperedChains,i),m_betas(i),
219 reference(m_temperedChains,i+1),m_betas(i+1)
222 m_operator.rbm()->hiddenNeurons().sufficientStatistics(
223 m_temperedChains.hidden.input,m_temperedChains.hidden.statistics, m_betas