/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

/*!
 * \file multisample_op.cu
 * \brief GPU Implementation of sample op
 */

#include "./multisample_op.h"

namespace mxnet {
namespace op {

NNVM_REGISTER_OP(_sample_uniform)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, UniformSampler<gpu>, 2>);

NNVM_REGISTER_OP(_sample_normal)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, NormalSampler<gpu>, 2>);

NNVM_REGISTER_OP(_sample_gamma)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, GammaSampler<gpu>, 2>);

NNVM_REGISTER_OP(_sample_exponential)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, ExponentialSampler<gpu>, 1>);

NNVM_REGISTER_OP(_sample_poisson)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, PoissonSampler<gpu>, 1>);

NNVM_REGISTER_OP(_sample_negative_binomial)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu, NegativeBinomialSampler<gpu>, 2>);

NNVM_REGISTER_OP(_sample_generalized_negative_binomial)
.set_attr<FCompute>("FCompute<gpu>", MultiSampleOpForward<gpu,
                    GeneralizedNegativeBinomialSampler<gpu>, 2>);

}  // namespace op
}  // namespace mxnet
