r"""Use of reference_circuit_builder to prepare a circuit for a multireference state.""" # imports from math import sqrt from inquanto.ansatzes import ( multi_configuration_preparator, multi_configuration_preparator_sparse, reference_circuit_builder, CircuitAnsatz, ) from inquanto.states import QubitState, QubitStateString # 2 basis states, 4 qubits # we set our coefficients here so that the multiconfigstate will be normalized qss_1, coeff_qss1 = QubitStateString([1, 1, 0, 0]), sqrt(3 / 4) qss_2, coeff_qss2 = QubitStateString([0, 0, 1, 1]), sqrt(1 / 4) qubit_states = QubitState( { qss_1: coeff_qss1, qss_2: coeff_qss2, } ) # We can create a non-symbolic circuit corresponding to the linear combination of terms within the qubit_states. # We can do this using either multi_configuration_preparator (MultiConfigurationState), # or using multi_configuration_preparator_sparse (MultiConfigurationStateSparse). print("\nCircuit created by MultiConfigurationState") multi_state_circ = reference_circuit_builder( qubit_states, multireference_builder=multi_configuration_preparator ) # Here an Ansatz is constructed from multi_state_circ to make use of InQuanto's ansatz features ref_circ_ansatz = CircuitAnsatz(multi_state_circ) print("Ansatz report:\n", ref_circ_ansatz.generate_report()) print("Circuit resources:", ref_circ_ansatz.circuit_resources()) print("Dataframe of state vector:\n", ref_circ_ansatz.df_numeric()) print("\nCircuit created by MultiConfigurationStateSparse") multi_state_circ_sparse = reference_circuit_builder( qubit_states, multireference_builder=multi_configuration_preparator_sparse ) # Here an Ansatz is constructed from multi_state_circ_sparse to make use of InQuanto's ansatz features ref_circ_ansatz_sparse = CircuitAnsatz(multi_state_circ_sparse) print("Ansatz report:\n", ref_circ_ansatz_sparse.generate_report()) print("Circuit resources:", ref_circ_ansatz_sparse.circuit_resources()) print("Dataframe of state vector:\n", ref_circ_ansatz_sparse.df_numeric())