Ejemplo n.º 1
0
def changeofbasis(dimension, degree):
    liebasis = ts.logsigkeys(dimension, degree)
    tensorbasis = ts.sigkeys(dimension, degree)
    n = ts.logsigdim(dimension, degree)
    m = ts.sigdim(dimension, degree)
    matrix = np.zeros((n, m))
    pos = tensorbasis.split()
    columnindex = []
    pos[0] = '(0)'
    for row in pos:
        row = row.strip('(')
        row = row.strip(')')
        row = row.split(',')

        row = [int(i) for i in row]
        columnindex.append(row)
    #print(columnindex)

    rowindex = liebasis.split()
    expand = []
    for i in range(n):
        B = Lietotensor(rowindex[i])
        #print(B)
        for j in B:
            for k in range(m):
                #print(type(j[1]))
                #print(type(k))
                if j[1] == columnindex[k]:
                    matrix[i][k] = matrix[i][k] + j[0]
    return matrix
Ejemplo n.º 2
0
def siglen(dim,deg,islog):
    
    dim = int(dim)  
    deg = int(deg)
    islog = int(islog)
    if (islog):
        return(ts.logsigdim(dim,deg))
    else:
        return(ts.sigdim(dim,deg))
    end
Ejemplo n.º 3
0
def categorical_path_sig(node_index, mol, adjacent_matrix, index_map, L,
                         cat_dim, sig_deg, flag):
    """function will output the signatures/logsignatures of categorical path of a node up to radius L
    input: node_index
           adjacent matrix
        mol:molecule information dictionary
           index_map: a dictionary assign atom labels to each index of categorical path
           L: radius around the node
           cat_dim: number of atom types
           sig_deg:degree of signature
           flag: 0 return signature, 1 return log-signature
    output: signatures/logsignatures of the all categorical paths of the node up to length L
            has shape (m,n), m depends on the number of paths at each L, n depends on the cat_dim and sig_deg


    """
    sig_dim = ts.sigdim(cat_dim, sig_deg)
    logsig_dim = ts.logsigdim(cat_dim, sig_deg)
    signatures = None
    log_signatures = None
    if (flag == 0):
        for i in range(L):
            paths = get_paths(node_index, adjacent_matrix, i + 1)
            num_path = len(paths)
            paths_sig = np.zeros([num_path, sig_dim], dtype=float)
            k = 0

            for path in paths:
                mat = categorical_path(path, mol, cat_dim, index_map, i)
                paths_sig[k, ] = ts.stream2sig(np.transpose(mat), sig_deg)
                k = k + 1
            if signatures is None:
                signatures = paths_sig
            else:
                signatures = np.concatenate(([signatures, paths_sig]), axis=0)
        return (signatures)
    elif (flag == 1):
        for i in range(L):
            paths = get_paths(node_index, adjacent_matrix, i + 1)
            num_path = len(paths)
            paths_logsig = np.zeros([num_path, logsig_dim], dtype=float)
            k = 0

            for path in paths:
                mat = categorical_path(path, mol, cat_dim, index_map, i)
                paths_logsig[k, ] = ts.stream2logsig(np.transpose(mat),
                                                     sig_deg)
                k = k + 1
            if log_signatures is None:
                log_signatures = paths_logsig
            else:
                log_signatures = np.concatenate(
                    ([log_signatures, paths_logsig]), axis=0)
        return log_signatures
Ejemplo n.º 4
0
def coordinate_path_sig(node_index, mol, adjacent_matrix, L, sig_deg, flag):
    """
    function will output the signatures/logsignatures of coordinate path of a node up to radius L
    Input: node_index: starting node
           adjacent_matrix: the matrix shows the connection between atoms
           mol:molecule information dictionary
           L: length of path
           sig_deg: degree of signature
           flag: 0 return signature, 1 return log_signature
    output: signatures/logsignatures of the all coordinate paths of the node up to length L
            has shape (m,n), m depends on the number of paths at each L, n= sig_dim/logsig_dim
    """
    sig_dim = ts.sigdim(3, sig_deg)
    logsig_dim = ts.logsigdim(3, sig_deg)
    signatures = None
    log_signatures = None
    if (flag == 0):
        for i in range(L):
            paths = get_paths(node_index, adjacent_matrix, i + 1)
            num_path = len(paths)
            paths_sig = np.zeros([num_path, sig_dim])
            #paths_logsig = np.zeros([num_path, logsig_dim])
            k = 0
            for path in paths:
                temp = np.zeros([len(path), 3])
                for j in range(len(path)):
                    temp[j, :] = mol['atoms'][path[j]].features
                paths_sig[k, ] = ts.stream2sig(temp, sig_deg)
                #paths_logsig[k,] = ts.stream2logsig(temp, sig_deg)
                k = k + 1
            if signatures is None:
                signatures = paths_sig
            else:
                signatures = np.concatenate(([signatures, paths_sig]), axis=0)
        return (signatures)
    if (flag == 1):
        for i in range(L):
            paths = get_paths(node_index, adjacent_matrix, i + 1)
            num_path = len(paths)
            paths_logsig = np.zeros([num_path, logsig_dim])
            k = 0
            for path in paths:
                temp = np.zeros([len(path), 3])
                for j in range(len(path)):
                    temp[j, :] = mol['atoms'][path[j]].features
                paths_logsig[k, ] = ts.stream2logsig(temp, sig_deg)
                k = k + 1
            if log_signatures is None:
                log_signatures = paths_logsig
            else:
                log_signatures = np.concatenate(
                    ([log_signatures, paths_logsig]), axis=0)
        return log_signatures
Ejemplo n.º 5
0
 def log_sig_dim(self, dimension, depth):
     """
     Get the number of elements in the log signature
     """
     return tosig.logsigdim(dimension, depth)