Package: qiskit-alt
qiskit_altqiskit_altThis Python package uses a backend written in Julia to implement high performance features for
standard Qiskit. This package is a proof of concept with little high-level code.Installing and managing Julia and its packages is automated. So you don't need to learn anything about Julia
to get started.Table of contentsInstallation and configuration notesCompilationCompiling a system image to eliminate compilation at run time.Using qiskit_altFirst steps.Manual StepsDetails of automatic installation.IntroductionMotivationsDemonstrationZapata demo of Jordan-Wigner transformation in Julia; The
same thing as the main demonstration in qiskit_alt.Julia PackagesJulia packages that qiskit_alt depends on.TroubleshootingDevelopment. Instructions for developing qiskit_alt.Installation and Configuration NotesBasicqiskit_altis available on pypishell>pipinstallqiskit_altComplete installation by runningimportqiskit_altqiskit_alt.project.ensure_init()Seejulia_projectfor more options.If no Julia executable is found,jill.pywill be used to download and install it. It isnotnecessary
to add the installation path or symlink path to your search PATH to use julia from qiskit_alt.
Before offering to install Julia,qiskit_altwill search for julia asdescribed here.The Julia packages are installed the first time you runqiskit_alt.project.ensure_init()from Python. If this fails,
see the log file qiskit_alt.log. You can open a bug report in theqiskit_altrepoCheck that the installation is not completely broken by running benchmark scripts, with the string "alt" in the name:python./bench/run_all_bench.pyNote that the folderbenchis not included when you install viapip install qiskit_alt.
But it can bedownloaded here.More installation detailsqiskit_altdepends onpyjuliaand/orjuliacallfor communication between Julia and Python.pyjuliaandjuliacallare two packages for communication between Python and Julia. You only need
to import one of them. But, you won't import them directly.When you initialize withqiskit_alt.project.ensure_init()the default communication package is chosen.
You can also choose explicitly withqiskit_alt.project.ensure_init(calljula="pyjulia")orqiskit_alt.project.ensure_init(calljula="juliacall")The installation is interactive. How to do a non-interactive installation with environment variables is
described below.You may allowqiskit_altto download and install Julia for you, usingjill.py.
Otherwise you can follow instructions forinstalling Julia with an installation tool.We recommend using a virtual Python environment withvenvorconda. For examplepython -m venv ./env,
which creates a virtual environment for python packages needed to runqiskit_alt.
You can use whatever name you like in place of the directory./env.Activate the environment using the file required for your shell. For examplesource ./env/bin/activateforvenvand bash.Installqiskit_altwithpip install qiskit_alt.Install whatever other packages you want. For examplepip install ipython.Configuring installation with environment variables. If you set these environment variables, you will not be prompted
during installation.SetQISKIT_ALT_JULIA_PATHto the path to a Julia executable (in a Julia installation). This variable takes
precedence over other methods of specifying the path to the executable.SetQISKIT_ALT_INSTALL_JULIAtoyornto confirm or disallow installing julia viajill.py.SetQISKIT_ALT_COMPILEtoyornto confirm or disallow compiling a system image after installing Julia packagesSetQISKIT_ALT_DEPOTtoyornto force using or not using a Julia "depot" specific to this project.qiskit_alt.project.update()will deleteManifest.tomlfiles; upgrade packages; rebuild the manifest; delete compiled system images.
If you callupdate()while running a compiled system image, you should exit Python and start again before compilingqiskit_alt.projectis an instance ofJuliaProjectfrom the packagejulia_project.
for managing Julia dependencies in Python projects. See more options atjulia_project.CompilationWe highly recommend compiling a system image forqiskit_altto speed up loading and reduce delays due to just-in-time compilation.
You will be prompted to install when installing or upgrading. Compilation may also be done at any time as follows.[1]:importqiskit_altIn[2]:qiskit_alt.project.ensure_init(use_sys_image=False)In[3]:qiskit_alt.project.compile()Compilation takes about four minutes. The new Julia system image will be found  the next time you importqiskit_alt.
Note that we disabled possibly loading a previously-compiled system image before compiling a new one.
This avoids some possible stability issues.Using qiskit_altThis is a very brief introduction.Thepyjuliainterface is exposed via thejuliamodule. Thejuliacallmodule is calledjuliacall.
However you shouldnotdoimport juliaorimport juliacallbeforeimport qiskit_alt,
andqiskit_alt.project.ensure_init()(orqiskit_alt.project.ensure_init(calljulia="pyjulia")orjuliacallwithqiskit_alt.project.ensure_init(calljulia="juliacall"))
This is becauseimport juliawill circumvent the facilities described above for choosing the julia executable and the
compiled system image.Julia modules are loaded like this. Note thatqiskit_alt.project.juliapoints to eitherjuliaorjuliacalldepending
on which was chosen.importqiskit_altqiskit_alt.project.ensure_init(calljulia=interface_choice)Main=qiskit_alt.project.julia.Mainimport qiskit_alt;import julia;from julia import PkgName.
After this, all functions and symbols inPkgNameare available.
You can do, for exampleIn[1]:importqiskit_altIn[2]:qiskit_alt.project.ensure_init()In[3]:julia=qiskit_alt.project.juliaIn[4]:julia.Main.cosd(90)Out[4]:0.0In[5]:QuantumOps=qiskit_alt.project.simple_import("QuantumOps")In[6]:pauli_sum=QuantumOps.rand_op_sum(QuantumOps.Pauli,3,4);pauli_sumOut[6]:<PyCall.jlwrap4x3QuantumOps.PauliSum{Vector{Vector{QuantumOps.Paulis.Pauli}},Vector{Complex{Int64}}}:IIZ*(1+0im)XYI*(1+0im)YIX*(1+0im)ZIZ*(1+0im)>In the last example above,PauliSumis a Julia object. ThePauliSumcan be converted to
a QiskitSparsePauliOplike this.In[7]:fromqiskit_alt.pauli_operatorsimportPauliSum_to_SparsePauliOpIn[8]:PauliSum_to_SparsePauliOp(pauli_sum)Out[8]:SparsePauliOp(['ZII','IYX','XIY','ZIZ'],coeffs=[1.+0.j,1.+0.j,1.+0.j,1.+0.j])IntroductionThe highlights thus far are inbenchmark code, which is
presented in the demonstration notebooks.
There is onedemonstration notebook usingpyjuliaand anotherdemonstration notebook usingjuliacall.The main application-level demonstration is computing a qubit Hamiltonian as aqiskit.quantum_info.SparsePauliOpfrom a Python list specifiying the molecule geometry in the same format as that used byqiskit_nature.The Jordan-Wigner transform in qiskit_alt is 30 or so times faster than in qiskit-nature.Computing a Fermionic Hamiltonian from pyscf integrals is several times faster, with the factor increasing
with the problem size.Converting an operator from the computational basis, as a numpy matrix, to the Pauli basis, as aqiskit.quantum_info.SparsePauliOp,
is many times faster with the factor increasing rapidly in the number of qubits.You might want to skip toinstallation instructionsDemonstrationThere are a few demos in thisdemonstration benchmark notebookThebenchmark codeis a good place to get an idea of what qiskit_alt can do.Here aresome demonstration notebooksof the Julia packages behindqiskit_alt.Zapata demo of Jordan-Wigner transformation in Julia; The
same thing as the main demonstration in qiskit_alt. This is from JuliaCon 2020.Managing Julia packagesAvailable Julia modules are those in the standard library and those listed inProject.toml.
You can add more packages (and record them inProject.toml) by doingqiskit_alt.project.julia.Pkg.add("PackageName").
You can also do the same by avoiding Python and using the julia cli.Julia PackagesThe Julia reposQuantumOps.jlandElectronicStructure.jlandQiskitQuantumInfo.jlare not registered in the General Registry, but rather inQuantumRegistrywhich contains just
a handful of packages for this project.TestingThe test folder is mostly out of date.Testing installation with dockerSeethe readme.