Files
Rbm-legacy/Source/Layer.hpp
T
jens f62f1283f8 further development
git-svn-id: http://moon:8086/svn/software/trunk/projects/RBM@17 b431acfa-c32f-4a4a-93f1-934dc6c82436
2014-10-04 19:09:35 +00:00

139 lines
2.5 KiB
C++

/*
==============================================================================
Layer.hpp
Created: 21 Sep 2014 1:55:15pm
Author: jens
==============================================================================
*/
#ifndef LAYER_HPP
#define LAYER_HPP
#include <cstdint>
#include "noise.h"
#include "Weights.hpp"
class Layer
{
public:
Layer(uint32_t numUnits = 0, const double *pStatesInit = nullptr)
: m_numUnits(numUnits)
, m_pProbs(nullptr)
, m_pStates(nullptr)
, m_pStatesInit(pStatesInit)
{
setNumUnits(numUnits);
Noise_Init(&m_noise, 0x12345677);
}
virtual ~Layer()
{
setNumUnits(0);
Noise_Free(&m_noise);
}
void setNumUnits(uint32_t numUnits)
{
if (m_numUnits)
{
delete [] m_pProbs;
delete [] m_pStates;
}
m_numUnits = numUnits;
if (m_numUnits)
{
uint32_t i;
m_pProbs = new double[m_numUnits];
m_pStates = new double[m_numUnits];
for (i=0; i < m_numUnits; i++)
{
m_pProbs[i] = 0.0;
}
for (i=0; i < m_numUnits; i++)
{
m_pStates[i] = 0.0;
}
if (m_pStatesInit)
{
memcpy(m_pStates, m_pStatesInit, m_numUnits*sizeof(double));
}
}
}
Layer& operator= (const Layer &rhs)
{
memcpy(m_pProbs, rhs.m_pProbs, m_numUnits*sizeof(double));
memcpy(m_pStates, rhs.m_pStates, m_numUnits*sizeof(double));
return *this;
}
void probsUpdate(const Layer &layer, const Weights &weights) const
{
uint32_t i;
for (i=0; i < m_numUnits; i++)
{
m_pProbs[i] = logSigmoid(accum(layer, weights, i));
}
}
void statesAssignfromProbs()
{
memcpy(m_pStates, m_pProbs, m_numUnits*sizeof(double));
}
void statesUpdateStochastic()
{
uint32_t i;
double sample;
for (i=0; i < m_numUnits; i++)
{
sample = Noise_Uniform(&m_noise, 0.5);
m_pStates[i] = (double)(sample <= m_pProbs[i]);
}
}
const double *getProbs() const
{
return m_pProbs;
}
const double *getStates() const
{
return m_pStates;
}
uint32_t getNumUnits() const
{
return m_numUnits;
}
virtual double getEnergy(const Weights &weights) = 0;
private:
uint32_t m_numUnits;
noise_gen_t m_noise;
inline double logSigmoid(double x) const
{
return 1./(1 + exp(-x));
}
protected:
double *m_pProbs;
double *m_pStates;
const double *m_pStatesInit;
virtual double accum(const Layer &layer, const Weights &weights, uint32_t index) const = 0;
};
#endif // LAYER_HPP