def __init__(self, a_mat, b_vec, settings):
'''x' = Ax + b (b_vector here is the constant part of the dynamics, NOT the B input-effect matrix in 'BU') '''
if isinstance(a_mat, list):
a_mat = np.array(a_mat, dtype=float)
if isinstance(b_vec, list):
b_vec = np.array(b_vec, dtype=float)
assert isinstance(a_mat, np.ndarray)
assert isinstance(b_vec, np.ndarray)
assert isinstance(settings, SimulationSettings)
assert settings.step > 0
self.settings = settings
self.num_dims = b_vec.shape[0]
assert self.num_dims > 0
assert a_mat.shape[0] == a_mat.shape[1], "expected A matrix to be a square"
assert len(b_vec.shape) == 1, "expected passed-in b_vector to be a single row: {}".format(b_vec)
assert a_mat.shape[0] == b_vec.shape[0], "A matrix and b vector sizes should match"
self.dy_data = DyData(csr_matrix(a_mat), csr_matrix(b_vec), settings.sparse)
# initialize simulation result variables
self.origin_sim = None
self.vec_values = None
self.step_offset = None
# itemsize is bytes per float
if self.settings.sim_mode == SimulationSettings.SIMULATION:
mb_per_step = np.dtype(float).itemsize * self.num_dims * self.num_dims / 1024.0 / 1024.0
self.max_steps_in_mem = max(1, int(settings.sim_in_memory_mb / mb_per_step) - 1)
elif self.settings.sim_mode == SimulationSettings.MATRIX_EXP:
self.max_steps_in_mem = 1
if self.num_dims < 150:
# dense expm is fast if dims < 150
self.matrix_exp = dense_expm(a_mat * settings.step).transpose().copy()
else:
# sparse expm
self.matrix_exp = sparse_expm(csc_matrix(a_mat * settings.step)).transpose().toarray()
self.freeze_attrs()
评论列表
文章目录