// Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserved.//// Licensed 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.#pragma once#include "paddle/fluid/operators/reduce_op.h"namespacepaddle{namespaceoperators{structProdFunctor{template<typenameDeviceContext,typenameX,typenameY,typenameDim>voidoperator()(constDeviceContext&place,X*x,Y*y,constDim&dim){y->device(place)=x->prod(dim);}};structProdGradFunctor{template<typenameDeviceContext,typenameX,typenameY,typenameDX,typenameDY,typenameDim>voidoperator()(constDeviceContext&place,X*x,Y*y,DX*dx,DY*dy,constDim&dim,intsize){dx->device(place)=dy->broadcast(dim)*y->broadcast(dim)*x->inverse();}};}// namespace operators}// namespace paddle