Source code for qailab.orca_api.networking

  1"""Methods for communicating with psnc quantum api"""
  2import time
  3import requests
  4
  5
[docs] 6class OrcaTask: 7 """ 8 Represents a single task for orca on psnc quantum api. 9 """ 10 11 API_BASE_URL = 'https://api.quantum.psnc.pl/api/client' 12 13 def __init__( 14 self, 15 input_state, 16 bs_angles, 17 loop_lengths, 18 machine, 19 auth_token, 20 n_samples=200, 21 postselection=False, 22 postselection_threshold=None, 23 **kwargs) -> None: 24 25 self.machine = machine 26 self.auth = auth_token 27 self.task_payload = { 28 'input_state': input_state, 29 'bs_angles': bs_angles, 30 'n_samples': n_samples, 31 'loop_lengths': loop_lengths, 32 'postselection': postselection, 33 'postselection_threshold': postselection_threshold, 34 'machine': machine, 35 'extra_options': kwargs 36 } 37 38 self.uid: str 39 self._job_ids = [] 40 self._results = [] 41 42 self._created_time = None 43 44 self._submitted = False 45 46 self._create_on_remote() 47 48 def _full_url(self, rel): 49 return f"{OrcaTask.API_BASE_URL}/{rel}" 50 51 def _get_headers(self): 52 return { 53 'Content-Type': 'application/json', 54 'Authorization': f'Bearer {self.auth}' 55 } 56 57 def _create_on_remote(self): 58 response = requests.post( 59 self._full_url('tasks'), 60 headers=self._get_headers(), 61 json={ 62 'machine': self.machine, 63 'payload': self.task_payload 64 }, 65 timeout=5 66 ) 67 68 response.raise_for_status() 69 70 response_data = response.json() 71 72 self.uid = response_data.get('uid', None) 73 self._created_time = response_data.get('created', None) 74 75 if self.uid is None: 76 raise ValueError('API did not return task UID') 77 78 def _try_get_results(self): 79 80 response = requests.get( 81 self._full_url(f'tasks/{self.uid}/results'), 82 headers=self._get_headers(), 83 timeout=5 84 ) 85 86 if not response.ok: 87 return {} 88 89 response_data = response.json() 90 91 return response_data 92
[docs] 93 def results(self) -> list[str]: 94 """ 95 Get task results. Blocks the thread until results are available. 96 97 Returns: 98 list[str]: List of bitstrings obtained from runs. 99 """ 100 if self._results != []: 101 return self._results 102 103 res = self._try_get_results() 104 while res == {}: 105 time.sleep(0.05) 106 res = self._try_get_results() 107 108 if not isinstance(res, list): 109 raise ValueError(f'invalid result type: {type(res)}, {res}') 110 111 self._results = res 112 return res
113 114 @property 115 def status(self): 116 """Task status""" 117 response = requests.get( 118 self._full_url(f'tasks/{self.uid}/status'), 119 headers=self._get_headers(), 120 timeout=5 121 ) 122 123 response.raise_for_status() 124 125 response_data = response.json() 126 127 return response_data.get('status', 'Unknown')