Bengali
Languages
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

নোট

এই পৃষ্ঠাটি tutorials/simulators/6_extended_stabilizer_tutorial.ipynb -থেকে বানানো হয়েছে।

সম্প্রসারিত সুস্থিতিকারী সিমুলেটর

ভূমিকা

কোয়ান্টাম বর্তনীকে (সার্কিট) ধ্রুপদীভাবে সিমুলেট করার জন্য সম্প্রসারিত সিমুলেটর ব্যবহার করা যায়। এটা Qiskit-Aer -এর নতুন প্রকাশে (রিলিজ) পাওয়া যাবে।

এই পদ্ধতিটা একটা গবেষণাপত্র থেকে পাওয়া Simulation of quantum circuits by low-rank stabilizer decompositions by Bravyi, Browne, Calpin, Campbell, Gosset & Howard, 2018, arXiv:1808.00128

এটা কোয়ান্টাম বর্তনীর (সার্কিট) একটা আলাদা উপস্থাপন কাজে লাগায় যার জন্য এর কিছু অতিরিক্ত ক্ষমতা আছে। এই নোটবুকে সম্প্রসারিত সুস্থিতিকারক পদ্ধতির কিছু কাজের নমুনা দেখা যাবে।

উদাহরণরূপ:

[1]:
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
from qiskit.tools.visualization import plot_histogram

import random
[2]:
circ = QuantumCircuit(40, 40)

# Initialize with a Hadamard layer
circ.h(range(40))
# Apply some random CNOT and T gates
qubit_indices = [i for i in range(40)]
for i in range(10):
    control, target, t = random.sample(qubit_indices, 3)
    circ.cx(control, target)
    circ.t(t)
circ.measure(range(40), range(40))
[2]:
<qiskit.circuit.instructionset.InstructionSet at 0x7fbd18a23310>

আমরা ৬০টা যুক্তিবর্তনী (গেইট) দিয়ে একটা বর্তনী বানিয়েছি যেটা ৪০টা কিউবিটের উপর কাজ করে। কিন্তু যদি অবস্থা ভেক্টর বা দিকরাশি সিমুলেটরে আমরা এটা চালানোর চেষ্টা করি, রাম টেরাবাইটে এক্সেস করতে হবে!

[3]:
# Create statevector method simulator
statevector_simulator = AerSimulator(method='statevector')

# Transpile circuit for backend
tcirc = transpile(circ, statevector_simulator)

# Try and run circuit
statevector_result =  statevector_simulator.run(tcirc, shots=1).result()
print('This succeeded?: {}'.format(statevector_result.success))
print('Why not? {}'.format(statevector_result.status))
Simulation failed and returned the following error message:
ERROR:  [Experiment 0] Insufficient memory to run circuit "circuit-2" using the statevector simulator.
This succeeded?: False
Why not? ERROR:  [Experiment 0] Insufficient memory to run circuit "circuit-2" using the statevector simulator.

অন্যদিকে সম্প্রসারিত সুস্থিতিকারক পদ্ধতিতে এই বর্তনী সহজেই চালানো যাবে। (যদিও এতে কয়েক মিনিট সময় নেবে)

[4]:
# Create extended stabilizer method simulator
extended_stabilizer_simulator = AerSimulator(method='extended_stabilizer')

# Transpile circuit for backend
tcirc = transpile(circ, extended_stabilizer_simulator)

extended_stabilizer_result = extended_stabilizer_simulator.run(tcirc, shots=1).result()
print('This succeeded?: {}'.format(extended_stabilizer_result.success))
This succeeded?: True

কিভাবে এটা কাজ করে?

এতো বড়ো বর্তনী কিভাবে কাজে লাগানো হচ্ছে তা বিশদে জানতে read the paper!

বর্তনী চালানোর জন্য শুধু প্রাথমিকটা বুঝলেই হবে।

সম্প্রসারিত সুস্থিতিকারক পদ্ধতির দুটো অংশ আছে। প্রথমে কোয়ান্টাম বর্তনীগুলো (সার্কিট) সুস্থিতিকারী বর্তনী (সার্কিট) -তে ভাঙতে হয়। এই বর্তনীগুলো বিশেষ রকমের, যাতে সহজেই ধ্রুপদীভাবে সিমুলেট করা যায়। দ্বিতীয়ে এই বর্তনীগুলো যোগ করে পরিমাপ করা হয়।

কটা পরিভাষা আমাদের লাগবে তা নন-ক্লিফোর্ড যুক্তিবর্তনীর (গেট) সংখ্যার উপর নির্ভরশীল। আপাতত এই পদ্ধতিতে নিম্নলিখিত কাজগুলো করা যায়:

circ.t(qr[qubit])
circ.tdg(qr[qubit])
circ.ccx(qr[control_1], qr[control_2], qr[target])
circ.u1(rotation_angle, qr[qubit])

এই সিমুলেটরে সর্বাধিক ৬৩টা কিউবিটসম্পন্ন বর্তনীর উপর কাজ করা যায়।

মনে রাখতে হবে এই বিশ্লেষণগুলো আনুমানিক। অর্থাৎ অবস্থা নির্ণায়ক দিকরাশি (স্টেট ভেক্টর) সিমুলেটরের ফলের সাথে এই ফল পুরোপুরি মিলবে না।

[5]:
small_circ = QuantumCircuit(2, 2)
small_circ.h(0)
small_circ.cx(0, 1)
small_circ.t(0)
small_circ.measure([0, 1], [0, 1])
# This circuit should give 00 or 11 with equal probability...
expected_results ={'00': 50, '11': 50}
[6]:
tsmall_circ = transpile(small_circ, extended_stabilizer_simulator)
result = extended_stabilizer_simulator.run(
    tsmall_circ, shots=100).result()
counts = result.get_counts(0)
print('100 shots in {}s'.format(result.time_taken))
100 shots in 0.4958779811859131s
[7]:
plot_histogram([expected_results, counts],
               legend=['Expected', 'Extended Stabilizer'])
[7]:
../../_images/tutorials_simulators_6_extended_stabilizer_tutorial_13_0.png

এই অনুমান ত্রুটি নিয়ন্ত্রণ করতে হলে Qiskit এয়ারে extended_stabilizer_approximation_error এর সাহায্য নিতে হয়। সাধারণত এর মান ০.০৫। এটা যত কম হবে ফল তত ভালো হবে, কিন্তু সিমুলেশনে সময় এবং মেমরিও বেশি লাগবে।

[8]:
# Add runtime options for extended stabilizer simulator
opts = {'extended_stabilizer_approximation_error': 0.03}

reduced_error = extended_stabilizer_simulator.run(
    tsmall_circ, shots=100, **opts).result()

reduced_error_counts = reduced_error.get_counts(0)
print('100 shots in {}s'.format(reduced_error.time_taken))
plot_histogram([expected_results, reduced_error_counts],
               legend=['Expected', 'Extended Stabilizer'])
100 shots in 1.404871940612793s
[8]:
../../_images/tutorials_simulators_6_extended_stabilizer_tutorial_15_1.png

সিমুলেটরের বিকল্প

সম্প্রসারিত সুস্থিতিকারক পদ্ধতি নিয়ন্ত্রণের জন্য আরো অনেক পথ আছে। এগুলোর নাম ও কাজ জানতে Qiskit এয়ারের নথি পড়তে হবে। কিন্তু এদের মধ্যে সবচেয়ে গুরুত্বপূর্ণ দুটো পথের ব্যাপারে জেনে রাখা দরকার যেগুলো সিমুলেশনের অনুকূলিতকরণে (অপ্টিমাইজেসন) কাজে লাগবে।

পরিমাপ করাকালীন সম্প্রসারিত সুস্থিতিকারক পদ্ধতি, মার্কভ চেন পদ্ধতি কাজে লাগিয়ে যত্রতত্র ফলাফল নমুনা করে। প্রত্যেক বর্তনী (সার্কিট) শটের জন্য মিক্সিং (মার্কভ চেন নমুনা নেওয়ার আগে কিছুক্ষন চালাতে হয়, একেই ‘মিক্সিং সময়’ বলে) করে তারপর নমুনা নিতে হয়।

যদি বর্তনী (সার্কিট) ফলাফল শুধু কয়েকটা ফলাফল অবস্থার উপর লক্ষ্য রেখে বানাতে হয়, তাহলে extended_stabilizer_mixing_time কাজে লাগিয়ে মিক্সিং সময় কমিয়ে সিমুলেশন অনুকূলিত (অপ্টিমাইজ) করা যায়।

[9]:
print("The circuit above, with 100 shots at precision 0.03 "
      "and default mixing time, needed {}s".format(int(reduced_error.time_taken)))

opts = {
    'extended_stabilizer_approximation_error': 0.03,
    'extended_stabilizer_mixing_time': 100
}

optimized = extended_stabilizer_simulator.run(
    tsmall_circ, shots=100, **opts).result()

print('Dialing down the mixing time, we completed in just {}s'.format(optimized.time_taken))
The circuit above, with 100 shots at precision 0.03 and default mixing time, needed 1s
Dialing down the mixing time, we completed in just 1.4710919857025146s

একইভাবে যদি বর্তনীতে (সার্কিট) সব শীর্ষের উপর কোনো অশূন্য সম্ভাবনা থাকে (যেমন - কোনো যথেচ্ছ বর্তনী (সার্কিট)), তাহলে এই সময়সাপেক্ষ মিক্সিং ধাপটা (ফলাফল থেকে অনেকগুলো শট নেওয়ার জন্য) আমরা বাদ দিতে পারি। এর জন্য extended_stabilizer_measure_sampling=True করতে হবে।

উদাহরণস্বরূপ, পাঠসমূহ (টিউটোরিয়াল) বা টিউটোরিয়ালের শুরু থেকে ১০০টি শটের জন্য চলতে থাকা বর্তনীটিকে (সার্কিট) আবার দেখা যাক:

[10]:
# We set these options here only to make the example run more quickly.
opts = {'extended_stabilizer_mixing_time': 100}

multishot = extended_stabilizer_simulator.run(
    tcirc, shots=100, **opts).result()
print("100 shots took {} s".format(multishot.time_taken))
100 shots took 29.634929895401 s
[11]:
opts = {
    'extended_stabilizer_measure_sampling': True,
    'extended_stabilizer_mixing_time': 100
}

measure_sampling = extended_stabilizer_simulator.run(
    circ, shots=100, **opts).result()
print("With the optimization, 100 shots took {} s".format(result.time_taken))
With the optimization, 100 shots took 0.4958779811859131 s

কখন এটা ব্যবহার করা উচিত?

যদি আপনার অনেক গুলো নন-ক্লিফোরড বিশিষ্ট বর্তনী (সার্কিট) থাকে, তাহলে এক্সটেন্ডেড স্ট্যাবিলাইযার অপেক্ষা অবস্থা ভেক্টর বা দিকরাশি পদ্ধতি অধিক ভালো কাজ করবে। যদি আপনি উচ্চ কর্মদক্ষতাসম্পন্ন গননাকারী ব্যবহার না করে অনেকগুলো কিউবিট বিশিষ্ট বর্তনী(সার্কিট) পরীক্ষা করে দেখতে চান, তাহলে এই পদ্ধতিটি ব্যবহার করে দেখুন!

[12]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
Qiskit0.25.0
Terra0.17.0
Aer0.8.0
Ignis0.6.0
Aqua0.9.0
IBM Q Provider0.12.2
System information
Python3.7.7 (default, May 6 2020, 04:59:01) [Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs6
Memory (Gb)32.0
Fri Apr 02 12:28:14 2021 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: