diff --git a/python/paddle/fluid/layers/control_flow.py b/python/paddle/fluid/layers/control_flow.py index 4fec6825078adf3e34d4b8f34aebf984346620b4..29713dcea9ebdcd9d078c6bc74099cb355e5415a 100644 --- a/python/paddle/fluid/layers/control_flow.py +++ b/python/paddle/fluid/layers/control_flow.py @@ -607,6 +607,60 @@ class WhileGuard(BlockGuard): class While(object): + """ + while loop control flow. + + Args: + cond (Variable): condition used to compare. + name (str): The name of this layer. + + Examples: + .. code-block:: python + + # The value these d0, d1 and d2 can be fed from python. + d0 = fluid.layers.data( + "d0", shape=[10], append_batch_size=False, dtype='float32') + d1 = fluid.layers.data( + "d1", shape=[10], append_batch_size=False, dtype='float32') + d2 = fluid.layers.data( + "d2", shape=[10], append_batch_size=False, dtype='float32') + i = fluid.layers.zeros(shape=[1], dtype='int64') + i.stop_gradient = True + init = fluid.layers.zeros(shape=[10], dtype='float32') + # Initialize mem_array from init + mem_array = fluid.layers.array_write(x=init, i=i) + # Initialize data_array from d0 + data_array = fluid.layers.array_write(x=d0, i=i) + # Set a value to data_array using d1[i]. + i = fluid.layers.increment(i) + fluid.layers.array_write(d1, i, array=data_array) + # Set a value to data_array using d2[i]. + i = fluid.layers.increment(i) + fluid.layers.array_write(d2, i, array=data_array) + # Create a idx to start the while loop. + i = fluid.layers.zeros(shape=[1], dtype='int64') + i.stop_gradient = True + + array_len = fluid.layers.fill_constant( + shape=[1], dtype='int64', value=3) + array_len.stop_gradient = True + # Create the while loop condition. + cond = fluid.layers.less_than(x=i, y=array_len) + + # Within the loop, perform sums. + while_op = fluid.layers.While(cond=cond) + with while_op.block(): + d = fluid.layers.array_read(array=data_array, i=i) + prev = fluid.layers.array_read(array=mem_array, i=i) + result = fluid.layers.sums(input=[d, prev]) + + i = fluid.layers.increment(x=i, in_place=True) + fluid.layers.array_write(result, i=i, array=mem_array) + fluid.layers.less_than(x=i, y=array_len, cond=cond) + + sum_result = fluid.layers.array_read(array=mem_array, i=i) + """ + BEFORE_WHILE_BLOCK = 0 IN_WHILE_BLOCK = 1 AFTER_WHILE_BLOCK = 2