def pwc(model: Model, gen: Generator, instr: Instruction) -> Dict: """ Solve the equation of motion (Lindblad or Schrรถdinger) for a given control signal and Hamiltonians. Parameters ---------- signal: dict Waveform of the control signal per drive line. gate: str Identifier for one of the gates. Returns ------- unitary Matrix representation of the gate. """ signal = gen.generate_signals(instr) # Why do I get 0.0 if I print gen.resolution here?! FR ts = [] if model.controllability: h0, hctrls = model.get_Hamiltonians() signals = [] hks = [] for key in signal: signals.append(signal[key]["values"]) ts = signal[key]["ts"] hks.append(hctrls[key]) signals = tf.cast(signals, tf.complex128) hks = tf.cast(hks, tf.complex128) else: h0 = model.get_Hamiltonian(signal) ts_list = [sig["ts"][1:] for sig in signal.values()] ts = tf.constant(tf.math.reduce_mean(ts_list, axis=0)) hks = None signals = None if not np.all( tf.math.reduce_variance(ts_list, axis=0) < 1e-5 * (ts[1] - ts[0]) ): raise Exception("C3Error:Something with the times happend.") if not np.all( tf.math.reduce_variance(ts[1:] - ts[:-1]) < 1e-5 * (ts[1] - ts[0]) ): raise Exception("C3Error:Something with the times happend.") dt = tf.constant(ts[1].numpy() - ts[0].numpy(), dtype=tf.complex128) batch_size = tf.constant(len(h0), tf.int32) dUs = tf_batch_propagate(h0, hks, signals, dt, batch_size=batch_size) U = tf_matmul_left(tf.cast(dUs, tf.complex128)) if model.max_excitations: U = model.blowup_excitations(tf_matmul_left(tf.cast(dUs, tf.complex128))) dUs = tf.vectorized_map(model.blowup_excitations, dUs) return {"U": U, "dUs": dUs, "ts": ts}
def rk4(model: Model, gen: Generator, instr: Instruction, init_state=None) -> Dict: prop_res = 2 dim = model.tot_dim Hs = [] ts = [] dUs = [] dict_vals = get_hs_of_t_ts(model, gen, instr, prop_res) Hs = dict_vals["Hs"] ts = dict_vals["ts"] dt = dict_vals["dt"] dUs = gen_dus_rk4(Hs, dt, dim) U = gen_u_rk4(Hs, dt, dim) if model.max_excitations: U = model.blowup_excitations(U) dUs = tf.vectorized_map(model.blowup_excitations, dUs) return {"U": U, "dUs": dUs, "ts": ts}