diff --git a/docs/run/primitives-examples.mdx b/docs/run/primitives-examples.mdx
index a7885bc664e..9f72119823d 100644
--- a/docs/run/primitives-examples.mdx
+++ b/docs/run/primitives-examples.mdx
@@ -39,8 +39,9 @@ import numpy as np
from qiskit.circuit.library import IQP
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
-from qiskit_ibm_runtime import EstimatorV2 as Estimator, QiskitRuntimeService
+from qiskit_ibm_runtime import EstimatorV2 as Estimator
+from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
estimator = Estimator(backend)
@@ -60,6 +61,11 @@ result = job.result()
print(f" > Expectation value: {result[0].data.evs}")
print(f" > Metadata: {result[0].metadata}")
+```
+Output:
+```text
+ > Expectation value: 0.123046875
+ > Metadata: {'target_precision': 0.015625}
```
@@ -104,16 +110,15 @@ Use Estimator to determine the expectation values of multiple circuit-observable
```python
import numpy as np
-
-from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit.library import IQP
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
-from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator
+from qiskit_ibm_runtime import EstimatorV2 as Estimator
+from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
-pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
+estimator = Estimator(backend)
n_qubits = 127
rng = np.random.default_rng()
@@ -128,6 +133,7 @@ observables = [
]
# Get ISA circuits
+pm = generate_preset_pass_manager(optimization_level=1, backend=backend)
for qc, obs in zip(circuits, observables):
isa_circuit = pm.run(qc)
@@ -142,6 +148,15 @@ for idx in range(len(pubs)):
pub_result = job_result[idx]
print(f">>> Expectation values for PUB {idx}: {pub_result.data.evs}")
print(f">>> Standard errors for PUB {idx}: {pub_result.data.stds}")
+```
+Output:
+```text
+>>> Expectation values for PUB 0: -0.0263671875
+>>> Standard errors for PUB 0: 0.015619567582387688
+>>> Expectation values for PUB 1: -0.017578125
+>>> Standard errors for PUB 1: 0.015622585825382946
+>>> Expectation values for PUB 2: 0.33349609375
+>>> Standard errors for PUB 2: 0.014730491894982241
```
@@ -194,7 +209,8 @@ import numpy as np
from qiskit.circuit import QuantumCircuit, Parameter
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
-from qiskit_ibm_runtime import QiskitRuntimeService
+from qiskit_ibm_runtime import EstimatorV2 as Estimator
+
# Step 1: Map classical inputs to a quantum problem
@@ -217,21 +233,25 @@ ops = [ZZ, ZX, XZ, XX]
# Step 2: Optimize problem for quantum execution.
+from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
+estimator = Estimator(backend)
+
+estimator = Estimator(backend)
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
chsh_isa_circuit = pm.run(chsh_circuit)
isa_observables = [operator.apply_layout(chsh_isa_circuit.layout) for operator in ops]
-from qiskit_ibm_runtime import EstimatorV2 as Estimator
-
# Step 3: Execute using Qiskit primitives.
# Reshape observable array for broadcasting
reshaped_ops = np.fromiter(isa_observables, dtype=object)
reshaped_ops = reshaped_ops.reshape((4, 1))
+from qiskit_ibm_runtime import EstimatorV2 as Estimator
+
estimator = Estimator(backend, options={"default_shots": int(1e4)})
job = estimator.run([(chsh_isa_circuit, reshaped_ops, individual_phases)])
# Get results for the first (and only) PUB
@@ -240,6 +260,47 @@ print(f">>> Expectation values: {pub_result.data.evs}")
print(f">>> Standard errors: {pub_result.data.stds}")
print(f">>> Metadta: {pub_result.metadata}")
```
+
+
+Output
+
+```text
+>>> Expectation values: [[ 0.88525391 0.83837891 0.70458984 0.52880859 0.29150391 -0.00146484
+ -0.28271484 -0.52587891 -0.71777344 -0.83300781 -0.88916016 -0.83935547
+ -0.71826172 -0.53613281 -0.24560547 -0.00830078 0.28320312 0.515625
+ 0.72460938 0.83935547 0.89013672]
+ [-0.00390625 0.25683594 0.515625 0.71337891 0.83691406 0.87548828
+ 0.83105469 0.70605469 0.54150391 0.28222656 0.01269531 -0.27636719
+ -0.52539062 -0.73388672 -0.83203125 -0.88134766 -0.83984375 -0.71386719
+ -0.50390625 -0.25292969 0.02001953]
+ [-0.01464844 -0.26660156 -0.51757812 -0.72216797 -0.83398438 -0.89013672
+ -0.84472656 -0.72070312 -0.52001953 -0.26660156 0.00244141 0.26074219
+ 0.51123047 0.7109375 0.83886719 0.86865234 0.86669922 0.71435547
+ 0.52587891 0.27636719 -0.01025391]
+ [ 0.88525391 0.85986328 0.72509766 0.54101562 0.28125 0.00878906
+ -0.27539062 -0.52636719 -0.71533203 -0.84130859 -0.8828125 -0.83740234
+ -0.72998047 -0.51513672 -0.26171875 0.00537109 0.26660156 0.52636719
+ 0.69677734 0.84521484 0.87353516]]
+>>> Standard errors: [[0.00726731 0.008517 0.01108773 0.01326158 0.0149464 0.01562498
+ 0.01498756 0.01328999 0.01087932 0.00864471 0.00714994 0.00849348
+ 0.01087145 0.01318959 0.0151464 0.01562446 0.01498531 0.01338772
+ 0.01076812 0.00849348 0.00712021]
+ [0.01562488 0.01510086 0.01338772 0.01094966 0.0085521 0.00755061
+ 0.00869048 0.01106496 0.01313591 0.01498981 0.01562374 0.01501644
+ 0.01329471 0.01061362 0.00866764 0.00738232 0.00848169 0.01094189
+ 0.01349622 0.01511695 0.01562187]
+ [0.01562332 0.01505948 0.01336931 0.01080809 0.00862169 0.00712021
+ 0.00836247 0.01083193 0.01334616 0.01505948 0.01562495 0.01508451
+ 0.01342881 0.01098836 0.00850525 0.00774097 0.00779424 0.01093411
+ 0.01328999 0.01501644 0.01562418]
+ [0.00726731 0.00797694 0.01076009 0.01314082 0.01499429 0.0156244
+ 0.01502082 0.01328527 0.01091851 0.00844617 0.00733946 0.00854042
+ 0.01067919 0.01339231 0.01508038 0.01562477 0.01505948 0.01328527
+ 0.01120762 0.00835042 0.00760564]]
+>>> Metadta: {'target_precision': 0.015625}
+```
+
+
@@ -286,7 +347,12 @@ import numpy as np
from qiskit.circuit.library import IQP
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.quantum_info import SparsePauliOp, random_hermitian
-from qiskit_ibm_runtime import QiskitRuntimeService, Session, EstimatorV2 as Estimator
+from qiskit_ibm_runtime import Session, EstimatorV2 as Estimator
+from qiskit_ibm_runtime import QiskitRuntimeService
+
+service = QiskitRuntimeService()
+backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
n_qubits = 127
@@ -304,10 +370,6 @@ another_isa_circuit = pm.run(another_circuit)
isa_observable = observable.apply_layout(isa_circuit.layout)
another_isa_observable = another_observable.apply_layout(another_isa_circuit.layout)
-service = QiskitRuntimeService()
-
-backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
-
with Session(service=service, backend=backend) as session:
estimator = Estimator(session=session)
@@ -327,6 +389,13 @@ with Session(service=service, backend=backend) as session:
print(f" > Another Expectation value: {another_result[0].data.evs}")
print(f" > More Metadata: {another_result[0].metadata}")
```
+Output:
+```text
+ > Expectation value: 0.0048828125
+ > Metadata: {'target_precision': 0.015625}
+ > Another Expectation value: -0.03857421875
+ > More Metadata: {'target_precision': 0.015625}
+ ```
@@ -377,6 +446,7 @@ print(f" > Expectation values job 2: {another_result.values}")
+
## Sampler examples
Generate entire error-mitigated quasi-probability distributions sampled from quantum circuit outputs. Leverage Sampler’s capabilities for search and classification algorithms like Grover’s and QVSM.
@@ -393,11 +463,12 @@ import numpy as np
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.circuit.library import IQP
from qiskit.quantum_info import random_hermitian
-from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
+from qiskit_ibm_runtime import SamplerV2 as Sampler
+from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
-
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
n_qubits = 127
@@ -405,14 +476,25 @@ mat = np.real(random_hermitian(n_qubits, seed=1234))
circuit = IQP(mat)
circuit.measure_all()
+from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
+
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
sampler = Sampler(backend)
job = sampler.run([isa_circuit])
result = job.result()
+
+# Get results for the first (and only) PUB
+pub_result = result[0]
+
+print(f" > Counts: {pub_result.data.meas.get_counts()}")
```
-
+Output
+```text
+ > Counts: {'0101': 103, '0100': 195, '0011': 142, '0000': 237, '1010': 26, '0001': 92, '0110': 18, '1111': 19, '0010': 36, '1100': 5, '0111': 42, '1110': 31, '1011': 27, '1101': 18, '1001': 13, '1000': 20}
+ ```
+
```python
@@ -457,11 +539,12 @@ import numpy as np
from qiskit.circuit.library import IQP
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.quantum_info import random_hermitian
-from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
+from qiskit_ibm_runtime import SamplerV2 as Sampler
+from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
-
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
n_qubits = 127
@@ -480,6 +563,12 @@ result = job.result()
for idx, pub_result in enumerate(result):
print(f" > Counts for pub {idx}: {pub_result.data.meas.get_counts()}")
+```
+Output
+```text
+ > Counts for pub 0: {'0001': 120, '0000': 671, '0101': 21, '0011': 18, '0010': 91, '1001': 7, '1000': 23, '0100': 29, '1110': 2, '0110': 28, '1010': 3, '1111': 2, '1100': 4, '1011': 3, '0111': 2}
+ > Counts for pub 1: {'1001': 31, '1100': 122, '0100': 263, '0101': 86, '1101': 69, '1000': 96, '0001': 51, '1011': 7, '0110': 21, '0000': 163, '0011': 17, '1010': 26, '0010': 48, '1110': 13, '0111': 10, '1111': 1}
+ > Counts for pub 2: {'0000': 694, '0010': 78, '0100': 61, '0011': 21, '0001': 58, '0111': 6, '1000': 26, '0110': 50, '1001': 9, '1010': 3, '1100': 10, '1011': 2, '0101': 4, '1110': 1, '1111': 1}
```
@@ -527,11 +616,12 @@ Run several experiments in a single job, leveraging parameter values to increase
import numpy as np
from qiskit.circuit.library import RealAmplitudes
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
-from qiskit_ibm_runtime import QiskitRuntimeService
# Step 1: Map classical inputs to a quantum problem
-num_qubits = 127
-circuit = RealAmplitudes(num_qubits=num_qubits, reps=2)
+
+n_qubits = 127
+
+circuit = RealAmplitudes(num_qubits=n_qubits, reps=2)
circuit.measure_all()
# Define three sets of parameters for the circuit
@@ -542,8 +632,12 @@ parameter_values = [
# Step 2: Optimize problem for quantum execution.
+from qiskit_ibm_runtime import SamplerV2 as Sampler
+from qiskit_ibm_runtime import QiskitRuntimeService
+
service = QiskitRuntimeService()
-backend = service.least_busy(operational=True, simulator=False, min_num_qubits=num_qubits)
+backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
@@ -559,6 +653,10 @@ result = job.result()
pub_result = result[0]
# Get counts from the classical register "meas".
print(f" >> Counts for the meas output register: {pub_result.data.meas.get_counts()}")
+```
+Output
+```text
+>> Counts for the meas output register: {'1000': 449, '0100': 183, '0110': 475, '1110': 249, '0101': 167, '0111': 116, '1100': 227, '0011': 111, '1101': 123, '1001': 252, '1010': 229, '0001': 37, '0010': 123, '1011': 120, '1111': 156, '0000': 55}
```
@@ -606,7 +704,12 @@ import numpy as np
from qiskit.circuit.library import IQP
from qiskit.quantum_info import random_hermitian
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
-from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler, Session
+from qiskit_ibm_runtime import Session, SamplerV2 as Sampler
+from qiskit_ibm_runtime import QiskitRuntimeService
+
+service = QiskitRuntimeService()
+backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
n_qubits = 127
@@ -618,15 +721,12 @@ mat = np.real(random_hermitian(n_qubits, seed=rng))
another_circuit = IQP(mat)
another_circuit.measure_all()
-service = QiskitRuntimeService()
-
-backend = service.least_busy(operational=True, simulator=False, min_num_qubits=n_qubits)
-
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)
another_isa_circuit = pm.run(another_circuit)
-with Session(service=service, backend=backend) as session:
+#with Session(service=service, backend=backend) as session:
+with Session(backend=backend) as session:
sampler = Sampler(session=session)
job = sampler.run([isa_circuit])
another_job = sampler.run([another_isa_circuit])
@@ -635,9 +735,18 @@ with Session(service=service, backend=backend) as session:
# first job
print(f" > Counts for job 1: {result[0].data.meas.get_counts()}")
-
+```
+Output
+```text
+ > Counts for job 1: {'1110': 39, '0100': 164, '0000': 274, '0010': 40, '0001': 101, '0011': 138, '1101': 20, '1010': 26, '1100': 7, '0101': 83, '0111': 43, '1011': 15, '1001': 14, '1000': 34, '0110': 12, '1111': 14}
+```
+```python
# second job
print(f" > Counts for job 2: {another_result[0].data.meas.get_counts()}")
+```
+Output
+```text
+ > Counts for job 2: {'0000': 285, '0100': 128, '0111': 29, '0110': 147, '0011': 15, '0010': 277, '1110': 10, '1010': 25, '1011': 15, '1000': 32, '0001': 21, '1111': 6, '1100': 10, '1101': 5, '1001': 15, '0101': 4}
```
diff --git a/docs/run/primitives-get-started.mdx b/docs/run/primitives-get-started.mdx
index 35d5befd797..c770dfd5db6 100644
--- a/docs/run/primitives-get-started.mdx
+++ b/docs/run/primitives-get-started.mdx
@@ -35,10 +35,11 @@ Because Qiskit Runtime `Estimator` is a managed service, you first need to initi
Follow the steps in the [Install and set up topic](../start/install) if you don't already have an account.
```python
-from qiskit_ibm_runtime import QiskitRuntimeService
+from qiskit_ibm_runtime import QiskitRuntimeService, EstimatorV2 as Estimator
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
+estimator = Estimator(backend)
```
### 2. Create a circuit and an observable
@@ -60,7 +61,7 @@ print(f">>> Observable: {observable.paulis}")
```
Output
```text
->>> Observable: ['ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ...']
+>>> Observable: ['ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ...']
```
The circuit and observable need to be transformed to only use instructions supported by the system (referred to as *instruction set architecture (ISA)* circuits). We'll use the transpiler to do this.
@@ -230,9 +231,6 @@ Output
>>> Job ID: 58223448-5100-4dec-a47a-942fb30edced
>>> Job Status: JobStatus.RUNNING
```
-
- You need the classical register name to get the results. By default, it is named `meas` when you use `measure_all()`. When defining your circuit, if you create one or more classical registers with a non-default name, use that name to get the results. You can find the classical register name by running `.cregs`. For example, `qc.cregs`.
-
```python
result = job.result()
@@ -264,8 +262,8 @@ print(f" > Metadata: {result.metadata[0]}")
## Get started with the backend primitives
-The `Sampler` primitive can be run with any provider by using [`qiskit.primitives.BackendSampler`](../api/qiskit/qiskit.primitives.BackendSampler). Likewise, the `Estimator` primitive can be run with any provider using [`qiskit.primitives.BackendEstimator`](../api/qiskit/qiskit.primitives.BackendEstimator). Equivalent implementations in V2 are coming soon.
-
+The `Sampler` primitive can be run with any provider by using [`qiskit.primitives.BackendSampler`](../api/qiskit/qiskit.primitives.BackendSampler). Likewise, the `Estimator` primitive can be run with any provider using [`qiskit.primitives.BackendEstimator`](../api/qiskit/qiskit.primitives.BackendEstimator). Equivalent implementations in V2 are coming soon.
+
Some providers implement primitives natively (see [the Qiskit Ecosystem page](https://qiskit.github.io/ecosystem#provider) for more details).
### Example: BackendEstimator