def __init__(self, data, levels, ccore=False, **kwargs):
self.__data = data<EOL>self.__levels = levels<EOL>self.__directory = None<EOL>self.__clusters = []<EOL>self.__noise = []<EOL>self.__cluster_blocks = []<EOL>self.__dendrogram = []<EOL>self.__density_threshold = kwargs.get('<STR_LIT>', <NUM_LIT:0.0>)<EOL>self.__amount_threshold = kwargs.get('<STR_LIT>', <NUM_LIT:0>)<EOL>self.__ccore = ccore<EOL>self.__validate_arguments()<EOL>
!
        @brief Create BANG clustering algorithm.

        @param[in] data (list): Input data (list of points) that should be clustered.
        @param[in] levels (uint): Amount of levels in tree that is used for splitting (how many times block should be
                    split). For example, if amount of levels is two then surface will be divided into two blocks and
                    each obtained block will be divided into blocks also.
        @param[in] ccore (bool): Reserved positional argument - not used yet.
        @param[in] **kwargs: Arbitrary keyword arguments (available arguments: 'observe').

        <b>Keyword Args:</b><br>
            - density_threshold (double): If block density is smaller than this value then contained data by this
               block is considered as a noise and its points as outliers. Block density is defined by amount of
               points in block divided by block volume: <i>amount_block_points</i>/<i>block_volume</i>. By default
               it is 0.0 - means than only empty blocks are considered as noise. Be aware that this parameter is used
               with parameter 'amount_threshold' - the maximum threshold is considered during processing.
            - amount_threshold (uint): Amount of points in the block when it contained data in bang-block is
               considered as a noise and there is no need to split it till the last level. Be aware that this parameter
               is used with parameter 'density_threshold' - the maximum threshold is considered during processing.