blob: 2f56081acd2bd48a508bc5c02c7fb6902897b091 [file] [log] [blame]
#include "THCUNN.h"
#include "common.h"
struct logSigmoid_updateOutput_functor
{
__device__ void operator()(float *output, const float *input) const
{
float z = exp(-*input);
*output = -log(1. + z);
}
};
void THNN_CudaLogSigmoid_updateOutput(THCState *state, THCudaTensor *input, THCudaTensor *output, THCudaTensor *buffer)
{
THCUNN_assertSameGPU(state, 2, input, output);
THCudaTensor_resizeAs(state, output, input);
THC_pointwiseApply2(state, output, input, logSigmoid_updateOutput_functor());
}
struct logSigmoid_updateGradInput_functor
{
__device__ void operator()(float *gradInput, const float *input, const float *gradOutput) const
{
float z = exp(-*input);
*gradInput = *gradOutput * z / (1. + z);
}
};
void THNN_CudaLogSigmoid_updateGradInput(THCState *state, THCudaTensor *input, THCudaTensor *gradOutput,
THCudaTensor *gradInput , THCudaTensor *buffer)
{
THCUNN_assertSameGPU(state, 3, input, gradOutput, gradInput);
THCudaTensor_resizeAs(state, gradInput, input);
THC_pointwiseApply3(state, gradInput, input, gradOutput, logSigmoid_updateGradInput_functor());
}