Skip to content

Commit 7ee528f

Browse files
authored
restructure runtime services (#133)
1 parent 1ff2a6f commit 7ee528f

5 files changed

Lines changed: 147 additions & 129 deletions

File tree

samples/sampler_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
#include "circuit/quantumcircuit.hpp"
2424
#include "primitives/backend_sampler_v2.hpp"
25-
#include "service/qiskit_runtime_service.hpp"
25+
#include "service/qiskit_runtime_service_qrmi.hpp"
2626
#include "compiler/transpiler.hpp"
2727

2828
using namespace Qiskit;

samples/transpile_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
#include "circuit/quantumcircuit.hpp"
2424
#include "primitives/backend_sampler_v2.hpp"
2525

26-
#include "service/qiskit_runtime_service.hpp"
26+
#include "service/qiskit_runtime_service_qrmi.hpp"
2727
#include "compiler/transpiler.hpp"
2828

2929
using namespace Qiskit::circuit;
Lines changed: 5 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
# This code is part of Qiskit.
33
#
4-
# (C) Copyright IBM 2017, 2024.
4+
# (C) Copyright IBM 2017, 2025.
55
#
66
# This code is licensed under the Apache License, Version 2.0. You may
77
# obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -12,134 +12,12 @@
1212
# that they have been altered from the originals.
1313
*/
1414

15-
// Qiskit Runtime Service
15+
// Qiskit Runtime Service wrapper for backward compatibility
16+
// use one of "service/qiskit_runtime_service_qrmi.hpp" or "service/qiskit_runtime_service_c.hpp" directly
1617

1718
#ifdef QRMI_ROOT
18-
#include "service/qiskit_runtime_service qrmi.hpp"
19+
#include "service/qiskit_runtime_service_qrmi.hpp"
1920
#else // otherwise use Qiskit IBM runtime C-API
20-
21-
#ifndef __qiskitcpp_providers_qiskit_runtime_service_def_hpp__
22-
#define __qiskitcpp_providers_qiskit_runtime_service_def_hpp__
23-
24-
#include <unordered_map>
25-
26-
#include "utils/types.hpp"
27-
#include "providers/qkrt_backend.hpp"
28-
29-
#ifdef _MSC_VER
30-
#include <windows.h>
31-
#else
32-
#include <thread>
33-
#include <chrono>
34-
#endif
35-
36-
extern "C" {
37-
#include "qiskit_ibm_runtime/qiskit_ibm_runtime.h"
38-
}
39-
40-
using qkrt_Backend = Backend;
41-
42-
namespace Qiskit {
43-
namespace service {
44-
45-
/// @class QiskitRuntimeService
46-
/// @brief runtime service using Qiskit IBM runtime Rust C-API.
47-
class QiskitRuntimeService {
48-
protected:
49-
std::shared_ptr<Service> service_ = nullptr;
50-
BackendSearchResults* backend_results_ = nullptr;
51-
std::unordered_map<std::string, qkrt_Backend*> backends_;
52-
public:
53-
/// @brief Create a new runtime service class
54-
/// This constructor initializes runtime service from saved account configuration
55-
/// in ~/.qiskit/qiskit-ibm.json
56-
QiskitRuntimeService()
57-
{
58-
Service* service;
59-
int ret = qkrt_service_new(&service);
60-
if (ret != 0) {
61-
std::cerr << "ERROR: Qiskit IBM runtime serivce initialization failed with code " << ret << std::endl;
62-
} else {
63-
service_ = std::shared_ptr<Service>(service, qkrt_service_free);
64-
}
65-
}
66-
67-
~QiskitRuntimeService()
68-
{
69-
if (service_) {
70-
service_.reset();
71-
}
72-
if (backend_results_) {
73-
qkrt_backend_search_results_free(backend_results_);
74-
}
75-
}
76-
77-
/// @brief get list of backends
78-
/// @return a list of backends provided in this service
79-
std::vector<std::string> backends(void)
80-
{
81-
get_backends();
82-
83-
std::vector<std::string> keys;
84-
for (auto b : backends_) {
85-
keys.push_back(b.first);
86-
}
87-
return keys;
88-
}
89-
90-
/// @brief create a new backend object
91-
/// @param name the name of the backend resource
92-
/// @return a new QkrtBackend class
93-
Qiskit::providers::QkrtBackend backend(std::string name)
94-
{
95-
get_backends();
96-
97-
qkrt_Backend* backend = backends_[name];
98-
if (backend == nullptr) {
99-
std::cerr << "ERROR: backend " << name << " is not provided in this service" << std::endl;
100-
return Qiskit::providers::QkrtBackend();
101-
}
102-
103-
return Qiskit::providers::QkrtBackend(service_, backend);
104-
}
105-
106-
/// @brief find the least busy backend
107-
/// @return a new QkrtBackend class
108-
Qiskit::providers::QkrtBackend least_busy(void)
109-
{
110-
get_backends();
111-
qkrt_Backend *least_busy = qkrt_backend_search_results_least_busy(backend_results_);
112-
113-
return Qiskit::providers::QkrtBackend(service_, least_busy);
114-
}
115-
116-
protected:
117-
bool get_backends(void)
118-
{
119-
if (backend_results_ != nullptr)
120-
return true;
121-
122-
int ret = qkrt_backend_search(&backend_results_, service_.get());
123-
if (ret != 0) {
124-
std::cerr << "ERROR : qkrt_backend_search fails with code " << ret << std::endl;
125-
return false;
126-
}
127-
uint_t count = qkrt_backend_search_results_length(backend_results_);
128-
129-
// make map of backend name and pointer
130-
qkrt_Backend **backends = qkrt_backend_search_results_data(backend_results_);
131-
for (uint_t i = 0; i < count; i++) {
132-
std::string name = qkrt_backend_name(backends[i]);
133-
backends_[name] = backends[i];
134-
}
135-
return true;
136-
}
137-
};
138-
139-
} // namespace service
140-
} // namespace Qiskit
141-
142-
#endif //__qiskitcpp_providers_qiskit_runtime_service_def_hpp__
143-
21+
#include "service/qiskit_runtime_service_c.hpp"
14422
#endif
14523

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
/*
2+
# This code is part of Qiskit.
3+
#
4+
# (C) Copyright IBM 2017, 2024.
5+
#
6+
# This code is licensed under the Apache License, Version 2.0. You may
7+
# obtain a copy of this license in the LICENSE.txt file in the root directory
8+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
9+
#
10+
# Any modifications or derivative works of this code must retain this
11+
# copyright notice, and modified files need to carry a notice indicating
12+
# that they have been altered from the originals.
13+
*/
14+
15+
// Qiskit Runtime Service using Qiskit IBM Runtime C
16+
17+
#ifndef __qiskitcpp_providers_qiskit_runtime_service_c_def_hpp__
18+
#define __qiskitcpp_providers_qiskit_runtime_service_c_def_hpp__
19+
20+
#include <unordered_map>
21+
22+
#include "utils/types.hpp"
23+
#include "providers/qkrt_backend.hpp"
24+
25+
#ifdef _MSC_VER
26+
#include <windows.h>
27+
#else
28+
#include <thread>
29+
#include <chrono>
30+
#endif
31+
32+
extern "C" {
33+
#include "qiskit_ibm_runtime/qiskit_ibm_runtime.h"
34+
}
35+
36+
using qkrt_Backend = Backend;
37+
38+
namespace Qiskit {
39+
namespace service {
40+
41+
/// @class QiskitRuntimeService
42+
/// @brief runtime service using Qiskit IBM runtime Rust C-API.
43+
class QiskitRuntimeService {
44+
protected:
45+
std::shared_ptr<Service> service_ = nullptr;
46+
BackendSearchResults* backend_results_ = nullptr;
47+
std::unordered_map<std::string, qkrt_Backend*> backends_;
48+
public:
49+
/// @brief Create a new runtime service class
50+
/// This constructor initializes runtime service from saved account configuration
51+
/// in ~/.qiskit/qiskit-ibm.json
52+
QiskitRuntimeService()
53+
{
54+
Service* service;
55+
int ret = qkrt_service_new(&service);
56+
if (ret != 0) {
57+
std::cerr << "ERROR: Qiskit IBM runtime serivce initialization failed with code " << ret << std::endl;
58+
} else {
59+
service_ = std::shared_ptr<Service>(service, qkrt_service_free);
60+
}
61+
}
62+
63+
~QiskitRuntimeService()
64+
{
65+
if (service_) {
66+
service_.reset();
67+
}
68+
if (backend_results_) {
69+
qkrt_backend_search_results_free(backend_results_);
70+
}
71+
}
72+
73+
/// @brief get list of backends
74+
/// @return a list of backends provided in this service
75+
std::vector<std::string> backends(void)
76+
{
77+
get_backends();
78+
79+
std::vector<std::string> keys;
80+
for (auto b : backends_) {
81+
keys.push_back(b.first);
82+
}
83+
return keys;
84+
}
85+
86+
/// @brief create a new backend object
87+
/// @param name the name of the backend resource
88+
/// @return a new QkrtBackend class
89+
Qiskit::providers::QkrtBackend backend(std::string name)
90+
{
91+
get_backends();
92+
93+
qkrt_Backend* backend = backends_[name];
94+
if (backend == nullptr) {
95+
std::cerr << "ERROR: backend " << name << " is not provided in this service" << std::endl;
96+
return Qiskit::providers::QkrtBackend();
97+
}
98+
99+
return Qiskit::providers::QkrtBackend(service_, backend);
100+
}
101+
102+
/// @brief find the least busy backend
103+
/// @return a new QkrtBackend class
104+
Qiskit::providers::QkrtBackend least_busy(void)
105+
{
106+
get_backends();
107+
qkrt_Backend *least_busy = qkrt_backend_search_results_least_busy(backend_results_);
108+
109+
return Qiskit::providers::QkrtBackend(service_, least_busy);
110+
}
111+
112+
protected:
113+
bool get_backends(void)
114+
{
115+
if (backend_results_ != nullptr)
116+
return true;
117+
118+
int ret = qkrt_backend_search(&backend_results_, service_.get());
119+
if (ret != 0) {
120+
std::cerr << "ERROR : qkrt_backend_search fails with code " << ret << std::endl;
121+
return false;
122+
}
123+
uint_t count = qkrt_backend_search_results_length(backend_results_);
124+
125+
// make map of backend name and pointer
126+
qkrt_Backend **backends = qkrt_backend_search_results_data(backend_results_);
127+
for (uint_t i = 0; i < count; i++) {
128+
std::string name = qkrt_backend_name(backends[i]);
129+
backends_[name] = backends[i];
130+
}
131+
return true;
132+
}
133+
};
134+
135+
} // namespace service
136+
} // namespace Qiskit
137+
138+
#endif //__qiskitcpp_providers_qiskit_runtime_service_c_def_hpp__
139+
140+
File renamed without changes.

0 commit comments

Comments
 (0)