Skip to content
This repository was archived by the owner on Jul 28, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 9 additions & 19 deletions qiskit/providers/ibmq/api/clients/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"""Client for accessing IBM Quantum runtime service."""

import logging
from typing import List, Dict, Union, Optional
from typing import Any, List, Dict, Union, Optional

from qiskit.providers.ibmq.credentials import Credentials
from qiskit.providers.ibmq.api.session import RetrySession
Expand All @@ -39,7 +39,7 @@ def __init__(
**credentials.connection_parameters())
self.api = Runtime(self._session)

def list_programs(self) -> List[Dict]:
def list_programs(self) -> Dict[str, Any]:
"""Return a list of runtime programs.

Returns:
Expand All @@ -49,30 +49,22 @@ def list_programs(self) -> List[Dict]:

def program_create(
self,
program_data: bytes,
program_data: str,
name: str,
description: str,
max_execution_time: int,
is_public: Optional[bool] = False,
version: Optional[str] = None,
backend_requirements: Optional[Dict] = None,
parameters: Optional[Dict] = None,
return_values: Optional[List] = None,
interim_results: Optional[List] = None
spec: Optional[Dict] = None
) -> Dict:
"""Create a new program.

Args:
name: Name of the program.
program_data: Program data.
program_data: Program data (base64 encoded).
description: Program description.
max_execution_time: Maximum execution time.
is_public: Whether the program should be public.
version: Program version.
backend_requirements: Backend requirements.
parameters: Program parameters.
return_values: Program return values.
interim_results: Program interim results.
spec: Backend requirements, parameters, interim results, return values, etc.

Returns:
Server response.
Expand All @@ -81,9 +73,7 @@ def program_create(
program_data=program_data,
name=name,
description=description, max_execution_time=max_execution_time,
is_public=is_public, version=version, backend_requirements=backend_requirements,
parameters=parameters, return_values=return_values,
interim_results=interim_results
is_public=is_public, spec=spec
)

def program_get(self, program_id: str) -> Dict:
Expand Down Expand Up @@ -127,7 +117,7 @@ def program_run(
program_id: str,
credentials: Credentials,
backend_name: str,
params: str,
params: Dict,
image: str
) -> Dict:
"""Run the specified program.
Expand Down Expand Up @@ -160,7 +150,7 @@ def program_update(self, program_id: str, program_data: str) -> None:

Args:
program_id: Program ID.
program_data: Program data.
program_data: Program data (base64 encoded).
"""
self.api.program(program_id).update(program_data)

Expand Down
59 changes: 21 additions & 38 deletions qiskit/providers/ibmq/api/rest/runtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

from .base import RestAdapterBase
from ..session import RetrySession
from ...runtime.utils import RuntimeEncoder

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -54,7 +55,7 @@ def program_job(self, job_id: str) -> 'ProgramJob':
"""
return ProgramJob(self.session, job_id)

def list_programs(self) -> List[Dict]:
def list_programs(self) -> Dict[str, Any]:
"""Return a list of runtime programs.

Returns:
Expand All @@ -65,54 +66,36 @@ def list_programs(self) -> List[Dict]:

def create_program(
self,
program_data: bytes,
program_data: str,
name: str,
description: str,
max_execution_time: int,
is_public: Optional[bool] = False,
version: Optional[str] = None,
backend_requirements: Optional[Dict] = None,
parameters: Optional[Dict] = None,
return_values: Optional[List] = None,
interim_results: Optional[List] = None
spec: Optional[Dict] = None
) -> Dict:
"""Upload a new program.

Args:
program_data: Program data.
program_data: Program data (base64 encoded).
name: Name of the program.
description: Program description.
max_execution_time: Maximum execution time.
is_public: Whether the program should be public.
version: Program version.
backend_requirements: Backend requirements.
parameters: Program parameters.
return_values: Program return values.
interim_results: Program interim results.
spec: Backend requirements, parameters, interim results, return values, etc.

Returns:
JSON response.
"""
url = self.get_url('programs')
data = {'name': name,
'cost': str(max_execution_time),
'description': description.encode(),
'max_execution_time': max_execution_time,
'isPublic': is_public}
if version is not None:
data['version'] = version
if backend_requirements:
data['backendRequirements'] = json.dumps(backend_requirements)
if parameters:
data['parameters'] = json.dumps({"doc": parameters})
if return_values:
data['returnValues'] = json.dumps(return_values)
if interim_results:
data['interimResults'] = json.dumps(interim_results)

files = {'program': (name, program_data)} # type: ignore[dict-item]
response = self.session.post(url, data=data, files=files).json()
return response
payload = {'name': name,
'data': program_data,
'cost': max_execution_time,
'description': description,
'is_public': is_public}
if spec is not None:
payload['spec'] = spec
data = json.dumps(payload)
return self.session.post(url, data=data).json()

def program_run(
self,
Expand All @@ -121,7 +104,7 @@ def program_run(
group: str,
project: str,
backend_name: str,
params: str,
params: Dict,
image: str
) -> Dict:
"""Execute the program.
Expand All @@ -140,15 +123,15 @@ def program_run(
"""
url = self.get_url('jobs')
payload = {
'programId': program_id,
'program_id': program_id,
'hub': hub,
'group': group,
'project': project,
'backend': backend_name,
'params': [params],
'params': params,
'runtime': image
}
data = json.dumps(payload)
data = json.dumps(payload, cls=RuntimeEncoder)
return self.session.post(url, data=data).json()

def jobs_get(self, limit: int = None, skip: int = None, pending: bool = None) -> Dict:
Expand Down Expand Up @@ -243,11 +226,11 @@ def update(self, program_data: str) -> None:
"""Update a program.

Args:
program_data: Program data.
program_data: Program data (base64 encoded).
"""
url = self.get_url("data")
self.session.put(url, data=program_data,
headers={'Content-Type': 'text/plain'})
headers={'Content-Type': 'application/octet-stream'})


class ProgramJob(RestAdapterBase):
Expand Down
7 changes: 2 additions & 5 deletions qiskit/providers/ibmq/runtime/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,14 +193,11 @@ def interim_result_callback(job_id, interim_result):
provider = IBMQ.load_account()
program_id = provider.runtime.upload_program(
data="my_vqe.py",
metadata="my_vqe_metadata.json",
version="1.2"
metadata="my_vqe_metadata.json"
)

In the example above, the file ``my_vqe.py`` contains the program data, and
``my_vqe_metadata.json`` contains the program metadata. An additional
parameter ``version`` is also specified, which takes precedence over any
``version`` value specified in ``my_vqe_metadata.json``.
``my_vqe_metadata.json`` contains the program metadata.

Method :meth:`IBMRuntimeService.delete_program` allows you to delete a
program.
Expand Down
Loading