Metadata-Version: 2.1
Name: orquestra-vqa
Version: 0.9.0
Summary: "Orquestra's library with code related to variational quantum algorithms."
Home-page: https://github.com/zapatacomputing/orquestra-vqa
Author: Zapata Computing Inc.
Author-email: info@zapatacomputing.com,
License: Apache Software License 2.0
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Topic :: Scientific/Engineering
Requires-Python: !=3.9.7,>=3.9
Description-Content-Type: text/markdown; charset=UTF-8
License-File: LICENSE
Requires-Dist: orquestra-quantum
Requires-Dist: orquestra-opt
Requires-Dist: orquestra-cirq
Requires-Dist: numpy>=1.20
Requires-Dist: overrides>=3.10
Provides-Extra: dev
Requires-Dist: orquestra-python-dev; extra == "dev"
Requires-Dist: types-setuptools; extra == "dev"

# orquestra-vqa

## What is it?

`orquestra-vqa` is a library with core functionalities for implementing variational quantum algorithms developed by [Zapata](https://www.zapatacomputing.com) for our [Orquestra](https://www.zapatacomputing.com/orquestra/) platform.

`orquestra-vqa` provides:

-   interfaces for implementing ansatzes including qaoa and qcbm.
-   optimizers and cost functions tailored to vqa
-   misc functions such as grouping, qaoa interpolation, and estimators

## Installation

Even though it's intended to be used with Orquestra, `orquestra-vqa` can be also used as a Python module.
To install it you need to run `pip install orquestra-vqa` or `pip install .` from the main directory. This installation will install its dependencies: `orquestra-quantum`, `orquestra-opt` and `orquestra-cirq`.

## Usage

Here's an example of how to use methods from `orquestra-vqa` to create a cost function for qcbm and optimize it using scipy optimizer.

```python
from orquestra.vqa.cost_function.qcbm_cost_function import create_QCBM_cost_function
from orquestra.vqa.ansatz.qcbm import QCBMAnsatz
from orquestra.opt.history.recorder import recorder
from orquestra.quantum.symbolic_simulator import SymbolicSimulator
from orquestra.quantum.distributions import compute_mmd
from orquestra.quantum.distributions import MeasurementOutcomeDistribution
from orquestra.opt.optimizers.scipy_optimizer import ScipyOptimizer
import numpy as np

target_distribution = MeasurementOutcomeDistribution(
    {
        "0000": 1.0,
        "0001": 0.0,
        "0010": 0.0,
        "0011": 1.0,
        "0100": 0.0,
        "0101": 1.0,
        "0110": 0.0,
        "0111": 0.0,
        "1000": 0.0,
        "1001": 0.0,
        "1010": 1.0,
        "1011": 0.0,
        "1100": 1.0,
        "1101": 0.0,
        "1110": 0.0,
        "1111": 1.0,
    }
)

def orquestra_vqa_example_function():
    ansatz = QCBMAnsatz(1, 4, "all")
    backend = SymbolicSimulator()
    distance_measure_kwargs = {
                "distance_measure": compute_mmd,
                "distance_measure_parameters": {"sigma": 1},
            }
    cost_function = create_QCBM_cost_function(
        ansatz,
        backend,
        10,
        **distance_measure_kwargs,
        target_distribution=target_distribution
    )

    optimizer = ScipyOptimizer(method="L-BFGS-B")
    initial_params = np.ones(ansatz.number_of_params) / 5
    opt_results = optimizer.minimize(cost_function, initial_params)

    return opt_results

orquestra_vqa_example_function()
```

## Development and Contribution

You can find the development guidelines in the [`orquestra-quantum` repository](https://github.com/zapatacomputing/orquestra-quantum).
