def set_unitary(self, V): """Parse input and set the unitary operator attributes. This also sets up the potential function attributes in the process. """ if isinstance(V, str): try: if V.strip().replace(".", "").replace("-", "").replace("e", "").isnumeric(): self.V_name = "" self.V_latex = str(np.round(float(V), 2)) if float(V) == 0: V = 1e-30 V_f = float(V) * np.ones([self.N]) self.U_t = UnitaryOperator1D(np.copy(V_f)) self.V_x = 0.0 * V_f else: V_f = scale(float(V) * np.ones([self.N]), 15) self.V_x = V_f self.U_t = UnitaryOperator1D(np.copy(V_f)) self.V_latex = "%sk" % (self.V_latex) if V_f[0] > 0\ else " %sk" % (self.V_latex) self.V_params = {} self.V_base = None else: V = V.replace("^", "**") f = Function(V, "x") self.V = lambda x: f(x, *f.get_tupled_default_values()) self.V_x = scale(self.V(self.x), 15) self.V_name = str(f) self.V_latex = "$" + f.multiply_latex_string("k") + "$" self.U_t = UnitaryOperator1D(self.V) self.V_base = f self.V_params = f.get_enumerated_default_values() except (TypeError, AttributeError, SyntaxError, ValueError, NameError) as E: print(E) elif isinstance(V, np.ndarray): self.V_params = {} self.V_base = None self.V = None self.V_x = scale(V, 15) self.V_name = "V(x)" self.V_latex = "$V(x)$" self.U_t = UnitaryOperator1D(V) else: print("Unable to parse input") if hasattr(self, "lines"): self.update_draw_potential()