def tf_propagation_lind(h0, hks, col_ops, cflds_t, dt, history=False): col_ops = tf.cast(col_ops, dtype=tf.complex128) dt = tf.cast(dt, dtype=tf.complex128) if hks is not None and cflds_t is not None: cflds_t = tf.cast(cflds_t, dtype=tf.complex128) hks = tf.cast(hks, dtype=tf.complex128) cflds = tf.expand_dims(tf.expand_dims(cflds_t, 2), 3) hks = tf.expand_dims(hks, 1) h0 = tf.expand_dims(h0, 0) prod = cflds * hks h = h0 + tf.reduce_sum(prod, axis=0) else: h = h0 h_id = tf.eye(h.shape[-1], batch_shape=[h.shape[0]], dtype=tf.complex128) l_s = tf_kron(h, h_id) r_s = tf_kron(h_id, tf.linalg.matrix_transpose(h)) lind_op = -1j * (l_s - r_s) col_ops_id = tf.eye( col_ops.shape[-1], batch_shape=[col_ops.shape[0]], dtype=tf.complex128 ) l_col_ops = tf_kron(col_ops, col_ops_id) r_col_ops = tf_kron(col_ops_id, tf.linalg.matrix_transpose(col_ops)) super_clp = tf.matmul(l_col_ops, r_col_ops, adjoint_b=True) anticom_L_clp = 0.5 * tf.matmul(l_col_ops, l_col_ops, adjoint_a=True) anticom_R_clp = 0.5 * tf.matmul(r_col_ops, r_col_ops, adjoint_b=True) clp = tf.expand_dims( tf.reduce_sum(super_clp - anticom_L_clp - anticom_R_clp, axis=0), 0 ) lind_op += clp dU = tf.linalg.expm(lind_op * dt) return dU
def confuse(self, pops): """ Apply the confusion (or misclassification) matrix to populations. Parameters ---------- pops : list Populations Returns ------- list Populations after misclassification. """ conf_matrix = tf.Variable([[1]], dtype=tf.float64) for conf_row in self.params.values(): row1 = conf_row.get_value() row2 = tf.ones_like(row1) - row1 conf_mat = tf.concat([[row1], [row2]], 0) conf_matrix = tf_utils.tf_kron(conf_matrix, conf_mat) pops = tf.linalg.matmul(conf_matrix, pops) return pops
def test_tf_kron(): for el in data["tf_kron"]: np.testing.assert_allclose(actual=tf_kron(*el["in"]), desired=el["desired"])