528 lines
21 KiB
Plaintext
528 lines
21 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "97b94d47-ba58-4251-91f2-93097e50f2c9",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Introduction to Qiskit Functions\n",
|
|
"<LegacyContent>\n",
|
|
"<Admonition type=\"note\" title=\"Notes\">\n",
|
|
"* This documentation is relevant to IBM Quantum® Platform Classic. If you need the newer version, go to the new [IBM Quantum Platform documentation.]( https://quantum.cloud.ibm.com/docs/guides/functions)\n",
|
|
"* Qiskit Functions are an experimental feature available only to IBM Quantum® Premium Plan users. They are in preview release status and subject to change.\n",
|
|
"</Admonition>\n",
|
|
"</LegacyContent>\n",
|
|
"<CloudContent>\n",
|
|
"<Admonition type=\"note\" title=\"Notes\">\n",
|
|
"* This documentation is relevant to the new IBM Quantum® Platform. If you need the previous version, return to the [IBM Quantum Platform Classic documentation.](https://docs.quantum.ibm.com/guides/functions)\n",
|
|
"* Qiskit Functions are an experimental feature available only to IBM Quantum® Premium Plan users. They are in preview release status and subject to change.\n",
|
|
"</Admonition>\n",
|
|
"</CloudContent>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "a4c425ca-c6c6-4232-b4b9-b2a365d10ad9",
|
|
"metadata": {
|
|
"tags": [
|
|
"version-info"
|
|
]
|
|
},
|
|
"source": [
|
|
"<details>\n",
|
|
"<summary><b>Package versions</b></summary>\n",
|
|
"\n",
|
|
"The code on this page was developed using the following requirements.\n",
|
|
"We recommend using these versions or newer.\n",
|
|
"\n",
|
|
"```\n",
|
|
"qiskit[all]~=1.4.1\n",
|
|
"qiskit-ibm-runtime~=0.37.0\n",
|
|
"qiskit-ibm-catalog~=0.4\n",
|
|
"```\n",
|
|
"</details>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1fe03d0f-c7bb-439b-b98e-91ca400b62fc",
|
|
"metadata": {},
|
|
"source": [
|
|
"Qiskit Functions simplify and accelerate utility-scale algorithm discovery and application development, by abstracting away parts of the quantum software development workflow. In this way, Qiskit Functions free up time normally spent hand-writing code and fine-tuning experiments.\n",
|
|
"\n",
|
|
"\n",
|
|
"Functions come in two forms:\n",
|
|
"\n",
|
|
"| Type | What does it do? | Example inputs and outputs | Who is it for? |\n",
|
|
"| - | - | - | - |\n",
|
|
"| Circuit function | Simplified interface for running circuits. Abstracts transpilation, error suppression, error mitigation | **Input**: Abstract `PUB`s <br/> **Output**: Mitigated expectation values | Researchers using Qiskit to discover new algorithms and applications, without needing to focus on optimizing for hardware or handling error. Circuit functions can be used to build custom application functions. |\n",
|
|
"| Application function | Covers higher-level tasks, like exploring algorithms and domain-specific use cases. Abstracts quantum workflow to solve tasks, with classical inputs and outputs | **Input**: Molecules, graphs <br/> **Output**: Energy, cost | Researchers in non-quantum domains, integrating quantum into existing large-scale classical workflows, without needing to map classical data to quantum circuits. |"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5e5b0531-f286-4573-8b1e-664ca5496d2d",
|
|
"metadata": {},
|
|
"source": [
|
|
"Functions are provided by IBM® and third-party partners. Each is performant for specific workload characteristics and have unique performance-tuning options. Premium Plan users can get started with IBM Qiskit Functions for free, or procure a license from one of the partners who have contributed a function to the catalog.\n",
|
|
"\n",
|
|
"## Get started with Qiskit Functions\n",
|
|
"\n",
|
|
"### Install Qiskit Functions Catalog client\n",
|
|
"\n",
|
|
"<LegacyContent>\n",
|
|
"1. To start using Qiskit Functions, install the IBM Qiskit Functions Catalog client:\n",
|
|
"\n",
|
|
" ```\n",
|
|
" pip install qiskit-ibm-catalog\n",
|
|
" ```\n",
|
|
"1. Retrieve your API key from the [IBM Quantum account page](https://quantum.ibm.com/account), and activate your Python virtual environment. See the [installation instructions](/docs/guides/install-qiskit#local) if you do not already have a virtual environment set up.\n",
|
|
"</LegacyContent>\n",
|
|
"<CloudContent>\n",
|
|
"1. To start using Qiskit Functions, install the IBM Qiskit Functions Catalog client:\n",
|
|
"\n",
|
|
" ```\n",
|
|
" pip install qiskit-ibm-catalog\n",
|
|
" ```\n",
|
|
"1. Retrieve your API key from the [IBM Quantum Platform dashboard](https://quantum.cloud.ibm.com/), and activate your Python virtual environment. See the [installation instructions](/docs/guides/install-qiskit#local) if you do not already have a virtual environment set up.\n",
|
|
"</CloudContent>\n",
|
|
"\n",
|
|
" <span id=\"save-account\"></span>**If you are working in a trusted Python environment (such as on a personal laptop or workstation),** use the `save_account()` method to save your credentials locally. ([Skip to the next step](#functions-untrusted) if you are not using a trusted environment, such as a shared or public computer, to authenticate to IBM Quantum Platform.)\n",
|
|
"\n",
|
|
" To use `save_account()`, run `python` in your shell, then enter the following:\n",
|
|
"\n",
|
|
" ```python\n",
|
|
" from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
|
|
"\n",
|
|
" QiskitFunctionsCatalog.save_account(token=\"<your-token>\")\n",
|
|
" ```\n",
|
|
"\n",
|
|
" Type `exit()`. From now on, whenever you need to authenticate to the service, you can load your credentials with `QiskitFunctionsCatalog()`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"id": "6699700c-ae26-4c10-8d09-05ee77a1afb7",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Load saved credentials\n",
|
|
"from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
|
|
"\n",
|
|
"catalog = QiskitFunctionsCatalog()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "a00d2d76-dfbe-4a92-be82-8dea393ff12a",
|
|
"metadata": {},
|
|
"source": [
|
|
"<LegacyContent>\n",
|
|
"3. <span id=\"functions-untrusted\"></span>**Avoid executing code on an untrusted machine or an external cloud Python environment to minimize security risks.** If you must use an untrusted environment (on, for example, a public computer), change your API key after each use by expiring it on the [IBM Quantum Platform dashboard](https://quantum.ibm.com/) (click the refresh button in the API key field) to reduce risk. To initialize the service in this situation, expand the following section to view code you can use:\n",
|
|
"\n",
|
|
" <details>\n",
|
|
" <summary>Initialize the service in an untrusted environment</summary>\n",
|
|
"\n",
|
|
" ```python\n",
|
|
" from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
|
|
"\n",
|
|
" # After using the following code, go to your dashboard\n",
|
|
" # and expire your API key (click the refresh button in the API key field)\n",
|
|
" catalog = QiskitFunctionsCatalog(token=\"<MY_IBM_QUANTUM_TOKEN>\")\n",
|
|
" ```\n",
|
|
" </details>\n",
|
|
"</LegacyContent>\n",
|
|
"<CloudContent>\n",
|
|
"3. <span id=\"functions-untrusted\"></span>**Avoid executing code on an untrusted machine or an external cloud Python environment to minimize security risks.** If you must use an untrusted environment (on, for example, a public computer), change your API key after each use by deleting it on the [IBM Cloud API keys](https://cloud.ibm.com/iam/apikeys) page to reduce risk. Learn more in the [Managing user API keys](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui) topic. To initialize the service in this situation, expand the following section to view code you can use:\n",
|
|
"\n",
|
|
" <details>\n",
|
|
" <summary>Initialize the service in an untrusted environment</summary>\n",
|
|
"\n",
|
|
" ```python\n",
|
|
" from qiskit_ibm_catalog import QiskitFunctionsCatalog\n",
|
|
"\n",
|
|
" # After using the following code, delete your API key on the IBM Cloud API keys page\n",
|
|
" catalog = QiskitFunctionsCatalog(token=\"<MY_API_KEY>\")\n",
|
|
" ```\n",
|
|
" </details>\n",
|
|
"</CloudContent>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "374939e2-54ac-4b72-92df-19a5fe9ec352",
|
|
"metadata": {},
|
|
"source": [
|
|
"<LegacyContent>\n",
|
|
" <Admonition type=\"caution\">\n",
|
|
" **Protect your API key!** Never include your key in source code, Python script, or notebook file. When sharing code with others, ensure that your API key is not embedded directly within the Python script. Instead, share the script without the key and provide instructions for securely setting it up.\n",
|
|
"\n",
|
|
" If you accidentally share your key with someone or include it in version control like Git, immediately revoke your key by expiring it on the [IBM Quantum Platform dashboard](https://quantum.ibm.com/) (click the refresh button in the API key field) to reduce risk.\n",
|
|
" </Admonition>\n",
|
|
"</LegacyContent>\n",
|
|
"<CloudContent>\n",
|
|
" <Admonition type=\"caution\">\n",
|
|
" **Protect your API key!** Never include your key in source code, Python script, or notebook file. When sharing code with others, ensure that your API key is not embedded directly within the Python script. Instead, share the script without the key and provide instructions for securely setting it up.\n",
|
|
"\n",
|
|
" If you accidentally share your key with someone or include it in version control like Git, immediately revoke your key by deleting it on the [IBM Cloud API keys](https://cloud.ibm.com/iam/apikeys) page to reduce risk. Learn more in the [Managing user API keys](https://cloud.ibm.com/docs/account?topic=account-userapikey&interface=ui) topic.\n",
|
|
" </Admonition>\n",
|
|
"</CloudContent>"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e3cada45-0364-4096-8481-6eb99d43c656",
|
|
"metadata": {},
|
|
"source": [
|
|
"4. After you have authenticated, you can list the functions from the Qiskit Functions Catalog that you have access to:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"id": "275b4b94-7656-403e-8997-941c03c7ef55",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[QiskitFunction(qunova/hivqe-chemistry),\n",
|
|
" QiskitFunction(qunasys/quri-chemistry),\n",
|
|
" QiskitFunction(algorithmiq/tem),\n",
|
|
" QiskitFunction(algorithmiq/tem-gpu),\n",
|
|
" QiskitFunction(qedma/qesem),\n",
|
|
" QiskitFunction(multiverse/singularity),\n",
|
|
" QiskitFunction(ibm/circuit-function),\n",
|
|
" QiskitFunction(q-ctrl/optimization-solver),\n",
|
|
" QiskitFunction(q-ctrl/performance-management),\n",
|
|
" QiskitFunction(kipu-quantum/iskay-quantum-optimizer),\n"
|
|
]
|
|
},
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"catalog.list()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "de09ad8c-bd6d-4a02-8b24-7bb73beca811",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Run enabled functions\n",
|
|
"\n",
|
|
"After a catalog object has been instantiated, you can select a function using `catalog.load(provider/function-name)`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"id": "65a26da5-f537-44ed-9cb4-b335518d009d",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"ibm_cf = catalog.load(\"ibm/circuit-function\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "0a5f87e4-3082-4ec5-a7ae-7ddb5c35632a",
|
|
"metadata": {},
|
|
"source": [
|
|
"Each Qiskit Function has custom inputs, options, and outputs. Check the specific documentation pages for the function you want to run for more information. By default, all users can only run one function job at a time:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "139ac1d5-3727-4f44-a26c-0d8a1d8a58f2",
|
|
"metadata": {
|
|
"scrolled": true,
|
|
"tags": [
|
|
"remove-cell"
|
|
]
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# This cell is hidden from users\n",
|
|
"# It gets these details programmatically so we can test this notebook\n",
|
|
"from qiskit_ibm_runtime import QiskitRuntimeService\n",
|
|
"from qiskit.circuit.random import random_circuit\n",
|
|
"\n",
|
|
"service = QiskitRuntimeService()\n",
|
|
"instance = service.active_account()[\"instance\"]\n",
|
|
"backend_name = service.least_busy().name\n",
|
|
"\n",
|
|
"circuit = random_circuit(num_qubits=2, depth=2, seed=42)\n",
|
|
"observable = \"Z\" * circuit.num_qubits"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "9b9a7a3c-cc98-4c19-93cd-f59793515c70",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'6054eb66-f2f2-48d4-9f68-333bd8559379'"
|
|
]
|
|
},
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"job = ibm_cf.run(\n",
|
|
" pubs=[(circuit, observable)],\n",
|
|
" instance=instance,\n",
|
|
" backend_name=backend_name, # E.g. \"ibm_fez\"\n",
|
|
")\n",
|
|
"\n",
|
|
"job.job_id"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "113d4382-a987-492d-9e12-b66d3b955bc4",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Check job status\n",
|
|
"\n",
|
|
"<Admonition type=\"tip\">\n",
|
|
"Currently, the IBM Quantum workloads table only reflects Qiskit Runtime workloads. Use `job.status()` to see your Qiskit Function workload's current status.\n",
|
|
"</Admonition>\n",
|
|
"\n",
|
|
"With your Qiskit Function `job_id`, you can check the status of running jobs. This includes the following statuses:\n",
|
|
"\n",
|
|
"- **`QUEUED`**: The remote program is in the Qiskit Function queue. The queue priority is based on how much you've used Qiskit Functions.\n",
|
|
"- **`INITIALIZING`**: The remote program is starting; this includes setting up the remote environment and installing dependencies.\n",
|
|
"- **`RUNNING`**: The program is running.\n",
|
|
"- **`DONE`**: The program is complete, and you can retrieve result data with `job.results()`.\n",
|
|
"- **`ERROR`**: The program stopped running because of a problem. Use `job.result()` to get the error message.\n",
|
|
"- **`CANCELED`**: The program was canceled; either by a user, the service, or the server."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"id": "d0574d73-0966-4426-b2f5-94df72a07caa",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'QUEUED'"
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"job.status()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "439fbefc-f7d3-4e6e-b3e6-61a3664ac5e9",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Retrieve results\n",
|
|
"\n",
|
|
"After a program is `DONE`, you can use `job.results()` to fetch the result. This output format varies with each function, so be sure to follow the specific documentation:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"id": "45e302d8-f3c2-4868-8b7c-6d451f6119a9",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"result = job.result()\n",
|
|
"print(result)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d809d8fa-479c-4c3b-81d7-3408925cec68",
|
|
"metadata": {},
|
|
"source": [
|
|
"You can also cancel a job at any time:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "0e55d4d6-4680-4671-907f-35aac16971ef",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'Job has been stopped.'"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"job.stop()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1ef980bc-9030-4f8a-84d6-a0abd15923ac",
|
|
"metadata": {},
|
|
"source": [
|
|
"### List previously run jobs run with Qiskit Functions\n",
|
|
"\n",
|
|
"You can use `jobs()` to list all jobs submitted to Qiskit Functions:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"id": "4becfe13-68dd-481d-bb43-fc502c254623",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[<Job | 6054eb66-f2f2-48d4-9f68-333bd8559379>,\n",
|
|
" <Job | a7464168-eff6-4676-a481-ea4d2dd1a13b>,\n",
|
|
" <Job | 2765f0c1-7973-48f6-a5c2-746141f51761>,\n",
|
|
" <Job | 75b30e22-0953-4c83-9ff7-a5797ffaddcf>,\n",
|
|
" <Job | 93018ba6-40b2-439e-a517-1c05e26bef01>,\n",
|
|
" <Job | fe82a257-ea09-4229-9189-feea41fc5481>,\n",
|
|
" <Job | 466e9122-16b5-493b-9006-7456970663cd>,\n",
|
|
" <Job | 5fd4eb03-0fb8-4ace-a4f2-33cb18025f9b>,\n",
|
|
" <Job | 7b958091-600e-449a-a167-75fe11075c9d>,\n",
|
|
" <Job | eaa2db93-0d2f-4b52-9f1b-a69fc03dc3d6>]"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"old_jobs = catalog.jobs()\n",
|
|
"old_jobs"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "af7fa72a-f272-43ff-800d-5ae37dd42b2b",
|
|
"metadata": {},
|
|
"source": [
|
|
"If you already have the job ID for a certain job, you can retrieve the job with `catalog.get_job_by_id()`:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "18d87f07-8a8e-4b93-80d0-7c07e49272e2",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# First, get the most recent job that has been executed.\n",
|
|
"latest_job = old_jobs[0]\n",
|
|
"\n",
|
|
"# We can also get that same job with get_job_by_id\n",
|
|
"job_by_id = catalog.get_job_by_id(latest_job.job_id)\n",
|
|
"\n",
|
|
"# Verify that the job is the same using both retrieval methods.\n",
|
|
"assert job_by_id == latest_job\n",
|
|
"\n",
|
|
"# Print the job_id for this job.\n",
|
|
"print(job_by_id.job_id)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "e15f89f8-925d-4d13-8fb8-80ad1d8ac7f6",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Fetch error messages\n",
|
|
"\n",
|
|
"If a program status is `ERROR`, use `job.result()` to fetch the error message as follows:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"id": "3e9d090a-7eb4-476e-92f8-6871803a704d",
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"PrimitiveResult([PubResult(data=DataBin(evs=np.ndarray(<shape=(), dtype=float64>), stds=np.ndarray(<shape=(), dtype=float64>), ensemble_standard_error=np.ndarray(<shape=(), dtype=float64>)), metadata={'shots': 4096, 'target_precision': 0.015625, 'circuit_metadata': {}, 'resilience': {}, 'num_randomizations': 32})], metadata={'dynamical_decoupling': {'enable': True, 'sequence_type': 'XX', 'extra_slack_distribution': 'middle', 'scheduling_method': 'alap'}, 'twirling': {'enable_gates': False, 'enable_measure': True, 'num_randomizations': 'auto', 'shots_per_randomization': 'auto', 'interleave_randomizations': True, 'strategy': 'active-accum'}, 'resilience': {'measure_mitigation': True, 'zne_mitigation': False, 'pec_mitigation': False}, 'version': 2})\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(job.result())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "709b39ca-5dbd-42c0-830c-1248c2e5d63c",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Next steps\n",
|
|
"\n",
|
|
"<Admonition type=\"info\" title=\"Recommendations\">\n",
|
|
"\n",
|
|
"- [Explore circuit functions](./ibm-circuit-function) to build new algorithms and applications, without needing to manage transpilation or error handling.\n",
|
|
"- [Explore application functions](./q-ctrl-optimization-solver) to solve domain-specific tasks, with classical inputs and outputs.\n",
|
|
"\n",
|
|
"</Admonition>"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"description": "Explore IBM Qiskit Functions Catalog, abstracted circuit function and application function services designed to accelerate research and application prototyping.",
|
|
"kernelspec": {
|
|
"display_name": "Python 3",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3"
|
|
},
|
|
"title": "Introduction to Qiskit Functions"
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|