#   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.

import unittest
import numpy as np
import paddle.fluid.core as core
from op_test import OpTest


class TestDropoutOp(OpTest):
    def setUp(self):
        self.op_type = "dropout"
        self.inputs = {'X': np.random.random((32, 64)).astype("float32")}
        self.attrs = {'dropout_prob': 0.0, 'fix_seed': True, 'is_test': False}
        self.outputs = {
            'Out': self.inputs['X'],
            'Mask': np.ones((32, 64)).astype('float32')
        }

    def test_check_output(self):
        self.check_output()

    def test_check_grad_normal(self):
        self.check_grad(['X'], 'Out', max_relative_error=0.05)


class TestDropoutOp2(TestDropoutOp):
    def setUp(self):
        self.op_type = "dropout"
        self.inputs = {'X': np.random.random((32, 64)).astype("float32")}
        self.attrs = {'dropout_prob': 1.0, 'fix_seed': True, 'is_test': False}
        self.outputs = {
            'Out': np.zeros((32, 64)).astype('float32'),
            'Mask': np.zeros((32, 64)).astype('float32')
        }


class TestDropoutOp3(TestDropoutOp):
    def setUp(self):
        self.op_type = "dropout"
        self.inputs = {'X': np.random.random((32, 64, 2)).astype("float32")}
        self.attrs = {'dropout_prob': 0.0, 'fix_seed': True, 'is_test': False}
        self.outputs = {
            'Out': self.inputs['X'],
            'Mask': np.ones((32, 64, 2)).astype('float32')
        }


class TestDropoutOp4(OpTest):
    def setUp(self):
        self.op_type = "dropout"
        self.inputs = {'X': np.random.random((32, 64)).astype("float32")}
        self.attrs = {'dropout_prob': 0.35, 'fix_seed': True, 'is_test': True}
        self.outputs = {
            'Out': self.inputs['X'] * (1.0 - self.attrs['dropout_prob'])
        }

    def test_check_output(self):
        self.check_output()


class TestDropoutOp5(OpTest):
    def setUp(self):
        self.op_type = "dropout"
        self.inputs = {'X': np.random.random((32, 64, 3)).astype("float32")}
        self.attrs = {'dropout_prob': 0.75, 'is_test': True}
        self.outputs = {
            'Out': self.inputs['X'] * (1.0 - self.attrs['dropout_prob'])
        }

    def test_check_output(self):
        self.check_output()


class TestFP16DropoutOp1(OpTest):
    def setUp(self):
        x = np.random.random((32, 64)).astype("float16")
        prob = 0.35
        out = x * (1.0 - prob)

        self.op_type = "dropout"
        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.attrs = {'dropout_prob': prob, 'fix_seed': True, 'is_test': True}
        self.outputs = {'Out': out}

    def test_check_output(self):
        if core.is_compiled_with_cuda() and core.op_support_gpu("dropout"):
            self.check_output_with_place(core.CUDAPlace(0), atol=1e-3)


class TestFP16DropoutOp2(OpTest):
    def setUp(self):
        x = np.random.random((32, 64, 3)).astype("float16")
        prob = 0.75
        out = x * (1.0 - prob)

        self.op_type = "dropout"
        self.inputs = {'X': OpTest.np_dtype_to_fluid_dtype(x)}
        self.attrs = {'dropout_prob': prob, 'is_test': True}
        self.outputs = {'Out': out}

    def test_check_output(self):
        if core.is_compiled_with_cuda() and core.op_support_gpu("dropout"):
            self.check_output_with_place(core.CUDAPlace(0), atol=1e-3)


if __name__ == '__main__':
    unittest.main()

@@ -2834,17 +2834,16 @@
 ropoutOp
-1
 (OpTest)
@@ -2857,32 +2857,96 @@
 ef setUp(self):%0A
+        self.op_type = %22dropout%22%0A        self.init_test_case()%0A%0A
         x = np.r
@@ -2954,32 +2954,39 @@
 ndom.random(
-(32, 64)
+self.input_size
 ).astype(%22fl
@@ -3005,84 +3005,35 @@
     
-prob = 0.35%0A        out = x * (1.0 - prob)%0A%0A        self.op_type = %22dropout%22
+out = x * (1.0 - self.prob)
 %0A   
@@ -3106,32 +3106,45 @@
   self.attrs = %7B
+%0A            
 'dropout_prob': 
@@ -3147,31 +3147,69 @@
 b': 
-prob, 'fix_seed': True,
+self.prob,%0A            'fix_seed': self.fix_seed,%0A           
  'is
@@ -3212,32 +3212,41 @@
  'is_test': True
+%0A        
 %7D%0A        self.o
@@ -3260,32 +3260,152 @@
 = %7B'Out': out%7D%0A%0A
+    def init_test_case(self):%0A        self.input_size = %5B32, 64%5D%0A        self.prob = 0.35%0A        self.fix_seed = True%0A%0A
     def test_che
@@ -3599,523 +3599,150 @@
 Op2(
-Op
 Test
-):%0A    def setUp(self):%0A        x = np.random.random((32, 64, 3)).astype(%22float16%22)%0A        prob = 0.75%0A        out = x * (1.0 - prob)%0A%0A        self.op_type = %22dropout%22%0A        self.inputs = %7B'X': OpTest.np_dtype_to_fluid_dtype(x)%7D%0A        self.attrs = %7B'dropout_prob': prob, 'is_test': True%7D%0A        self.outputs = %7B'Out': out%7D%0A%0A    def test_check_output(self):%0A        if core.is_compiled_with_cuda() and core.op_support_gpu(%22dropout%22):%0A            self.check_output_with_place(core.CUDAPlace(0), atol=1e-3)
+FP16DropoutOp):%0A    def init_test_case(self):%0A        self.input_size = %5B32, 64, 3%5D%0A        self.prob = 0.75%0A        self.fix_seed = False
 %0A%0A%0Ai

address comments