--------------------------------- Sampling the Matrix Product State --------------------------------- The following code example illustrates how to define a tensor network state for a given quantum circuit, then compute its Matrix Product State (MPS) factorization, and, finally, sample the MPS-factorized state. The full code can be found in the `NVIDIA/cuQuantum `_ repository (`here `_). -------------------------- Headers and error handling -------------------------- .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #1 :end-before: Sphinx: MPS Sampler #2 ------------------------------------------------------------------------------------ Define the tensor network state and the desired number of output samples to generate ------------------------------------------------------------------------------------ Let's define a tensor network state corresponding to a 16-qubit quantum circuit and request to produce 100 output samples for the full qubit register. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #2 :end-before: Sphinx: MPS Sampler #3 ----------------------------------------- Initialize the cuTensorNet library handle ----------------------------------------- .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #3 :end-before: Sphinx: MPS Sampler #4 --------------------------- Define quantum gates on GPU --------------------------- .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #4 :end-before: Sphinx: MPS Sampler #5 -------------------- Allocate MPS tensors -------------------- Here we set the shapes of MPS tensors and allocate GPU memory for their storage. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #5 :end-before: Sphinx: MPS Sampler #6 ---------------------------------- Allocate the scratch buffer on GPU ---------------------------------- .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #6 :end-before: Sphinx: MPS Sampler #7 ---------------------------------- Create a pure tensor network state ---------------------------------- Now let's create a pure tensor network state for a 16-qubit quantum circuit. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #7 :end-before: Sphinx: MPS Sampler #8 ------------------- Apply quantum gates ------------------- Let's construct the GHZ quantum circuit by applying the corresponding quantum gates. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #8 :end-before: Sphinx: MPS Sampler #9 ------------------------------------------------------------- Request MPS factorization for the final quantum circuit state ------------------------------------------------------------- Here we express our intent to factorize the final quantum circuit state using MPS factorization. The provided shapes of the MPS tensors refer to their maximal size limit during the MPS renormalization procedure. The actually computed shapes of the final MPS tensors may be smaller. No computation is done here yet. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #9 :end-before: Sphinx: MPS Sampler #10 ------------------------------------- Configure MPS factorization procedure ------------------------------------- After expressing our intent to perform MPS factorization of the final quantum circuit state, we can also configure the MPS factorization procedure by resetting different options, for example, the SVD algorithm. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #10 :end-before: Sphinx: MPS Sampler #11 -------------------------------------------- Prepare the computation of MPS factorization -------------------------------------------- Let's create a workspace descriptor and prepare the computation of MPS factorization. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #11 :end-before: Sphinx: MPS Sampler #12 ------------------------- Compute MPS factorization ------------------------- Once the MPS factorization procedure has been configured and prepared, let's compute the MPS factorization of the final quantum circuit state. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #12 :end-before: Sphinx: MPS Sampler #13 --------------------------------------- Create the tensor network state sampler --------------------------------------- Once the quantum circuit has been constructed and factorized using the MPS representation, let's create the tensor network state sampler for the full qubit register (all qubits). .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #13 :end-before: Sphinx: MPS Sampler #14 ------------------------------------------ Configure the tensor network state sampler ------------------------------------------ Now we can configure the tensor network state sampler by setting the number of hyper-samples to be used by the tensor network contraction path finder. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #14 :end-before: Sphinx: MPS Sampler #15 ---------------------------------------- Prepare the tensor network state sampler ---------------------------------------- Let's prepare the tensor network state sampler. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #15 :end-before: Sphinx: MPS Sampler #16 -------------------- Set up the workspace -------------------- Now we can set up the required workspace buffer. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #16 :end-before: Sphinx: MPS Sampler #17 --------------------------------------------------- Perform sampling of the final quantum circuit state --------------------------------------------------- Once everything had been set up, we perform sampling of the quantum circuit state and print the output samples. .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #17 :end-before: Sphinx: MPS Sampler #18 -------------- Free resources -------------- .. literalinclude:: ../../../../tensor_network/samples/high_level/mps_sampling_example.cu :language: c++ :linenos: :lineno-match: :start-after: Sphinx: MPS Sampler #18