-
Notifications
You must be signed in to change notification settings - Fork 186
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ZNE demo using catalyst #1207
base: master
Are you sure you want to change the base?
ZNE demo using catalyst #1207
Changes from 42 commits
e00303d
1db073f
9038c94
faa3c18
771d508
25e95e1
1a2ccf1
7d91d08
645e763
bfefdf5
af5773b
b6aa337
6fd8aa4
231c26e
dea771a
2e64d80
5d44c20
297bee1
292d20f
6ff56aa
b9478dc
149dddd
f7e1e90
a352984
9236c62
e2233ff
bc929d8
f595a35
7cb3206
c6f704e
b5e4158
09c2728
84ee6fe
e5359ad
19db775
14d83a3
3e5eb5e
0fc80c4
dbc7c19
ed564f4
f6d2aa7
4e5c221
7db6373
aa2e265
65cb5a2
da89e5d
2cb1176
bc166cf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
.. bio:: Alessandro Cosentino | ||
:photo: ../_static/authors/alessandro_cosentino.png | ||
|
||
Alessandro is a Member of Technical Staff at Unitary Fund. He holds a PhD in Computer Science from the University of Waterloo with a thesis in quantum information theory and optimization. He is an open source software advocate with contributions to both classical and quantum projects. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
.. bio:: Nate Stemen | ||
:photo: ../_static/authors/nate_stemen.png | ||
|
||
Nate Stemen is a technical staff member at Unitary Fund, leading the development of Mitiq, a quantum error mitigation library. He earned a master’s degree from the University of Waterloo, where he focused on quantum circuit compilation. He is passionate about advancing effective education in quantum computing. |
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
@@ -0,0 +1,55 @@ | ||||
{ | ||||
"title": "Digital zero-noise extrapolation with Catalyst", | ||||
"authors": [ | ||||
{ | ||||
"id": "alessandro_cosentino", | ||||
"affiliation": "Unitary Fund" | ||||
}, | ||||
{ | ||||
"id": "nate_stemen", | ||||
"affiliation": "Unitary Fund" | ||||
} | ||||
], | ||||
"dateOfPublication": "2024-09-09T00:00:00+00:00", | ||||
"dateOfLastModification": "2024-09-09T00:00:00+00:00", | ||||
Comment on lines
+11
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tk |
||||
"categories": [ | ||||
"Algorithms", | ||||
"Quantum Computing" | ||||
], | ||||
"tags": [], | ||||
"previewImages": [ | ||||
{ | ||||
"type": "thumbnail", | ||||
"uri": "/_static/demo_thumbnails/regular_demo_thumbnails/thumbnail_qjit_compile_grovers_algorithm_with_catalyst.png" | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @ikurecic are those thumbnails just placeholders? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @cosenal , whoops, I mistakenly put the wrong thumbnails in, thanks so much for noticing. I'll fix this now. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That should be fixed now. Thanks for the tip. |
||||
}, | ||||
{ | ||||
"type": "large_thumbnail", | ||||
"uri": "/_static/demo_thumbnails/large_demo_thumbnails/thumbnail_large_qjit_compile_grovers_algorithm_with_catalyst.png" | ||||
} | ||||
], | ||||
"seoDescription": "Learn to use error mitigation and the digital zero-noise extrapolation (ZNE) technique with Catalyst, the PennyLane framework for quantum JIT compilation.", | ||||
"doi": "", | ||||
"canonicalURL": "/qml/demos/tutorial_zne_catalyst", | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Removing due to today's repository update. |
||||
"references": [ | ||||
{ | ||||
"id": "DZNEpaper", | ||||
"type": "preprint", | ||||
"title": "Digital zero noise extrapolation for quantum error mitigation", | ||||
"authors": "Tudor Giurgica-Tiron, Yousef Hindy, Ryan LaRose, Andrea Mari, and William J. Zeng", | ||||
"year": "2020", | ||||
"publisher": "", | ||||
"journal": "", | ||||
"doi": "10.48550/arXiv.2005.10921", | ||||
"url": "https://arxiv.org/abs/2005.10921v2" | ||||
} | ||||
], | ||||
"basedOnPapers": [], | ||||
"referencedByPapers": [], | ||||
"relatedContent": [ | ||||
{ | ||||
"type": "demonstration", | ||||
"id": "tutorial_error_mitigation", | ||||
"weight": 1.0 | ||||
} | ||||
] | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||||
} |
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,280 @@ | ||||||||||
r""" | ||||||||||
Digital zero-noise extrapolation with Catalyst | ||||||||||
============================================== | ||||||||||
|
||||||||||
In this tutorial, you will learn how to use error mitigation, and in particular | ||||||||||
the zero-noise extrapolation (ZNE) technique, in combination with | ||||||||||
`Catalyst <https://docs.pennylane.ai/projects/catalyst>`_, a framework for quantum | ||||||||||
just-in-time (JIT) compilation with PennyLane. | ||||||||||
We'll demonstrate how to generate noise-scaled circuits, execute them on a noisy quantum | ||||||||||
simulator, and use extrapolation techniques to estimate the zero-noise result, all while | ||||||||||
leveraging JIT compilation through Catalyst. | ||||||||||
|
||||||||||
Using ZNE with Pennylane | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you please change all instances of 'Pennylane' to 'PennyLane'? |
||||||||||
------------------------ | ||||||||||
|
||||||||||
The demo :doc:`Error mitigation with Mitiq and PennyLane <tutorial_error_mitigation>` | ||||||||||
shows how ZNE, along with other error mitigation techniques, can be carried out in Pennylane | ||||||||||
by using `Mitiq <https://github.com/unitaryfund/mitiq>`__, a Python library developed by `Unitary Fund <https://unitary.fund/>`__. | ||||||||||
|
||||||||||
ZNE in particular is also offered out of the box in Pennylane as a *differentiable* error mitigation technique, | ||||||||||
for usage in combination with variational workflows. More on this in the tutorial | ||||||||||
:doc:`Differentiating quantum error mitigation transforms <tutorial_diffable-mitigation>`. | ||||||||||
|
||||||||||
On top of the error mitigation routines offered in Pennylane, ZNE is also available for just-in-time | ||||||||||
(JIT) compilation. In this tutorial we see how an error mitigation routine can be | ||||||||||
integrated in a Catalyst workflow. | ||||||||||
|
||||||||||
At the end of the tutorial, we will compare time for the execution of ZNE routines in | ||||||||||
pure Pennylane vs. Pennylane Catalyst with JIT. | ||||||||||
|
||||||||||
What is zero-noise extrapolation (ZNE) | ||||||||||
----------- | ||||||||||
Comment on lines
+32
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
Zero-noise extrapolation (ZNE) is a technique used to mitigate the effect of noise on quantum | ||||||||||
computations. First introduced in [#temme2017zne]_, it helps improve the accuracy of quantum | ||||||||||
results by running circuits at varying noise levels and extrapolating back to a hypothetical | ||||||||||
zero-noise case. While this tutorial won't delve into the theory behind ZNE in detail, let's first | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you add a link to a recommended resource for readers who aren't familiar with it yet? For example, something of this type:
Suggested change
|
||||||||||
review what happens when using the protocol in practice. | ||||||||||
|
||||||||||
Stage 1: Generating noise-scaled circuits | ||||||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||||||
|
||||||||||
In its digital version [#DZNEpaper]_, ZNE works by generating circuits with **increased** noise. | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you also quickly explain here what you mean by its digital version? |
||||||||||
Currently, ZNE in Catalyst supports two methods for generating noise-scaled circuits: | ||||||||||
|
||||||||||
1. **Global folding**: If a circuit implements a global unitary :math:`U`, global folding applies | ||||||||||
:math:`U(U^\dagger U)^n` for some integer :math:`n`, | ||||||||||
effectively scaling the noise in the entire circuit. | ||||||||||
2. **Local folding**: Individual gates are repeated (or folded) in contrast with the entire | ||||||||||
circuit. | ||||||||||
|
||||||||||
Stage 2: Running the circuits | ||||||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||||||
|
||||||||||
Once noise-scaled circuits are created, they need to be run! These can be executed on either real | ||||||||||
quantum hardware or a noisy quantum simulator. In this tutorial, we'll use the | ||||||||||
`Qrack quantum simulator <https://qrack.readthedocs.io/>`_, which is both compatible with Catalyst, | ||||||||||
and implements a noise model. For more about the integration of Qrack and Catalyst, see | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Imo that link would confuse the reader, since the Qrack noise model we use in this tutorial isn't an instance of actual Pennylane There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you don't like it, then we can keep it out, for sure. |
||||||||||
the demo :doc:`QJIT compilation with Qrack and Catalyst <qrack>`. | ||||||||||
|
||||||||||
Stage 3: Combining the results | ||||||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||||||
|
||||||||||
After executing the noise-scaled circuits, an extrapolation on the results is performed | ||||||||||
to estimate the zero-noise limit---the result we would expect in a noise-free scenario. | ||||||||||
Catalyst provides **polynomial** and **exponential** extrapolation methods. | ||||||||||
|
||||||||||
Defining the mirror circuit | ||||||||||
--------------------------- | ||||||||||
|
||||||||||
The first step for demoing an error mitigation routine is to define a circuit. | ||||||||||
Here we build a simple mirror circuit starting off a unitary 2-design. | ||||||||||
This is a typical construction for a randomized benchmarking circuit, which is used in many tasks | ||||||||||
in quantum computing. Given such circuit, we measure the expectation value :math:`\langle Z\rangle` | ||||||||||
on the state of the first qubit, and by construction of the circuit, we expect this value to be | ||||||||||
equal to 1. | ||||||||||
""" | ||||||||||
|
||||||||||
import timeit | ||||||||||
|
||||||||||
import numpy as np | ||||||||||
import pennylane as qml | ||||||||||
from catalyst import mitigate_with_zne | ||||||||||
|
||||||||||
n_wires = 5 | ||||||||||
|
||||||||||
np.random.seed(42) | ||||||||||
|
||||||||||
n_layers = 10 | ||||||||||
template = qml.SimplifiedTwoDesign | ||||||||||
weights_shape = template.shape(n_layers, n_wires) | ||||||||||
w1, w2 = [2 * np.pi * np.random.random(s) for s in weights_shape] | ||||||||||
|
||||||||||
|
||||||||||
def circuit(w1, w2): | ||||||||||
template(w1, w2, wires=range(n_wires)) | ||||||||||
qml.adjoint(template)(w1, w2, wires=range(n_wires)) | ||||||||||
return qml.expval(qml.PauliZ(0)) | ||||||||||
|
||||||||||
|
||||||||||
############################################################################## | ||||||||||
# As a sanity check, we first execute the circuit on the Qrack simulator without any noise. | ||||||||||
|
||||||||||
noiseless_device = qml.device("qrack.simulator", n_wires, noise=0) | ||||||||||
|
||||||||||
ideal_value = qml.QNode(circuit, device=noiseless_device)(w1, w2) | ||||||||||
print(f"Ideal value: {ideal_value}") | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# As expected, in the noiseless scenario, the expecation value of the Pauli-Z measurement | ||||||||||
# is equal to 1, since the first qubit is back in the :math:`|0\rangle` state. | ||||||||||
# | ||||||||||
cosenal marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||
# Mitigating the noisy circuit | ||||||||||
# ---------------------------- | ||||||||||
# Let's now run the circuit through a noisy scenario. The Qrack simulator models noise by | ||||||||||
# applying single-qubit depolarizing noise channels to all qubits in all gates of the circuit. | ||||||||||
# The probability of error is specified by the value of the `noise` constructor argument (or | ||||||||||
# the `QRACK_GATE_DEPOLARIZATION` environment variable). | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you mean this?
Suggested change
|
||||||||||
|
||||||||||
NOISE_LEVEL = 0.01 | ||||||||||
noisy_device = qml.device("qrack.simulator", n_wires, noise=NOISE_LEVEL) | ||||||||||
|
||||||||||
noisy_qnode = qml.QNode(circuit, device=noisy_device) | ||||||||||
noisy_value = noisy_qnode(w1, w2) | ||||||||||
print(f"Error without mitigation: {abs(ideal_value - noisy_value):.3f}") | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# Again expected, we obtain a noisy value that diverges from the ideal value we obtained above. | ||||||||||
# Fortunately, we have error mitigation to the rescue! We can apply ZNE, however we are still | ||||||||||
# missing some necessary parameters. In particular we still need to specify: | ||||||||||
# | ||||||||||
# 1. The method for scaling this noise up (in Catalyst there are two options: ``global`` and | ||||||||||
# ``local``). | ||||||||||
# 2. The noise scaling factors (i.e. how much to increase the depth of the circuit). | ||||||||||
# 3. The extrapolation technique used to estimate the ideal value (available in Catalyst are | ||||||||||
# polynomial and exponential extrapolation). | ||||||||||
# | ||||||||||
# First, we choose a method to scale the noise. This needs to be specified as a Python string. | ||||||||||
|
||||||||||
folding_method = "global" | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# Next, we pick a list of scale factors. At the time of writing this tutorial, | ||||||||||
# Catalyst supports only odd integer scale factors. In the global folding setting, | ||||||||||
# a scale factor :math:`s` correspond to the circuit being folded | ||||||||||
# :math:`\frac{s - 1}{2}` times. | ||||||||||
scale_factors = [1, 3, 5] | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# Finally, we'll choose the extrapolation technique. Both exponential and polynomial extrapolation | ||||||||||
# is available in the :mod:`qml.transforms <pennylane.transforms>` module, and both of these functions can be passed directly | ||||||||||
# into Catalyst's :func:`catalyst.mitigate_with_zne` function. In this tutorial we use polynomial extrapolation, | ||||||||||
# which we hypothesize best models the behavior of the noise scenario we are considering. | ||||||||||
|
||||||||||
from pennylane.transforms import poly_extrapolate | ||||||||||
from functools import partial | ||||||||||
|
||||||||||
extrapolation_method = partial(poly_extrapolate, order=3) | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# We're now ready to run our example using ZNE with Catalyst! Putting these all together we're able | ||||||||||
# to define a very simple :func:`~.QNode`, which represents the mitigated version of the original circuit. | ||||||||||
|
||||||||||
|
||||||||||
@qml.qjit | ||||||||||
def mitigated_circuit_qjit(w1, w2): | ||||||||||
return mitigate_with_zne( | ||||||||||
noisy_qnode, | ||||||||||
scale_factors=scale_factors, | ||||||||||
extrapolate=extrapolation_method, | ||||||||||
folding=folding_method, | ||||||||||
)(w1, w2) | ||||||||||
|
||||||||||
|
||||||||||
zne_value = mitigated_circuit_qjit(w1, w2) | ||||||||||
|
||||||||||
print(f"Error with ZNE in Catalyst: {abs(ideal_value - zne_value):.3f}") | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# It's crucial to note that we can use the :func:`~.qjit` decorator here, as all the functions used | ||||||||||
# to define the node are compatible with Catalyst, and we can therefore | ||||||||||
# exploit the potential of just-in-time compilation. | ||||||||||
# | ||||||||||
# Benchmarking | ||||||||||
# ------------ | ||||||||||
# For comparison, let's define a very similar :func:`~.qnode`, but this time we don't decorate the node | ||||||||||
# as just-in-time compilable. | ||||||||||
# When it comes to the parameters, the only difference here (due to an implementation technicality) | ||||||||||
# is the type of the ``folding`` argument. Despite the type being different, however, | ||||||||||
# the value of the folding method is the same, i.e., global folding. | ||||||||||
|
||||||||||
|
||||||||||
def mitigated_circuit(w1, w2): | ||||||||||
return qml.transforms.mitigate_with_zne( | ||||||||||
noisy_qnode, | ||||||||||
scale_factors=scale_factors, | ||||||||||
extrapolate=extrapolation_method, | ||||||||||
folding=qml.transforms.fold_global, | ||||||||||
)(w1, w2) | ||||||||||
|
||||||||||
|
||||||||||
zne_value = mitigated_circuit(w1, w2) | ||||||||||
|
||||||||||
print(f"Error with ZNE in Pennylane: {abs(ideal_value - zne_value):.3f}") | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# To showcase the impact of JIT compilation, let's use Python's ``timeit`` module | ||||||||||
# to measure execution time of ``mitigated_circuit_qjit`` vs. ``mitigated_circuit``: | ||||||||||
|
||||||||||
repeat = 5 # number of timing runs | ||||||||||
number = 5 # number of loops executed in each timing run | ||||||||||
|
||||||||||
times = timeit.repeat("mitigated_circuit(w1, w2)", globals=globals(), number=number, repeat=repeat) | ||||||||||
|
||||||||||
print(f"mitigated_circuit running time (best of {repeat}): {min(times):.3f}s") | ||||||||||
|
||||||||||
times = timeit.repeat( | ||||||||||
"mitigated_circuit_qjit(w1, w2)", globals=globals(), number=number, repeat=repeat | ||||||||||
) | ||||||||||
|
||||||||||
print(f"mitigated_circuit_qjit running time (best of {repeat}): {min(times):.3f}s") | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# Already with the simple circuit we started with, and with the simple parameters in our example, | ||||||||||
# we can appreciate the performance differences. That was at the cost of very minimal syntax change. | ||||||||||
# | ||||||||||
# There are still reasons to use ZNE in Pennylane without :func:`~.qjit`, for instance, | ||||||||||
# whenever the device of choice is not supported by Catalyst. To help, | ||||||||||
# we conlcude with a landscape of the QEM techniques available on Pennylane. | ||||||||||
# | ||||||||||
# .. list-table:: | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Regarding this table, Romain mentioned on Discord that those zne functions in Catalyst are not yet differentiable. @rmoyard is that still the case? In which case, should I remove the checkmark from the Catalyst/Differentiable cell? |
||||||||||
# :widths: 30 20 20 20 20 30 | ||||||||||
# :header-rows: 1 | ||||||||||
# | ||||||||||
# * - **Framework** | ||||||||||
# - **ZNE folding** | ||||||||||
# - **ZNE extrapolation** | ||||||||||
# - **Differentiable** | ||||||||||
# - **JIT** | ||||||||||
# - **Other QEM techniques** | ||||||||||
# * - Pennylane + Mitiq | ||||||||||
# - global, local, random | ||||||||||
# - polynomial, exponential | ||||||||||
# - | ||||||||||
# - | ||||||||||
# - PEC, CDR, DDD, REM | ||||||||||
# * - Pennylane transforms | ||||||||||
# - global, local | ||||||||||
# - polynomial, exponential | ||||||||||
# - ✅ | ||||||||||
# - | ||||||||||
# - | ||||||||||
# * - Catalyst (experimental) | ||||||||||
# - global, local | ||||||||||
# - polynomial, exponential | ||||||||||
# - ✅ | ||||||||||
# - ✅ | ||||||||||
# - | ||||||||||
|
||||||||||
|
||||||||||
############################################################################## | ||||||||||
# | ||||||||||
# References | ||||||||||
# ---------- | ||||||||||
# | ||||||||||
# .. [#temme2017zne] K. Temme, S. Bravyi, J. M. Gambetta | ||||||||||
# `"Error Mitigation for Short-Depth Quantum Circuits" <https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.119.180509>`_, | ||||||||||
# Phys. Rev. Lett. 119, 180509 (2017). | ||||||||||
# | ||||||||||
# .. [#DZNEpaper] | ||||||||||
# Tudor Giurgica-Tiron, Yousef Hindy, Ryan LaRose, Andrea Mari, and William J. Zeng | ||||||||||
# "Digital zero noise extrapolation for quantum error mitigation" | ||||||||||
# `arXiv:2005.10921v2 <https://arxiv.org/abs/2005.10921v2>`__, 2020. | ||||||||||
# | ||||||||||
|
||||||||||
############################################################################## | ||||||||||
# About the authors | ||||||||||
# ----------------- | ||||||||||
# .. include:: ../_static/authors/alessandro_cosentino.txt | ||||||||||
# | ||||||||||
# .. include:: ../_static/authors/nate_stemen.txt | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @ikurecic should this stay here, or is this created as part of the build process now? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @natestemen You can remove it. It doesn't cause any trouble to keep it, but you can remove it. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @cosenal and @natestemen ! We've actually had a recent update and your author info will get pulled from your pennylane.ai profiles instead of the repository files. That way you can update all the info independently, without making pull requests, and add additional links and other stuff.
Could you please alter this section as follows?
You just go to pennylane.ai, create an account (if you don't have one already), and then set up your profile(s). The information that gets pulled is the picture, name, and headline, but please feel free to add anything else you'd like.
Please let me know if I can help.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ikurecic do we also remove the files in
_static/authors
then?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@cosenal , yes, you can remove those files.