#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from enum import Enum


# parallel modes
class ParallelMode(Enum):
    """This is an enumeration class containing all possible parallel modes.
    """

    GLOBAL = 'global'

    # common parallel
    DATA = 'data'

    # model parallel - containing tensor and pipeline parallel groups
    # this is added to facilitate amp and grad clipping in hybrid parallel
    MODEL = 'model'

    # pipeline parallel
    PIPELINE = 'pipe'

    # containing all ranks in tensor parallel
    TENSOR = 'tensor'

    # sequence parallel
    SEQUENCE = 'sequence'
    SEQUENCE_DP = 'sequence_dp'

    # 1D Parallel
    PARALLEL_1D = '1d'

    # 2D parallel
    PARALLEL_2D_ROW = '2d_row'
    PARALLEL_2D_COL = '2d_col'

    # 3D parallel
    PARALLEL_3D_INPUT = '3d_input'
    PARALLEL_3D_WEIGHT = '3d_weight'
    PARALLEL_3D_OUTPUT = '3d_output'
    PARALLEL_3D_INPUT_X_WEIGHT = "3d_input_x_weight"
    PARALLEL_3D_OUTPUT_X_WEIGHT = "3d_output_x_weight"

    # 2.5D parallel
    PARALLEL_2P5D_ROW = '2p5d_row'
    PARALLEL_2P5D_COL = '2p5d_col'
    PARALLEL_2P5D_DEP = '2p5d_dep'
    PARALLEL_2P5D_XZ = '2p5d_xz'
