92 lines
2.1 KiB
Python
92 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
# coding: utf-8
|
|
|
|
# # Adjacency Matrix
|
|
|
|
import numpy as np
|
|
|
|
from scipy.sparse import csr_matrix, lil_matrix, coo_matrix
|
|
|
|
|
|
class adj_matrix(object):
|
|
def __init__(self, symmetric_indices=False):
|
|
|
|
self._sym = symmetric_indices
|
|
if not symmetric_indices:
|
|
self._x_labels = []
|
|
self._y_labels = []
|
|
|
|
self._x_label_index={}
|
|
self._y_label_index={}
|
|
|
|
else:
|
|
self._labels = []
|
|
self._label_index={}
|
|
|
|
self._x = []
|
|
self._y = []
|
|
self._data = []
|
|
|
|
self._mat = None
|
|
|
|
def _get_ix(self, label):
|
|
i = self._x_label_index.get(label)
|
|
if i is None:
|
|
i = len(self._x_labels)
|
|
self._x_labels.append(label)
|
|
self._x_label_index[label] = i
|
|
return i
|
|
|
|
def _get_iy(self, label):
|
|
i = self._y_label_index.get(label)
|
|
if i is None:
|
|
i = len(self._y_labels)
|
|
self._y_labels.append(label)
|
|
self._y_label_index[label] = i
|
|
return i
|
|
|
|
def _get_i(self, label):
|
|
i = self._label_index.get(label)
|
|
if i is None:
|
|
i = len(self._labels)
|
|
self._labels.append(label)
|
|
self._label_index[label] = i
|
|
return i
|
|
|
|
def add_entry(self, x, y, data):
|
|
|
|
if self._sym:
|
|
ix = self._get_i(x)
|
|
iy = self._get_i(y)
|
|
|
|
else:
|
|
ix = self._get_ix(x)
|
|
iy = self._get_iy(y)
|
|
|
|
self._x.append(ix)
|
|
self._y.append(iy)
|
|
self._data.append(data)
|
|
|
|
def compile_to_mat(self):
|
|
if self._sym:
|
|
sx = len(self._labels)
|
|
sy = len(self._labels)
|
|
else:
|
|
sx = len(self._x_labels)
|
|
sy = len(self._y_labels)
|
|
|
|
self._mat = coo_matrix((self._data, (self._x, self._y)), shape=(sx,sy))
|
|
return self._mat
|
|
|
|
def get_csr(self):
|
|
return self.compile_to_mat().tocsr()
|
|
|
|
def get_labels(self):
|
|
if self._sym:
|
|
return self._labels
|
|
return self._x_labels, self._y_labels
|
|
|
|
|
|
|
|
|