def _retrieve_neighs_variable(self, i, typeret_i=None):
        """Retrieve neighbourhood under conditions of ifdistance or others
        interior parameters. Variable typeret_i assumption.

        Parameters
        ----------
        i: int
            the element id.
        typeret_i: tuple, np.ndarray or None (default)
            the selector of the retrievers we want to use.

        Returns
        -------
        neighs_info: pst.Neighs_Info
            the neighborhood information.

        """
        typeret_i, out_ret = self.get_type_ret(i, typeret_i)
        i = [i] if type(i) in inttypes else i
        typeret_i = [typeret_i] if type(typeret_i) != list else typeret_i
        out_ret = [out_ret] if type(out_ret) != list else out_ret
        neighs = []
        for j in range(len(typeret_i)):
            neighs_info = self.retrievers[typeret_i[j]].\
                retrieve_neighs(i[j], output=out_ret[j])
            neighs.append(neighs_info)
        neighs_info = join_by_iss(neighs)
        return neighs_info
예제 #2
0
def test():
    import warnings
    warnings.simplefilter("ignore")
    ###########################################################################
    ############################### Neighs_Info ###############################

    ### Creation of possible combinations
#    pos_format_set_info = [None, 'integer', 'list', 'list_only', 'list_list',
#                           'list_tuple', 'list_tuple1', 'list_tuple2',
#                           'array', 'slice', 'tuple', 'tuple_int',
#                           'tuple_slice', 'tuple_tuple', 'tuple_others']

    ############################# USEFUL FUNCTIONS ############################
    joinpos = lambda x, y: x

    ### Creation of possible inputs
    creator_lvl = lambda lvl: tuple(np.random.randint(1, 10, int(lvl)))
    creator2_lvl = lambda sh: tuple(list(sh) + [np.random.randint(5)])

    extend_list = lambda lista, n: [lista for i in range(n)]
    extend_array = lambda array, n: np.array([array for i in range(n)])

    neighs0 = lambda: np.random.randint(100)
    sp_rel_pos0 = lambda: np.random.random()

    def create_neighs(sh, type_):
        neighs = neighs0()
        for i in range(len(sh)):
            if type_ == 'array':
                neighs = extend_array(neighs, sh[len(sh)-i-1])
            else:
                neighs = extend_list(neighs, sh[len(sh)-i-1])
#        if type(neighs) == int:
#            if type_ == 'array':
#                neighs = np.array([neighs])
#            else:
#                neighs = [neighs]
        return neighs

    def create_sp_rel_pos(sh, type_):
        sp_rel_pos = np.array([sp_rel_pos0()
                               for i in range(np.random.randint(1, 4))])
        for i in range(len(sh)):
            if type_ == 'array':
                sp_rel_pos = extend_array(sp_rel_pos, sh[len(sh)-i-1])
            else:
                sp_rel_pos = extend_list(sp_rel_pos, sh[len(sh)-i-1])
        if len(sh) == 0:
            if type_ == 'list':
                sp_rel_pos = list(sp_rel_pos)
        return sp_rel_pos

#    neighs_int = lambda: np.random.randint(100)
#    neighs_list = lambda x: list([neighs_int() for i in range(x)])
#    neighs_array = lambda x: np.array([neighs_int() for i in range(x)])
    neighs_slice = lambda top: slice(0, top)

    def creation_neighs_nfo(p, sh, k_len, nei_len):
        ## Presetting
        sh_static = sh
        if len(sh_static) == 3:
            sh_static = list(sh_static)
            sh_static[0] = k_len
            sh_static = tuple(sh_static)
#        if p[0] is True:
#            basic_sh = [] if len(sh) == 0 else [1]
#            sh_static = tuple(basic_sh+[sh[i] for i in range(1, len(sh))])
        # Neighs creation
        if p[6] == 'slice':
            neighs = neighs_slice(nei_len)
        else:
            # Use type_neighs and level
            neighs = create_neighs(sh_static, p[6])
        # Sp_rel_pos
        sp_rel_pos = create_sp_rel_pos(sh_static, p[7])
        if p[7] == 'list':
#            print type(sp_rel_pos), p, sh
            assert(type(sp_rel_pos) == list)

        ## Create structure p[4], p[6], p[7] None
        # Create structure
        if p[4] == 'raw':
            neighs_nfo = neighs
        elif p[4] == 'tuple':
            neighs_nfo = (neighs, np.arange(k_len))
        elif p[4] == 'tuple_only':
            neighs_nfo = (neighs, sp_rel_pos)
        elif p[4] == 'tuple_tuple':
            neighs_nfo = ((neighs, sp_rel_pos), np.arange(k_len))
        elif p[4] == 'list_tuple_only':
            neighs_nfo = [(neighs, sp_rel_pos) for i in range(k_len)]
        elif p[4] == 'tuple_list_tuple':
            neighs_nfo = ([(neighs, sp_rel_pos) for i in range(k_len)],
                          range(k_len))
        else:
            neighs_nfo = neighs
        return neighs_nfo

    ###########################################################################

    pos_ifdistance = [True, False, None]
    pos_constant_neighs = [True, False, None]
    pos_format_get_k_info = [None, "general", "default", "list", "integer"]
    pos_format_get_info = [None, "default", "general"]
    pos_type_neighs = [None, 'general', 'array', 'list', 'slice']
    pos_type_sp_rel_pos = [None, 'general', 'array', 'list']
    pos_format_level = [None, 0, 1, 2, 3]
    pos_format_structure = [None, 'raw', 'tuple', 'tuple_only', 'tuple_tuple',
                            'list_tuple_only', 'tuple_list_tuple']
    pos_staticneighs = [None, True, False]

    pos = [pos_constant_neighs, pos_ifdistance, pos_format_get_info,
           pos_format_get_k_info, pos_format_structure, pos_format_level,
           pos_type_neighs, pos_type_sp_rel_pos, pos_staticneighs]

    ###############################
    ###############################
    level_dependent = ['list_tuple_only', 'tuple_list_tuple']

    ### Testing possible combinations
    k = 0
    for p in product(*pos):
        ## General instantiation. It has to be able to eat any input
        neighs_info_general = Neighs_Info()
        ## Defintiion of forbidden combinations
        bool_error = p[4] in level_dependent and p[5] != 2
#        bool_error = bool_error or p[2] == "default" or p[3] == "default"
        ## Testing raising errors of forbidden combinations:
        if bool_error:
            try:
                boolean = False
                neighs_info = Neighs_Info(constant_neighs=p[0],
                                          ifdistance=p[1],
                                          format_get_info=p[2],
                                          format_get_k_info=p[3],
                                          format_structure=p[4],
                                          format_level=p[5],
                                          type_neighs=p[6],
                                          type_sp_rel_pos=p[7],
                                          staticneighs=p[8])
                boolean = True
                raise Exception("It has to halt here.")
            except:
                if boolean:
                    raise Exception("It has to halt here.")
            continue
        ## Avoid non-allowed
        if p[2] == "default" or p[3] == "default":
            continue
        if p[4] == 'list_tuple_only' and p[0]:
            continue
        tupletypes = ['tuple', 'tuple_only', 'tuple_tuple', 'list_tuple_only',
                      'tuple_list_tuple']
        if p[6] == 'slice' and p[4] in tupletypes:
            continue
        if not p[8] and p[6] == 'slice':
            continue
        ## TESTING:
        if p[3] == 'integer':
            continue
#        print p
        ## Save effort
        if p[4] == 'tuple':
            if np.random.random() < 0.9:
                continue

        ## Instantiation
        neighs_info = Neighs_Info(constant_neighs=p[0], ifdistance=p[1],
                                  format_get_info=p[2], format_get_k_info=p[3],
                                  format_structure=p[4], format_level=p[5],
                                  type_neighs=p[6], type_sp_rel_pos=p[7],
                                  staticneighs=p[8])
        neighs_info.set_information(100, 100)

        lvl = np.random.randint(4) if p[5] is None else p[5]
        sh = creator_lvl(lvl)
        iss_len = sh[len(sh)-2] if len(sh) > 1 else np.random.randint(1, 100)
        k_len = sh[0] if len(sh) == 3 else np.random.randint(1, 9)
        nei_len = sh[-1] if len(sh) > 0 else np.random.randint(100)
        neighs_nfo = creation_neighs_nfo(p, sh, k_len, nei_len)

        neighs_info.set(neighs_nfo, range(iss_len))
        ks = [0] if neighs_info.ks is None else neighs_info.ks
        neighs_info.get_information(ks)
        ## Special cases
        # Slice type
        if p[6] == 'slice' and p[4] == 'raw':
            neighs_info.set(5, range(iss_len))
            neighs_info.set((2, 6), range(iss_len))
            neighs_info.set(None, range(iss_len))

        # Important general functions
        neighs_info.any()
        neighs_info.empty()
        neighs_info.shape
        neighs_info._get_neighs_general()
        neighs_info._general_get_rel_pos()
        neighs_info.get_copy_iss([neighs_info.iss[0]])
        neighs_info.get_copy_iss(neighs_info.iss[0])
        neighs_info.get_copy_iss_by_ind([0])
        neighs_info.get_copy_iss_by_ind(0)
        neighs_info.reset_functions()
        if p[6] == 'slice':
            neighs_info._get_neighs_general()
        # Reset structure
        if p[4] not in ['list_tuple_only', 'tuple_list_tuple']:
            # Rewrite level problems avoiding
            neighs_info.reset_level(p[5])
            neighs_info.reset_structure(p[4])
        neighs_info_general.set(neighs_nfo, range(iss_len))

        ## Testing joining
        logi = neighs_info.ifdistance and neighs_info.sp_relative_pos is None
        if np.random.random() < 0.1:
            if logi or type(neighs_info.idxs) == slice:
                try:
                    boolean = False
                    mode = ['and', 'or', 'xor'][np.random.randint(0, 3)]
                    neighs_info.join_neighs(neighs_info, mode, joinpos)
                    boolean = True
                    raise Exception("It has to halt here.")
                except:
                    if boolean:
                        raise Exception("It has to halt here.")
            else:
                neighs_info.join_neighs(neighs_info, 'and', joinpos)
                neighs_info.join_neighs(neighs_info, 'or', joinpos)
                neighs_info.join_neighs(neighs_info, 'xor', joinpos)
                join_neighsinfo_AND_general(neighs_info, neighs_info, joinpos)
                join_neighsinfo_OR_general(neighs_info, neighs_info, joinpos)
                join_neighsinfo_XOR_general(neighs_info, neighs_info, joinpos)
                neighs_nfo2 = creation_neighs_nfo(p, sh, k_len, nei_len)
                neighs_info2 = neighs_info.copy()
                neighs_info2.set(neighs_nfo2, range(iss_len))
                neighs_info2.sp_relative_pos = neighs_info.sp_relative_pos
                neighs_info.join_neighs(neighs_info2, 'and', joinpos)
                neighs_info.join_neighs(neighs_info2, 'or', joinpos)
                neighs_info.join_neighs(neighs_info2, 'xor', joinpos)
                join_neighsinfo_AND_general(neighs_info, neighs_info2, joinpos)
                join_neighsinfo_OR_general(neighs_info, neighs_info2, joinpos)
                join_neighsinfo_XOR_general(neighs_info, neighs_info2, joinpos)
        ## Set ks
        if neighs_info.staticneighs:
            neighs_info.set_ks(range(10))
        else:
            neighs_info.set_ks(range(neighs_info.shape[2]))

        ## Testing joinning
        if p[6] != 'slice':
            neis = [neighs_info.copy() for s in range(5)]
            ilen = 0
            for s in range(5):
                ilen += len(neis[s].iss)
            new_neis = join_by_iss(neis)
            assert(len(new_neis.iss) == ilen)
            assert(neighs_info.staticneighs == new_neis.staticneighs)
            assert(neighs_info.ks == new_neis.ks)
        join_by_iss([neighs_info])

        k += 1
#        print '-'*20, k

    #* integer {neighs}
    neighs_info = Neighs_Info()
    neighs_info.shape
    try:
        boolean = False
        neighs_info._default_get_neighs()
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    try:
        boolean = False
        neighs_info._default_get_information()
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")

    neighs_info._format_set_iss('int')
    neighs_info._format_set_iss('list')
    neighs_info._format_set_iss('null')
    neighs_info = Neighs_Info()
    neighs_info.set_information(10, 10)
    neighs_info.set(5)
    neighs_info.set(([0], [5.]))
    #* list of integers {neighs}
    neighs_info.reset()
    neighs_info.set_information(10, 10)
    neighs_info.set([[0, 4]])
    try:
        boolean = False
        neighs_info._kret = 10
        neighs_info._integer_get_k(100000)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    neighs_info._get_neighs_list_static()
    #* list of lists of integers {neighs for some iss}
    neighs_info.reset()
    neighs_info.set([[0, 4], [0, 3]])
    #* list of lists of lists of integers {neighs for some iss and ks}
    neighs_info.reset()
    neighs_info.set([[[0, 4], [0, 3]]])
    neighs_info.staticneighs = False
    neighs_info._array_only_set_rel_pos(np.array([[2], [3]]))
    neighs_info._general_set_iss(True)
    neighs_info._set_rel_pos_general_array(np.array([[2], [3]]))
    neighs_info._set_rel_pos_general_array(np.array([[[[2], [3]]]]))
    neighs_info._list_list_only_set_rel_pos(np.array([[[5]]]))
    neighs_info.staticneighs = True
    neighs_info._general_set_iss(True)
    neighs_info._set_rel_pos_general_list([[[[2], [3]]]])
    neighs_info._general_set_rel_pos(None)

    try:
        boolean = False
        neighs_info._general_set_rel_pos(True)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    #* numpy array 1d, 2d, 3d {neighs}
    neighs_info = Neighs_Info()
    neighs_info._set_neighs_general_array(np.array(5))
    neighs_info._set_neighs_slice(None)
    neighs_info.reset()

    try:
        boolean = False
        neighs_info._general_set_neighs(True)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")

    neighs_info.reset()
    neighs_info.set(np.array([[[0, 4], [0, 3]]]))
    neighs_info.staticneighs = False
    neighs_info._set_rel_pos_dim(5)
    neighs_info.reset()
    neighs_info.set(np.array([[0, 4], [0, 3]]))
    neighs_info.reset()
    neighs_info.set(np.array([0, 4]))
    #* tuple of neighs

    # Empty cases
    neighs_info.reset()
    neighs_info.set([[]])
    assert(neighs_info.empty())
    neighs_info = Neighs_Info(staticneighs=True)
    neighs_info.set([[]])

    neighs_info.reset()
    try:
        boolean = False
        neighs_info._set_tuple_only_structure((range(2), None, 5))
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    neighs_info._set_structure_list([np.array(range(10))])
    neighs_info.staticneighs = True
    # Testing setting rel_pos strange cases
    neighs_info._general_set_rel_pos(5)
    neighs_info._set_rel_pos_general_list(np.array([0]))
    neighs_info._set_rel_pos_general_list(np.array([[0]]))
    neighs_info._set_rel_pos_general_list(np.array([]))
    neighs_info._set_rel_pos_general_list(np.array([[]]))
    neighs_info._set_rel_pos_general_list(np.array([[[]]]))
    neighs_info._set_rel_pos_number(5)
    neighs_info.level = 0
    neighs_info._set_rel_pos_general_list(np.array([0, 3]))

    ## Get k
    neighs_info._kret = 10
    neighs_info._integer_get_k([4])
    neighs_info._integer_get_k(5)
    neighs_info._default_get_k()
    try:
        boolean = False
        neighs_info._integer_get_k(100000)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    neighs_info._general_get_k()
    neighs_info._general_get_k(4)
    neighs_info._general_get_k(range(2))

    ## Set iss
    neighs_info._general_set_iss(np.array([0]))
    neighs_info._general_set_iss(np.array([0]))
    neighs_info._general_set_iss(0)
    neighs_info._general_set_iss([0])
    neighs_info._general_set_iss(range(3))
    neighs_info._general_set_iss(5)
    neighs_info._int_set_iss(8)
    neighs_info._list_set_iss(range(3))
    neighs_info._null_set_iss(5)

    ## Stress empty tests
    neighs_info.reset()
    neighs_info.set(([[]], [[]]))
    assert(neighs_info.empty())

    neighs_info.reset()
    neighs_info.set(([[], []]))
    assert(neighs_info.empty())

    neighs_info.reset()
    neighs_info.set([])
    assert(neighs_info.empty())

    neighs_info.reset()
    neighs_info.set(([]))
    assert(neighs_info.empty())

    neighs_info.reset()
    neighs_info.set(([[]], [[]]), [0])
    assert(neighs_info.empty())

    neighs_info.reset()
    neighs_info.set(([np.array([])], [np.array([])]), [0])
    assert(neighs_info.empty())

    neighs_info = Neighs_Info(staticneighs=True)
    neighs_info._set_neighs_general_array(np.array(5))

    neighs_info = Neighs_Info(format_structure='tuple_tuple',
                              type_neighs='list', type_sp_rel_pos='list',
                              format_level=2)
    neighs_info.set((([np.array([])], [np.array([[]])]), [0]))
    neighs, _, _, _ = neighs_info.get_information(0)

    ## Empty assert
    neighs_info = Neighs_Info()
    neighs_info.set((([0], [0]), 0))
    assert(not neighs_info.empty())
    for a, b, c, d in neighs_info:
        pass

    ## Check proper outputs
    # Neighs information
    neighs_info = Neighs_Info()
    sh = creator_lvl(3)
    neighs = np.random.randint(0, 20, np.prod(sh)).reshape(sh)
    sp_relative_pos = np.random.random((tuple(list(sh)+[3])))
    ks = range(sh[0])
    iss = range(sh[1])

    neighs_info.set((neighs, sp_relative_pos), iss)
    neighs_info.check_output_standards(neighs, sp_relative_pos, ks, iss)

    neighs_info2 = Neighs_Info()
    neighs_info2.set(neighs_info)

    # Check wrong cases
    try:
        boolean = False
        sh1 = list(sh)
        sh1[0] = sh[0]+1
        sh1 = tuple(sh1)
        neighs = np.random.randint(0, 20, np.prod(sh1)).reshape(sh1)
        sp_relative_pos = np.random.random((tuple(list(sh1)+[3])))
        neighs_info.check_output_standards(neighs, sp_relative_pos, ks, iss)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    try:
        boolean = False
        sh1 = list(sh)
        sh1[1] = sh[1]+1
        sh1 = tuple(sh1)
        neighs = np.random.randint(0, 20, np.prod(sh1)).reshape(sh1)
        sp_relative_pos = np.random.random((tuple(list(sh1)+[3])))
        neighs_info.check_output_standards(neighs, sp_relative_pos, ks, iss)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    try:
        boolean = False
        neighs_info.check_output_standards(None, sp_relative_pos, ks, iss)
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
    try:
        boolean = False
        neighs_info.idxs = None
        neighs_info.assert_goodness()
        boolean = True
        raise Exception("It has to halt here.")
    except:
        if boolean:
            raise Exception("It has to halt here.")
# Why should be halt?
#    try:
#        boolean = False
#        neighs_info.idxs = [[]]
#        neighs_info.staticneighs = True
#        neighs_info.assert_goodness()
#        boolean = True
#        raise Exception("It has to halt here.")
#    except:
#        if boolean:
#            raise Exception("It has to halt here.")

    ## Testing auxiliar functions
    ###############################

    neis = np.random.randint(0, 100, 4*5).reshape((5, 2, 2))
    pars = inspect_raw_neighs(neis, range(5))
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set((neis, range(5)))
    assert(len(neighs_info.idxs) == 5)
    assert(len(neighs_info.idxs[0]) == 2)
    assert(len(neighs_info.ks) == 5)
    pars = inspect_raw_neighs(neis[0], 4)
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set((neis[0], 4))
    assert(neighs_info.staticneighs)
    assert(len(neighs_info.idxs) == 2)
    assert(len(neighs_info.ks) == 1)
    pars = inspect_raw_neighs(range(10), 2)
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set((range(10), 2))
    assert(neighs_info.staticneighs)
    assert(len(neighs_info.idxs) == 1)
    assert(len(neighs_info.idxs[0]) == 10)
    assert(len(neighs_info.ks) == 1)
    pars = inspect_raw_neighs(0, range(2))
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set((0, range(2)))
    assert(neighs_info.staticneighs)
    assert(len(neighs_info.idxs) == 1)
    assert(len(neighs_info.ks) == 2)
    pars = inspect_raw_neighs([], 2)
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set(([], 2))
    assert(neighs_info.staticneighs)
    assert(len(neighs_info.idxs) == 1)
    assert(len(neighs_info.idxs[0]) == 0)
    assert(len(neighs_info.ks) == 1)
    pars = inspect_raw_neighs([[]], 2)
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set(([[]], 2))
    assert(neighs_info.staticneighs)
    assert(len(neighs_info.idxs) == 1)
    assert(len(neighs_info.idxs[0]) == 0)
    assert(len(neighs_info.ks) == 1)
    pars = inspect_raw_neighs([[[]]]*2, range(2))
    pars['format_structure'] = 'tuple_k'
    neighs_info = Neighs_Info(**pars)
    neighs_info.set(([[[]]]*2, range(2)))
    assert(len(neighs_info.idxs) == 2)
    assert(len(neighs_info.idxs[0]) == 1)
    assert(len(neighs_info.idxs[0][0]) == 0)
    assert(len(neighs_info.ks) == 2)

    neighsinfo_features_preformatting_tuple((neis, range(5)), 8)
    neighsinfo_features_preformatting_tuple((neis[0], 4), 8)
    neighsinfo_features_preformatting_tuple((range(10), 2), 8)
    neighsinfo_features_preformatting_tuple((0, range(2)), 8)
    neighsinfo_features_preformatting_tuple(([], 2), 8)
    neighsinfo_features_preformatting_tuple(([[]], 2), 8)
    neighsinfo_features_preformatting_tuple(([[[]]]*2, range(2)), 8)