blob: 0d1609ae56cf4b754e1a49d5dab2da7dd311c77d [file] [log] [blame]
#include "THCUNN.h"
#include "common.h"
struct softPlusupdateOutput_functor
{
const float threshold;
const float beta;
softPlusupdateOutput_functor(float threshold_, float beta_)
: threshold(threshold_)
, beta(beta_)
{}
__device__ void operator()(float *output, const float *input) const
{
float betain = beta * (*input);
*output = ((betain) > threshold) ? *input : (1/beta) * log1p(exp(betain));
}
};
void THNN_CudaSoftPlus_updateOutput(THCState *state, THCudaTensor *input, THCudaTensor *output, float beta, float threshold)
{
THCUNN_assertSameGPU(state, 2, input, output);
THCudaTensor_resizeAs(state, output, input);
THC_pointwiseApply2(state, output, input, softPlusupdateOutput_functor(threshold, beta));
}
struct softPlusupdateGradInput_functor
{
const float threshold;
const float beta;
softPlusupdateGradInput_functor(float threshold_, float beta_)
: threshold(threshold_)
, beta(beta_)
{}
__device__ void operator()(float *gradInput, const float *output, const float *gradOutput) const
{
float betaout = beta * (*output);
float exp_bo = exp(betaout);
*gradInput = ((betaout) > threshold) ? *gradOutput : *gradOutput * (exp_bo - 1) / exp_bo;
}
};
void THNN_CudaSoftPlus_updateGradInput(THCState *state, THCudaTensor *input, THCudaTensor *gradOutput, THCudaTensor *gradInput,
THCudaTensor *output, float beta, float threshold)
{
THCUNN_assertSameGPU(state, 4, input, output, gradOutput, gradInput);
THCudaTensor_resizeAs(state, gradInput, output);
THC_pointwiseApply3(state, gradInput, output, gradOutput, softPlusupdateGradInput_functor(threshold, beta));
}