def visit_pow(self, expr): for exp in expr.expr: exp.visit(self) if (expr.expr[0].type == T_NUMBER and expr.expr[0].str == "e"): comp = expr.expr[1].value expr.value = e**comp else: expr.value = expr.expr[0].value**expr.expr[1].value
def visit_tensor(self, expr): for exp in expr.expr: exp.visit(self) if (expr[1].type == T_NUMBER): expr.value = np.kron(expr[0].value, expr[0].value) for _ in range(int(expr[1].value) - 2): expr.value = np.kron(expr.value, expr[0].value) else: expr.value = np.kron(expr[0].value, expr[1].value)
def visit_mult(self, expr): for exp in expr.expr: exp.visit(self) if (expr[0].type == T_MEASUREMENT and expr[1].type == T_KET): try: expr.value = 1 / sqrt(expr[1].value.conj().T.dot( expr[0].value.conj().T).dot(expr[0].value).dot( expr[1].value)[0][0]) * expr[0].value.dot( expr[1].value) except ZeroDivisionError: expr.value = None elif (expr[0].type == T_MATRIX and expr[1].type == T_KET): (_, mt) = expr[0].value.shape (k, _) = expr[1].value.shape while (mt > k): expr[1].value = np.kron(expr[1].value, q[0].T) (k, _) = expr[1].value.shape while (mt < k): expr[0].value = np.kron(expr[0].value, np.identity(2)) (_, mt) = expr[0].value.shape expr.value = expr[0].value.dot(expr.expr[1].value) elif (expr[0].type == T_MATRIX and expr[1].type == T_MATRIX): (_, m1) = expr[0].value.shape (m2, _) = expr[1].value.shape while (m1 > m2): expr[1].value = np.kron(expr[1].value, np.identity(2)) (m2, _) = expr[1].value.shape while (m1 < m2): expr[0].value = np.kron(expr[0].value, np.identity(2)) (_, m1) = expr[0].value.shape expr.value = expr[0].value * expr[1].value else: expr.value = expr.expr[0].value * expr.expr[1].value if (isinstance(expr.value, np.ndarray) and expr.value.shape == (1, 1)): expr.value = expr.value.A1[0]
def visit_div(self, expr): for exp in expr.expr: exp.visit(self) expr.value = expr.expr[0].value for exp in expr.expr[1:]: expr.value = expr.value / exp.value
def visit_dot(self, expr): for exp in expr.expr: exp.visit(self) expr.value = expr.expr[0].value for exp in expr.expr[1:]: expr.value = expr.value.dot(exp.value)
def visit_sub(self, expr): for exp in expr.expr: exp.visit(self) expr.value = expr.expr[0].value for exp in expr.expr[1:]: expr.value = expr.value - exp.value
def visit_add(self, expr): for exp in expr.expr: exp.visit(self) expr.value = expr.expr[0].value for exp in expr.expr[1:]: expr.value = expr.value + exp.value
def visit_inner(self, expr): for exp in expr.expr: exp.visit(self) expr.value = expr.expr[0].value.dot(expr.expr[1].value)[0][0]