Source code for aequilibrae.project.data.matrix_record
from os import unlink
from os.path import isfile, join
from aequilibrae.matrix.aequilibrae_matrix import AequilibraeMatrix
from aequilibrae.project.network.safe_class import SafeClass
from aequilibrae.utils.db_utils import commit_and_close
[docs]
class MatrixRecord(SafeClass):
def __init__(self, data_set: dict, project):
super().__init__(data_set, project)
self._exists: bool
self.fldr: str
self.__dict__["_exists"] = True
self.__dict__["fldr"] = join(project.project_base_path, "matrices")
[docs]
def save(self):
"""Saves matrix record to the project database"""
with commit_and_close(self.connect_db()) as conn:
sql = "select count(*) from matrices where name=?"
if conn.execute(sql, [self.name]).fetchone()[0] == 0:
data = [str(self.name), str(self.file_name), int(self.cores)]
conn.execute("Insert into matrices (name, file_name, cores) values(?,?,?)", data)
for key, value in self.__dict__.items():
if key != "name" and key in self.__original__:
v_old = self.__original__.get(key, None)
if value != v_old and value:
self.__original__[key] = value
conn.execute(f"update matrices set '{key}'=? where name=?", [value, self.name])
[docs]
def delete(self):
"""Deletes this matrix record and the underlying data from disk"""
with commit_and_close(self.connect_db()) as conn:
conn.execute("DELETE FROM matrices where name=?", [self.name])
if isfile(join(self.fldr, self.file_name)):
try:
unlink(join(self.fldr, self.file_name))
except Exception as e:
self._logger.error(f"Could not remove matrix from disk: {e.args}")
self.__dict__["_exists"] = False
[docs]
def update_cores(self):
"""Updates this matrix record with the matrix core count in disk"""
self.__dict__["cores"] = self.__get_cores()
[docs]
def get_data(self) -> AequilibraeMatrix:
"""Returns the actual matrix for further computation
Returns:
matrix (:obj:`AequilibraeMatrix`:) Matrix object
"""
mat = AequilibraeMatrix()
mat.load(join(self.fldr, self.file_name))
return mat
def __setattr__(self, instance, value) -> None:
with commit_and_close(self.connect_db()) as conn:
sql = f"Select count(*) from matrices where LOWER({instance})=?"
qry_value = sum(conn.execute(sql, [str(value).lower()]).fetchone())
if qry_value > 0:
if instance == "name":
raise ValueError("Another matrix with this name already exists")
elif instance == "file_name":
raise ValueError("There is another matrix record for this file")
self.__dict__[instance] = value
if instance in ["file_name", "cores"]:
self.__dict__["cores"] = self.__get_cores()
def __get_cores(self) -> int:
mat = AequilibraeMatrix()
mat.load(join(self.fldr, self.file_name))
cores = len(mat.names)
mat.close()
del mat
return cores