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 _get_hs_of_t_ts_controlled( model: Model, gen: Generator, instr: Instruction, prop_res=1 ) -> Dict: """ Return a Dict containing: - a list of H(t) = H_0 + sum_k c_k H_k. - time slices ts - timestep dt Parameters ---------- prop_res : tf.float resolution required by the propagation method h0 : tf.tensor Drift Hamiltonian. hks : list of tf.tensor List of control Hamiltonians. cflds_t : array of tf.float Vector of control field values at time t. ts : float Length of one time slice. """ Hs = [] ts = [] gen.resolution = prop_res * gen.resolution signal = gen.generate_signals(instr) h0, hctrls = model.get_Hamiltonians() signals = [] hks = [] for key in signal: signals.append(signal[key]["values"]) ts = signal[key]["ts"] hks.append(hctrls[key]) cflds = tf.cast(signals, tf.complex128) hks = tf.cast(hks, tf.complex128) for ii in range(cflds[0].shape[0]): cf_t = [] for fields in cflds: cf_t.append(tf.cast(fields[ii], tf.complex128)) Hs.append(sum_h0_hks(h0, hks, cf_t)) dt = tf.constant(ts[1 * prop_res].numpy() - ts[0].numpy(), dtype=tf.complex128) return {"Hs": Hs, "ts": ts[::prop_res], "dt": dt}
confusion_row2 = Quantity(value=val2, min_val=min, max_val=max, unit="") conf_matrix = ConfusionMatrix(Q1=confusion_row1, Q2=confusion_row2) init_temp = 50e-3 init_ground = InitialiseGround(init_temp=Quantity( value=init_temp, min_val=-0.001, max_val=0.22, unit="K")) model = Model( [S], # Individual, self-contained components [drive], # Interactions between components [conf_matrix, init_ground], # SPAM processing ) model.set_dressed(False) hdrift, hks = model.get_Hamiltonians() @pytest.mark.unit def test_SNAIL_eigenfrequencies_1() -> None: "Eigenfrequency of SNAIL" assert (hdrift[1, 1] - hdrift[0, 0] == freq_S * 2 * np.pi ) # for the 0.2dev version, comment out the 2 pi # TODO: Check full hamiltonian @pytest.mark.unit def test_three_wave_mixer_properties() -> None: "Test if the values of the three wave mixer element are assigned correctly"