92double RunOnce(uint32_t numNodes,
const std::string& backend,
bool verbose) {
93 auto t0 = std::chrono::steady_clock::now();
98 std::vector<Ptr<QNode>> nodes;
99 nodes.reserve(numNodes);
101 for (uint32_t i = 0; i < numNodes; ++i) {
105 Ptr<QNode> center = nodes[0];
107 for (uint32_t i = 1; i < numNodes; ++i) {
109 ch->SetAttribute(
"Delay", TimeValue(NanoSeconds(10)));
113 for (uint32_t i = 1; i < numNodes; ++i) {
114 Ptr<QNode> node = nodes[i];
115 node->SetRecvCallback([node](std::shared_ptr<Qubit> q) { node->Measure(q); });
118 auto t1 = std::chrono::steady_clock::now();
120 Simulator::Schedule(NanoSeconds(1), [center, &nodes, numNodes]() {
121 std::vector<std::shared_ptr<Qubit>> qs;
122 qs.reserve(numNodes);
124 for (uint32_t i = 0; i < numNodes; ++i) {
125 qs.push_back(center->CreateQubit());
129 for (uint32_t i = 0; i < numNodes; ++i) {
133 for (uint32_t i = 0; i + 1 < numNodes; ++i) {
134 center->Apply(
gates::CZ(), {qs[i], qs[i + 1]});
138 for (uint32_t i = 1; i < numNodes; ++i) {
139 const bool ok = center->Send(qs[i], nodes[i]->GetId());
141 std::cerr <<
"[WARN] Send to node " << i <<
" failed\n";
149 Simulator::Schedule(NanoSeconds(19), [centerQubit = qs[0], center]() {
150 center->Measure(centerQubit, Basis::Z);
155 Simulator::Stop(MicroSeconds(10));
157 Simulator::Destroy();
159 auto t2 = std::chrono::steady_clock::now();
161 const double configMs = std::chrono::duration<double, std::milli>(t1 - t0).count();
162 const double simMs = std::chrono::duration<double, std::milli>(t2 - t1).count();
163 const double totalMs = std::chrono::duration<double, std::milli>(t2 - t0).count();
166 std::cout <<
"[RUN] config=" << std::fixed << std::setprecision(3) << configMs <<
" ms"
167 <<
" sim=" << simMs <<
" ms"
168 <<
" total=" << totalMs <<
" ms\n";