!pip install -r requirements.txt
Requirement already satisfied: absl-py==1.4.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (1.4.0) Requirement already satisfied: altair==4.2.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (4.2.2) Requirement already satisfied: amazon-braket-default-simulator==1.11.5.post0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 3)) (1.11.5.post0) Requirement already satisfied: amazon-braket-schemas==1.14.1.post0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (1.14.1.post0) Requirement already satisfied: amazon-braket-sdk==1.35.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 5)) (1.35.5) Requirement already satisfied: antlr4-python3-runtime==4.9.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 6)) (4.9.2) Requirement already satisfied: anyio==3.6.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 7)) (3.6.2) Requirement already satisfied: appdirs==1.4.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 8)) (1.4.4) Requirement already satisfied: argon2-cffi==21.3.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 9)) (21.3.0) Requirement already satisfied: argon2-cffi-bindings==21.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 10)) (21.2.0) Requirement already satisfied: astor==0.8.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 11)) (0.8.1) Requirement already satisfied: async-generator==1.10 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 12)) (1.10) Requirement already satisfied: attrs==22.1.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 13)) (22.1.0) Requirement already satisfied: Babel==2.11.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 14)) (2.11.0) Requirement already satisfied: backcall==0.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 15)) (0.2.0) Requirement already satisfied: backoff==2.2.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 16)) (2.2.1) Requirement already satisfied: beautifulsoup4==4.11.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 17)) (4.11.2) Requirement already satisfied: bleach==4.1.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 18)) (4.1.0) Requirement already satisfied: bokeh==2.3.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 19)) (2.3.3) Requirement already satisfied: boltons==23.0.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 20)) (23.0.0) Requirement already satisfied: boto3==1.23.10 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 21)) (1.23.10) Requirement already satisfied: botocore==1.26.10 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 22)) (1.26.10) Requirement already satisfied: cached-property==1.5.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 23)) (1.5.2) Collecting certifi==2022.12.7 (from -r requirements.txt (line 24)) Using cached certifi-2022.12.7-py3-none-any.whl (155 kB) Requirement already satisfied: cffi==1.15.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 25)) (1.15.1) Requirement already satisfied: charset-normalizer==2.0.12 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 26)) (2.0.12) Requirement already satisfied: contextvars==2.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 27)) (2.4) Requirement already satisfied: cryptography==39.0.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 28)) (39.0.0) Requirement already satisfied: cycler==0.11.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 29)) (0.11.0) Collecting debugpy==1.6.6 (from -r requirements.txt (line 30)) Using cached debugpy-1.6.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.9 MB) Requirement already satisfied: decorator==5.1.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 31)) (5.1.1) Requirement already satisfied: defusedxml==0.7.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 32)) (0.7.1) Requirement already satisfied: dill==0.3.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 33)) (0.3.4) Requirement already satisfied: dlx==1.0.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 34)) (1.0.4) Requirement already satisfied: docplex==2.25.236 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 35)) (2.25.236) Requirement already satisfied: entrypoints==0.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 36)) (0.4) Requirement already satisfied: fastdtw==0.3.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 37)) (0.3.4) Requirement already satisfied: fastjsonschema==2.16.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 38)) (2.16.2) Requirement already satisfied: gast==0.2.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 39)) (0.2.2) Requirement already satisfied: google-pasta==0.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 40)) (0.2.0) Requirement already satisfied: grpcio==1.48.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 41)) (1.48.2) Requirement already satisfied: h5py==2.10.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 42)) (2.10.0) Requirement already satisfied: idna==3.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 43)) (3.4) Requirement already satisfied: immutables==0.19 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 44)) (0.19) Requirement already satisfied: importlib-metadata==4.8.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 45)) (4.8.3) Requirement already satisfied: importlib-resources==5.12.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 46)) (5.12.0) Requirement already satisfied: inflection==0.5.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 47)) (0.5.1) Requirement already satisfied: install==1.3.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 48)) (1.3.5) Requirement already satisfied: ipykernel==5.5.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 49)) (5.5.6) Requirement already satisfied: ipython==7.16.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 50)) (7.16.3) Requirement already satisfied: ipython-genutils==0.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 51)) (0.2.0) Requirement already satisfied: jedi==0.17.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 52)) (0.17.2) Requirement already satisfied: Jinja2==3.0.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 53)) (3.0.3) Requirement already satisfied: jmespath==0.10.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 54)) (0.10.0) Requirement already satisfied: joblib==1.1.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 55)) (1.1.1) Requirement already satisfied: json5==0.9.11 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 56)) (0.9.11) Requirement already satisfied: jsonschema==3.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 57)) (3.2.0) Requirement already satisfied: jupyter-client==7.1.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 58)) (7.1.2) Collecting jupyter-core==4.9.2 (from -r requirements.txt (line 59)) Using cached jupyter_core-4.9.2-py3-none-any.whl (86 kB) Requirement already satisfied: jupyter-server==1.13.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 60)) (1.13.1) Requirement already satisfied: jupyterlab==3.2.9 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 61)) (3.2.9) Requirement already satisfied: jupyterlab-pygments==0.1.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 62)) (0.1.2) Requirement already satisfied: jupyterlab-server==2.10.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 63)) (2.10.3) Requirement already satisfied: Keras==2.0.8 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 64)) (2.0.8) Requirement already satisfied: Keras-Applications==1.0.8 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 65)) (1.0.8) Requirement already satisfied: Keras-Preprocessing==1.1.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 66)) (1.1.2) Requirement already satisfied: kiwisolver==1.3.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 67)) (1.3.1) Requirement already satisfied: lxml==4.9.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 68)) (4.9.2) Requirement already satisfied: Markdown==3.3.7 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 69)) (3.3.7) Requirement already satisfied: MarkupSafe==2.0.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 70)) (2.0.1) Requirement already satisfied: matplotlib==3.3.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 71)) (3.3.4) Requirement already satisfied: matplotlib-inline==0.1.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 72)) (0.1.6) Requirement already satisfied: mistune==0.8.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 73)) (0.8.4) Requirement already satisfied: more-itertools==8.14.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 74)) (8.14.0) Requirement already satisfied: mpmath==1.2.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 75)) (1.2.1) Requirement already satisfied: multitasking==0.0.11 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 76)) (0.0.11) Requirement already satisfied: mypy-extensions==1.0.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 77)) (1.0.0) Requirement already satisfied: nbclassic==0.3.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 78)) (0.3.5) Requirement already satisfied: nbclient==0.5.9 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 79)) (0.5.9) Requirement already satisfied: nbconvert==6.0.7 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 80)) (6.0.7) Requirement already satisfied: nbformat==5.1.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 81)) (5.1.3) Requirement already satisfied: nest-asyncio==1.5.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 82)) (1.5.6) Requirement already satisfied: networkx==2.6.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 83)) (2.6.3) Requirement already satisfied: notebook==6.4.10 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 84)) (6.4.10) Requirement already satisfied: notebook_shim==0.2.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 85)) (0.2.2) Requirement already satisfied: ntlm-auth==1.5.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 86)) (1.5.0) Requirement already satisfied: numpy==1.19.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 87)) (1.19.5) Requirement already satisfied: openpulse==0.4.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 88)) (0.4.1) Requirement already satisfied: openqasm3==0.4.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 89)) (0.4.0) Requirement already satisfied: opt-einsum==3.3.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 90)) (3.3.0) Requirement already satisfied: oqpy==0.1.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 91)) (0.1.2) Requirement already satisfied: packaging==21.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 92)) (21.3) Requirement already satisfied: pandas==1.1.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 93)) (1.1.5) Requirement already satisfied: pandocfilters==1.5.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 94)) (1.5.0) Requirement already satisfied: parso==0.7.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 95)) (0.7.1) Requirement already satisfied: pbr==5.11.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 96)) (5.11.1) Requirement already satisfied: pexpect==4.8.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 97)) (4.8.0) Requirement already satisfied: pickleshare==0.7.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 98)) (0.7.5) Requirement already satisfied: Pillow==8.4.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 99)) (8.4.0) Requirement already satisfied: pip==23.0.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 100)) (23.0.1) Requirement already satisfied: pkgutil_resolve_name==1.3.10 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 101)) (1.3.10) Requirement already satisfied: ply==3.11 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 102)) (3.11) Requirement already satisfied: prometheus-client==0.16.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 103)) (0.16.0) Requirement already satisfied: prompt-toolkit==3.0.36 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 104)) (3.0.36) Requirement already satisfied: protobuf==3.19.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 105)) (3.19.6) Collecting psutil==5.9.4 (from -r requirements.txt (line 106)) Using cached psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (280 kB) Requirement already satisfied: ptyprocess==0.7.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 107)) (0.7.0) Requirement already satisfied: pyasn1==0.4.8 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 108)) (0.4.8) Requirement already satisfied: pycparser==2.21 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 109)) (2.21) Requirement already satisfied: pydantic==1.10.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 110)) (1.10.2) Requirement already satisfied: Pygments==2.14.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 111)) (2.14.0) Requirement already satisfied: pyparsing==3.0.9 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 112)) (3.0.9) Requirement already satisfied: pyrsistent==0.18.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 113)) (0.18.0) Requirement already satisfied: python-constraint==1.4.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 114)) (1.4.0) Requirement already satisfied: python-dateutil==2.8.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 115)) (2.8.2) Requirement already satisfied: pytz==2022.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 116)) (2022.6) Requirement already satisfied: PyYAML==6.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 117)) (6.0) Collecting pyzmq==25.0.0 (from -r requirements.txt (line 118)) Using cached pyzmq-25.0.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.0 MB) Requirement already satisfied: qiskit==0.34.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 119)) (0.34.2) Requirement already satisfied: qiskit-aer==0.10.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 120)) (0.10.3) Requirement already satisfied: qiskit-aqua==0.9.5 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 121)) (0.9.5) Requirement already satisfied: qiskit-ibmq-provider==0.18.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 122)) (0.18.3) Requirement already satisfied: qiskit-ignis==0.7.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 123)) (0.7.0) Requirement already satisfied: qiskit-terra==0.19.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 124)) (0.19.2) Requirement already satisfied: Quandl==3.7.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 125)) (3.7.0) Requirement already satisfied: requests==2.27.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 126)) (2.27.1) Requirement already satisfied: requests-ntlm==1.1.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 127)) (1.1.0) Requirement already satisfied: retworkx==0.11.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 128)) (0.11.0) Requirement already satisfied: s3transfer==0.5.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 129)) (0.5.2) Requirement already satisfied: scikit-learn==0.24.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 130)) (0.24.2) Requirement already satisfied: scipy==1.5.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 131)) (1.5.4) Requirement already satisfied: Send2Trash==1.8.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 132)) (1.8.0) Requirement already satisfied: setproctitle==1.3.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 133)) (1.3.2) Requirement already satisfied: setuptools==67.6.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 134)) (67.6.0) Requirement already satisfied: six==1.16.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 135)) (1.16.0) Requirement already satisfied: sniffio==1.2.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 136)) (1.2.0) Requirement already satisfied: soupsieve==2.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 137)) (2.4) Requirement already satisfied: stevedore==3.5.2 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 138)) (3.5.2) Requirement already satisfied: symengine==0.8.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 139)) (0.8.1) Requirement already satisfied: sympy==1.9 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 140)) (1.9) Requirement already satisfied: tensorboard==1.15.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 141)) (1.15.0) Requirement already satisfied: tensorflow==1.15.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 142)) (1.15.0) Requirement already satisfied: tensorflow-estimator==1.15.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 143)) (1.15.1) Requirement already satisfied: termcolor==1.1.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 144)) (1.1.0) Requirement already satisfied: terminado==0.12.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 145)) (0.12.1) Requirement already satisfied: testpath==0.6.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 146)) (0.6.0) Requirement already satisfied: threadpoolctl==3.1.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 147)) (3.1.0) Requirement already satisfied: tinycss2==1.2.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 148)) (1.2.1) Requirement already satisfied: toolz==0.12.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 149)) (0.12.0) Requirement already satisfied: tornado==6.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 150)) (6.1) Requirement already satisfied: traitlets==4.3.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 151)) (4.3.3) Requirement already satisfied: tweedledum==1.1.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 152)) (1.1.1) Requirement already satisfied: typing_extensions==4.1.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 153)) (4.1.1) Requirement already satisfied: urllib3==1.26.14 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 154)) (1.26.14) Requirement already satisfied: wcwidth==0.2.6 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 155)) (0.2.6) Requirement already satisfied: webencodings==0.5.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 156)) (0.5.1) Requirement already satisfied: websocket-client==1.3.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 157)) (1.3.1) Requirement already satisfied: Werkzeug==2.0.3 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 158)) (2.0.3) Requirement already satisfied: wheel==0.38.4 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 159)) (0.38.4) Requirement already satisfied: wrapt==1.14.1 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 160)) (1.14.1) Requirement already satisfied: yfinance==0.1.87 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 161)) (0.1.87) Requirement already satisfied: zipp==3.6.0 in /opt/conda/envs/qc_hcls_protein_folding_qrw/lib/python3.7/site-packages (from -r requirements.txt (line 162)) (3.6.0) Installing collected packages: pyzmq, psutil, debugpy, certifi, jupyter-core Attempting uninstall: pyzmq Found existing installation: pyzmq 24.0.1 Uninstalling pyzmq-24.0.1: Successfully uninstalled pyzmq-24.0.1 Attempting uninstall: psutil Found existing installation: psutil 5.9.3 Uninstalling psutil-5.9.3: Successfully uninstalled psutil-5.9.3 Attempting uninstall: debugpy Found existing installation: debugpy 1.6.3 Uninstalling debugpy-1.6.3: Successfully uninstalled debugpy-1.6.3 Attempting uninstall: certifi Found existing installation: certifi 2023.5.7 Uninstalling certifi-2023.5.7: Successfully uninstalled certifi-2023.5.7 Attempting uninstall: jupyter-core Found existing installation: jupyter_core 4.11.1 Uninstalling jupyter_core-4.11.1: Successfully uninstalled jupyter_core-4.11.1 Successfully installed certifi-2022.12.7 debugpy-1.6.6 jupyter-core-4.9.2 psutil-5.9.4 pyzmq-25.0.0 [notice] A new release of pip is available: 23.0.1 -> 23.1.2 [notice] To update, run: pip install --upgrade pip
Algorithm Explained¶
import sys
sys.path.append("./hybridjobs/utility")
from hybridjobs.utility.ProteinParser import ProteinData
from hybridjobs.utility.ProteinModel import ProteinModel
from hybridjobs.utility.ProteinStructurePrediction import ProteinStructurePrediction
import time
timestamp = time.strftime("%Y%m%d-%H")
Using TensorFlow backend.
Step 1: Prepare Data¶
In this part, we have prepared the precalculated energies files in advance for doing protein folding experiments
# input: aminoacids
# output: energy files
protein_name = 'glycylglycine'
aminoacids = 'GG'
number_bits_to_discretize_protein_angles = 4
protein_id = 0
data_path='protein-folding-data'
Step 2: Build Model¶
In this part, we will show how to build model for qfold
# initial the ProteinFold object
init_param = {}
# method: qfold-cc stands for the classical metropolis method in QFold
# method: qfold-qc stands for the quantum metropolis method in QFold
method = ['qfold-cc', 'qfold-qc']
for mt in method:
if mt == 'qfold-cc':
init_param[mt] = {}
init_param[mt]['params'] = ["initialization"]
elif mt == 'qfold-qc':
init_param[mt] = {}
init_param[mt]['params'] = ["initialization"]
config_path = "hybridjobs/config/config.json"
protein_model = ProteinModel(data_path, method, config_path, **init_param)
INFO:root:Initial parameters for protein glycylglycine_3_GG using qfold-cc INFO:root:Initial parameters for protein glycylglycine_3_GG using qfold-qc INFO:root:Initial parameters for protein glycylglycine_4_GG using qfold-cc INFO:root:Initial parameters for protein glycylglycine_4_GG using qfold-qc
# set the parameters for model
model_param = {}
method = 'qfold-cc'
model_param[method] = {}
# parameters
model_param[method]['initialization'] = ["minifold", "random"]
method = 'qfold-qc'
model_param[method] = {}
# parameters
model_param[method]['initialization'] = ["minifold", "random"]
protein_model.build_models(**model_param)
deltas_dict length for glycylglycine_3_GG: 256 deltas_dict length for glycylglycine_3_GG: 256 deltas_dict length for glycylglycine_4_GG: 1024 deltas_dict length for glycylglycine_4_GG: 1024 deltas_dict length for glycylglycine_3_GG: 256 deltas_dict length for glycylglycine_3_GG: 256 deltas_dict length for glycylglycine_4_GG: 1024 deltas_dict length for glycylglycine_4_GG: 1024
0
# save the model
model_path = protein_model.save("latest")
print(f"You have built the protein folding models and saved them as protein_folding_latest.pickle")
INFO:root:finish save protein_folding_latest.pickle
You have built the protein folding models and saved them as protein_folding_latest.pickle
Step 3: Predict Protein Structure¶
In this part, we will show how to run models for predicting protein structure
protein_models = ProteinModel.load(model_path)
model_info = protein_models.describe_models()
INFO:root:debug describe INFO:root:model name: glycylglycine_3_GG, method: qfold-cc INFO:root:param: initialization, value {'random', 'minifold'} INFO:root:model name: glycylglycine_3_GG, method: qfold-qc INFO:root:param: initialization, value {'random', 'minifold'} INFO:root:model name: glycylglycine_4_GG, method: qfold-cc INFO:root:param: initialization, value {'random', 'minifold'} INFO:root:model name: glycylglycine_4_GG, method: qfold-qc INFO:root:param: initialization, value {'random', 'minifold'}
# get the model you want to optimize
protein_name = 'glycylglycine_3_GG'
initialization = 'random'
method = 'qfold-cc'
model_name = "{}+{}".format(protein_name, initialization)
protein_model = protein_models.get_model(protein_name, method, model_name)
data_path = 'data'
# psp_param stands for the parameters for predicting protein structure
psp_param = {}
psp_param["data_path"] = data_path
psp_param["mode"] = 'local-simulator'
psp_param["model_name"] = model_name
psp_param["model_path"] = model_path
psp = ProteinStructurePrediction(protein_model, method, config_path, **psp_param)
psp.run()
INFO:root:initial protein structure prediction using qfold-cc in QFold INFO:root:CLASSICAL METROPOLIS: Time for 2 steps: 0.3035731315612793 seconds INFO:root:CLASSICAL METROPOLIS: Time for 3 steps: 0.42159223556518555 seconds INFO:root:CLASSICAL METROPOLIS: Time for 4 steps: 0.5437848567962646 seconds INFO:root:CLASSICAL METROPOLIS: Time for 5 steps: 0.668097734451294 seconds INFO:root:CLASSICAL METROPOLIS: Time for 6 steps: 0.8060107231140137 seconds INFO:root:CLASSICAL METROPOLIS: Time for 7 steps: 0.9142270088195801 seconds INFO:root:CLASSICAL METROPOLIS: Time for 8 steps: 1.0407094955444336 seconds INFO:root:CLASSICAL METROPOLIS: Time for 9 steps: 1.1587982177734375 seconds INFO:root:finish save tts_results_glycylglycine_3_GG+random_1000_qfold-cc.json
initialization = 'random'
method = 'qfold-qc'
model_name = "{}+{}".format(protein_name, initialization)
protein_model = protein_models.get_model(protein_name, method, model_name)
psp = ProteinStructurePrediction(protein_model, method, config_path, **psp_param)
psp.run()
INFO:root:initial protein structure prediction using qfold-qc in QFold INFO:qiskit.compiler.assembler:Total Assembly Time - 0.10800 (ms) INFO:qiskit.compiler.assembler:Total Assembly Time - 0.05174 (ms) INFO:qiskit.compiler.assembler:Total Assembly Time - 0.04840 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnitarySynthesis - 0.01073 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnrollCustomDefinitions - 27500.04935 (ms) INFO:qiskit.transpiler.passes.basis.basis_translator:Begin BasisTranslator from source basis {('ccx', 3), ('mcx', 5), ('cx', 2), ('mcx', 4), ('mcu1', 9), ('snapshot', 16), ('cu3', 2), ('x', 1), ('h', 1)} to target basis {'save_expval', 'barrier', 'mcrx', 'ryy', 'cu3', 'roerror', 'mcz', 'cu', 'measure', 'delay', 'mcr', 'rzz', 'sdg', 'save_state', 'cy', 'rzx', 'unitary', 'mcphase', 'qerror_loc', 'save_probs_ket', 'cu1', 'initialize', 't', 'z', 'cswap', 'ry', 'u', 'sxdg', 'h', 'csx', 'id', 'mcry', 'swap', 'kraus', 'p', 'r', 'rx', 'cx', 'mcp', 'mcu3', 'rxx', 'save_probs', 'set_statevector', 'save_amplitudes_sq', 'mcx', 'snapshot', 'mcswap', 'u2', 'u1', 'ccx', 'mcu', 'cz', 'tdg', 'sx', 'mcrz', 'y', 'multiplexer', 'mcu1', 'reset', 'mcy', 'cu2', 'save_amplitudes', 'u3', 'save_density_matrix', 'diagonal', 'rz', 'save_statevector', 'pauli', 'cp', 'mcu2', 'quantum_channel', 'x', 's', 'mcsx'}. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation path search completed in 0.000s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation paths composed in 0.096s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation instructions replaced in 0.414s. INFO:qiskit.transpiler.runningpassmanager:Pass: BasisTranslator - 680.49669 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: RemoveResetInZeroState - 33.23388 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Depth - 35.45284 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: FixedPoint - 0.01335 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Optimize1qGatesDecomposition - 36900.12527 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: CXCancellation - 47.61624 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnitarySynthesis - 0.01121 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnrollCustomDefinitions - 77.10648 (ms) INFO:qiskit.transpiler.passes.basis.basis_translator:Begin BasisTranslator from source basis {('ccx', 3), ('u3', 1), ('mcx', 5), ('cx', 2), ('mcx', 4), ('mcu1', 9), ('snapshot', 16), ('cu3', 2), ('u2', 1), ('x', 1), ('h', 1)} to target basis {'save_expval', 'barrier', 'mcrx', 'ryy', 'cu3', 'roerror', 'mcz', 'cu', 'measure', 'delay', 'mcr', 'rzz', 'sdg', 'save_state', 'cy', 'rzx', 'unitary', 'mcphase', 'qerror_loc', 'save_probs_ket', 'cu1', 'initialize', 't', 'z', 'cswap', 'ry', 'u', 'sxdg', 'h', 'csx', 'id', 'mcry', 'swap', 'kraus', 'p', 'r', 'rx', 'cx', 'mcp', 'mcu3', 'rxx', 'save_probs', 'set_statevector', 'save_amplitudes_sq', 'mcx', 'snapshot', 'mcswap', 'u2', 'u1', 'ccx', 'mcu', 'cz', 'tdg', 'sx', 'mcrz', 'y', 'multiplexer', 'mcu1', 'reset', 'mcy', 'cu2', 'save_amplitudes', 'u3', 'save_density_matrix', 'diagonal', 'rz', 'save_statevector', 'pauli', 'cp', 'mcu2', 'quantum_channel', 'x', 's', 'mcsx'}. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation path search completed in 0.000s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation paths composed in 0.043s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation instructions replaced in 0.201s. INFO:qiskit.transpiler.runningpassmanager:Pass: BasisTranslator - 308.18915 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Depth - 18.19110 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: FixedPoint - 0.01192 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Optimize1qGatesDecomposition - 7874.60780 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: CXCancellation - 47.97244 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnitarySynthesis - 0.01121 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnrollCustomDefinitions - 77.09765 (ms) INFO:qiskit.transpiler.passes.basis.basis_translator:Begin BasisTranslator from source basis {('ccx', 3), ('u3', 1), ('mcx', 5), ('cx', 2), ('mcx', 4), ('mcu1', 9), ('snapshot', 16), ('cu3', 2), ('u2', 1), ('x', 1), ('h', 1)} to target basis {'save_expval', 'barrier', 'mcrx', 'ryy', 'cu3', 'roerror', 'mcz', 'cu', 'measure', 'delay', 'mcr', 'rzz', 'sdg', 'save_state', 'cy', 'rzx', 'unitary', 'mcphase', 'qerror_loc', 'save_probs_ket', 'cu1', 'initialize', 't', 'z', 'cswap', 'ry', 'u', 'sxdg', 'h', 'csx', 'id', 'mcry', 'swap', 'kraus', 'p', 'r', 'rx', 'cx', 'mcp', 'mcu3', 'rxx', 'save_probs', 'set_statevector', 'save_amplitudes_sq', 'mcx', 'snapshot', 'mcswap', 'u2', 'u1', 'ccx', 'mcu', 'cz', 'tdg', 'sx', 'mcrz', 'y', 'multiplexer', 'mcu1', 'reset', 'mcy', 'cu2', 'save_amplitudes', 'u3', 'save_density_matrix', 'diagonal', 'rz', 'save_statevector', 'pauli', 'cp', 'mcu2', 'quantum_channel', 'x', 's', 'mcsx'}. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation path search completed in 0.000s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation paths composed in 0.043s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation instructions replaced in 0.201s. INFO:qiskit.transpiler.runningpassmanager:Pass: BasisTranslator - 306.87308 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Depth - 18.50057 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: FixedPoint - 0.01264 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: Optimize1qGatesDecomposition - 7755.74756 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: CXCancellation - 48.16389 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnitarySynthesis - 0.01049 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: UnrollCustomDefinitions - 77.50750 (ms) INFO:qiskit.transpiler.passes.basis.basis_translator:Begin BasisTranslator from source basis {('ccx', 3), ('u3', 1), ('mcx', 5), ('cx', 2), ('mcx', 4), ('mcu1', 9), ('snapshot', 16), ('cu3', 2), ('u2', 1), ('x', 1), ('h', 1)} to target basis {'save_expval', 'barrier', 'mcrx', 'ryy', 'cu3', 'roerror', 'mcz', 'cu', 'measure', 'delay', 'mcr', 'rzz', 'sdg', 'save_state', 'cy', 'rzx', 'unitary', 'mcphase', 'qerror_loc', 'save_probs_ket', 'cu1', 'initialize', 't', 'z', 'cswap', 'ry', 'u', 'sxdg', 'h', 'csx', 'id', 'mcry', 'swap', 'kraus', 'p', 'r', 'rx', 'cx', 'mcp', 'mcu3', 'rxx', 'save_probs', 'set_statevector', 'save_amplitudes_sq', 'mcx', 'snapshot', 'mcswap', 'u2', 'u1', 'ccx', 'mcu', 'cz', 'tdg', 'sx', 'mcrz', 'y', 'multiplexer', 'mcu1', 'reset', 'mcy', 'cu2', 'save_amplitudes', 'u3', 'save_density_matrix', 'diagonal', 'rz', 'save_statevector', 'pauli', 'cp', 'mcu2', 'quantum_channel', 'x', 's', 'mcsx'}. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation path search completed in 0.000s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation paths composed in 0.042s. INFO:qiskit.transpiler.passes.basis.basis_translator:Basis translation instructions replaced in 0.200s. INFO:qiskit.transpiler.runningpassmanager:Pass: BasisTranslator - 305.28092 (ms) INFO:qiskit.transpiler.runningpassmanager:Pass: ContainsInstruction - 0.00763 (ms) INFO:qiskit.compiler.transpiler:Total Transpile Time - 84891.31880 (ms) INFO:qiskit.compiler.assembler:Total Assembly Time - 0.12660 (ms) INFO:qiskit.execute_function:Total Job Submission Time - 348.64831 (ms) INFO:root:QUANTUM METROPOLIS: Time for final steps 91.13613080978394 seconds (87.01234769821167 seconds statevector) INFO:root:finish save tts_results_glycylglycine_3_GG+random_1000_qfold-qc.json
# The time for final steps can be compared among these two methods
import json
with open("tts_results_glycylglycine_3_GG+random_1000_qfold-cc.json") as f:
qfold_cc_results = json.load(f)
with open("tts_results_glycylglycine_3_GG+random_1000_qfold-qc.json") as f:
qfold_qc_results = json.load(f)
qfold_cc_min_tts = qfold_cc_results['final_stats']['min_tts']['value']
qfold_qc_min_tts = qfold_qc_results['final_stats']['min_tts']['value']
print(f"The min tts for classical method is {qfold_cc_min_tts}, for quantum method is {qfold_qc_min_tts}")
The min tts for classical method is 61.902315133723086, for quantum method is 125.83909728469
Hybrid Job Experiment¶
from braket.aws import AwsDevice
from braket.aws import AwsQuantumJob, AwsSession
from braket.jobs.config import InstanceConfig
from hybridjobs.utility.HybridJobHelpers import *
import boto3
import os
import json
import time
import altair as alt
import pandas as pd
import numpy as np
Step 1: Prepare parameters for batch evaluation¶
In this part, we set the parameters for batch evaluation
# parameters for experiments
experiment_name = "protein-folding-qrw"
data_path = "protein-folding-data"
suffix_check = ["json"]
experiments_params = {
"version": "1",
"params": [
{"method": ["qfold-cc", "qfold-qc"]},
{"initialization": ["minifold", "random"]},
{"shots": [10000]},
{"mode": ["local-simulator"]},
{"device": [{"qc": "null", "cc": "ml.m5.large"},{"qc": "null", "cc": "ml.m5.4xlarge"}]}
]
}
hp = {}
hybrid_job_params = []
parse_params(experiments_params['params'], hp, hybrid_job_params)
print(f"parameters for experiments: \n {hybrid_job_params}")
parameters for experiments: [{'method': 'qfold-cc', 'initialization': 'minifold', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.large'}}, {'method': 'qfold-cc', 'initialization': 'minifold', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.4xlarge'}}, {'method': 'qfold-cc', 'initialization': 'random', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.large'}}, {'method': 'qfold-cc', 'initialization': 'random', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.4xlarge'}}, {'method': 'qfold-qc', 'initialization': 'minifold', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.large'}}, {'method': 'qfold-qc', 'initialization': 'minifold', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.4xlarge'}}, {'method': 'qfold-qc', 'initialization': 'random', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.large'}}, {'method': 'qfold-qc', 'initialization': 'random', 'shots': 10000, 'mode': 'local-simulator', 'device': {'qc': 'null', 'cc': 'ml.m5.4xlarge'}}]
# Upload dataset to S3
s3_path = upload_data(data_path)
print(f"upload data to s3 path: {s3_path}")
upload data to s3 path: s3://amazon-braket-us-east-1-002224604296/protein-folding-data
Step 2: Prepare image for experiment¶
In this part, we use the following code to prepare the image for experiment. For the first run, please run build_and_push.sh to create the image. For future experiments, avoid running build_and_push.sh unless you want to rebuild the image
account_id = boto3.client("sts").get_caller_identity()["Account"]
region = boto3.client('s3').meta.region_name
image_name = f"amazon-braket-{experiment_name.lower()}-jobs"
image_uri = f"{account_id}.dkr.ecr.{region}.amazonaws.com/{image_name}:latest"
print(f"the hybrid job image for {account_id} in region {region}: {image_uri}")
# For the first run, please use the following code to create the image for this application. For future experiments, comment
# the following code unless you want to rebuild the image
!sh build_and_push.sh {image_name}
the hybrid job image for 002224604296 in region us-east-1: 002224604296.dkr.ecr.us-east-1.amazonaws.com/amazon-braket-protein-folding-qrw-jobs:latest WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded Sending build context to Docker daemon 196.5MB Step 1/4 : FROM 292282985366.dkr.ecr.us-west-2.amazonaws.com/amazon-braket-base-jobs:1.0-cpu-py37-ubuntu18.04 ---> 16b9ec942e00 Step 2/4 : RUN python3 -m pip install --upgrade pip ---> Using cache ---> 11a512e96ae1 Step 3/4 : RUN python3 -m pip install numpy==1.19.5 scipy==1.5.4 tensorflow==1.15.0 Keras==2.0.8 qiskit==0.34.2 qiskit-aer==0.10.3 qiskit-aqua==0.9.5 qiskit-ibmq-provider==0.18.3 qiskit-ignis==0.7.0 qiskit-terra==0.19.2 matplotlib==3.3.4 bokeh==2.3.3 ---> Using cache ---> 13586942fb6c Step 4/4 : COPY hybridjobs/psi4 /home/ubuntu/psi4conda/bin/psi4 ---> Using cache ---> 529ce07bd45d Successfully built 529ce07bd45d Successfully tagged amazon-braket-protein-folding-qrw-jobs:latest The push refers to repository [002224604296.dkr.ecr.us-east-1.amazonaws.com/amazon-braket-protein-folding-qrw-jobs] de7e4468: Preparing 4b37a5e5: Preparing b90ba34e: Preparing 6411a7d1: Preparing 56d89649: Preparing 148e4f08: Preparing 0f2f3775: Preparing a5237a47: Preparing 7b584848: Preparing 9cc6ed2d: Preparing 9ba03cb5: Preparing 3dae4964: Preparing 0cee8562: Preparing c13d298e: Preparing 2ecf6ff1: Preparing 5cb74c43: Preparing 49c05c79: Preparing b7118beb: Preparing b7118beb: Layer already exists latest: digest: sha256:de99e6902d602a1b57fccb8b475df6d08a4b97cc6b4c8d77e6ab4d6b432c8103 size: 4313
hybrid_jobs_json = f"{experiment_name}-hybrid-jobs.json"
print(f"job info will be saved in {hybrid_jobs_json}")
job info will be saved in protein-folding-qrw-hybrid-jobs.json
Step 3: Launch Amazon Braket Hybrid Jobs for experiment¶
In this part, we use the following code to launch the same number of hybrid jobs as the sets of parameters for this experiments. When the number of jobs exceeds 5 RPS, this thread will wait. The default setting of this experiment will take around 7 hours to finish.
# Long runnning cell due to Burst rate of CreateJob requests < 5 RPS
# sudo apt-get install python-prctl at first
# https://stackoverflow.com/questions/34361035/python-thread-name-doesnt-show-up-on-ps-or-htop
from threading import Thread
import threading
import setproctitle
def launch_hybrid_jobs(hybrid_job_params=hybrid_job_params, hybrid_jobs_json=hybrid_jobs_json):
setproctitle.setproctitle(threading.current_thread().name)
# parse evaluation parameters and trigger hybrid jobs:
jobs = []
names = []
job_name = f"{experiment_name}-job"
device_param_list = ["shots", "device"]
for job_param in hybrid_job_params:
algorithm_param_name = ""
for k,v in job_param.items():
if k not in device_param_list:
algorithm_param_name = algorithm_param_name+f"-{v[0]}"
algorithm_param_name=algorithm_param_name[1:]
quantum_device = get_quantum_device(job_param['device']['qc'])
classical_device = job_param['device']['cc']
device_name = classical_device.replace(".","-")
device_name = device_name.replace("x","")
name = f"{algorithm_param_name}-{device_name}-" + str(int(time.time()))
name = name.lower()
# name = f"{experiment_name}-"+ str(int(time.time()))
print(f"name is {name}")
tmp_job = AwsQuantumJob.create(
device=quantum_device,
source_module="hybridjobs",
entry_point=f"hybridjobs.{job_name}:main",
job_name=name,
hyperparameters=job_param,
input_data=s3_path,
instance_config=InstanceConfig(instanceType=classical_device),
image_uri=image_uri,
wait_until_complete=False,
)
# from braket.jobs.local import LocalQuantumJob
# tmp_job = LocalQuantumJob.create(
# device=quantum_device,
# source_module=f"{experiment_name}",
# entry_point=f"{experiment_name}.{job_name}:main",
# hyperparameters=job_param,
# input_data=s3_path,
# image_uri=image_uri,
# )
print(f"Finish create {experiment_name} with {name}")
jobs.append(tmp_job)
names.append(name)
while not queue_check(jobs):
time.sleep(5)
jobs_arn = []
for job in jobs:
jobs_arn.append(job.arn)
jobs_states = {
"experiment_name": experiment_name,
"hybrid-jobs-arn": jobs_arn,
"names": names
}
# save hybrid job arn for further analysis
json_object = json.dumps(jobs_states, indent=4)
with open(hybrid_jobs_json, "w") as outfile:
outfile.write(json_object)
print(f"Finish launch all the hybrid jobs and save all the files")
# remove existing hybrid_jobs_json file
!rm {hybrid_jobs_json}
t = Thread(target=launch_hybrid_jobs, name="launch-hybrid-job", daemon=True).start()
# launch_hybrid_jobs()
rm: cannot remove 'protein-folding-qrw-hybrid-jobs.json': No such file or directory fail to get null: list index out of range, use sv1 instead name is q-m-l-ml-m5-large-1685778825
# run the following scripts to check the created threads
!ps -aux | grep launch-hybrid-job
ubuntu 11752 1.0 0.8 2579488 265172 ? Sl 07:46 0:04 launch-hybrid-job ubuntu 11967 0.0 0.0 8756 3568 pts/1 Ss+ 07:53 0:00 /bin/bash -c ps -aux | grep launch-hybrid-job ubuntu 11972 0.0 0.0 8176 724 pts/1 S+ 07:53 0:00 grep launch-hybrid-job Finish create protein-folding-qrw with q-m-l-ml-m5-large-1685778825 There are 1 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-m-l-ml-m5-4large-1685778842 Finish create protein-folding-qrw with q-m-l-ml-m5-4large-1685778842 There are 2 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-r-l-ml-m5-large-1685778852 Finish create protein-folding-qrw with q-r-l-ml-m5-large-1685778852 There are 3 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-r-l-ml-m5-4large-1685778861 Finish create protein-folding-qrw with q-r-l-ml-m5-4large-1685778861 There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 2 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-m-l-ml-m5-large-1685779055 Finish create protein-folding-qrw with q-m-l-ml-m5-large-1685779055 There are 3 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-m-l-ml-m5-4large-1685779071 Finish create protein-folding-qrw with q-m-l-ml-m5-4large-1685779071 There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 3 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-r-l-ml-m5-large-1685779099 Finish create protein-folding-qrw with q-r-l-ml-m5-large-1685779099 There are 4 jobs in RUNNING or QUEUED status There are 3 jobs in RUNNING or QUEUED status fail to get null: list index out of range, use sv1 instead name is q-r-l-ml-m5-4large-1685779119 Finish create protein-folding-qrw with q-r-l-ml-m5-4large-1685779119 There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 4 jobs in RUNNING or QUEUED status There are 2 jobs in RUNNING or QUEUED status Finish launch all the hybrid jobs and save all the files
Step 4: Jobs finish and visualize results¶
Please use the following code to check the status of hybrid jobs. The status of hybrid jobs can also be checked in the Amazon Braket console. Optionally, if the email if input when deploying the solution, emails will be sent at the same number of hybrid jobs once the status of jobs changes.
# run the following code to test whether all the jobs finish
results = []
if os.path.exists(hybrid_jobs_json):
# recover hybrid jobs and show result
jobs_states_load = None
with open(hybrid_jobs_json, "r") as outfile:
jobs_states_load = json.load(outfile)
completed_jobs_arn = set()
for job_name, job_arn in zip(jobs_states_load["names"], jobs_states_load["hybrid-jobs-arn"]):
current_job = AwsQuantumJob(job_arn)
print(f"the state of job {job_name} is : {current_job.state()}")
if current_job.state() == 'COMPLETED':
completed_jobs_arn.update({job_arn})
whole_jobs_num = len(jobs_states_load["names"])
if len(completed_jobs_arn) == whole_jobs_num:
print(f"all jobs completed")
for job_arn in completed_jobs_arn:
current_job = AwsQuantumJob(job_arn)
results.append(current_job.result())
print(current_job.result())
# display results
results = display_results(results, experiments_params)
else:
print(f"JSON file for job arns not generated! please wait for the thread(launch-hybrid-job) to finish")
the state of job q-m-l-ml-m5-large-1685778825 is : COMPLETED the state of job q-m-l-ml-m5-4large-1685778842 is : COMPLETED the state of job q-r-l-ml-m5-large-1685778852 is : COMPLETED the state of job q-r-l-ml-m5-4large-1685778861 is : COMPLETED the state of job q-m-l-ml-m5-large-1685779055 is : COMPLETED the state of job q-m-l-ml-m5-4large-1685779071 is : COMPLETED the state of job q-r-l-ml-m5-large-1685779099 is : COMPLETED the state of job q-r-l-ml-m5-4large-1685779119 is : COMPLETED all jobs completed {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.large'}", 'initialization': 'random', 'method': 'qfold-qc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [125.83909728469, 162.79166953788086, 166.465828110322, 226.87516833617673, 262.532539034563, 315.34165138580204, 262.5463694025349, 225.99270849033556], 'initialization_stats': {'phis_precision': [80.29186537993999], 'psis_precision': [12.524701960918216], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [0.9516641666115051], 'psis_initial_rotation': [0.8946429875990303]}, 'final_stats': {'min_tts': {'step': 2, 'value': 125.83909728469}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.4xlarge'}", 'initialization': 'minifold', 'method': 'qfold-cc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [142.72976325296523, 135.36610064888248, 125.06141294524524, 111.92415486357513, 88.68774221201535, 84.05084497731531, 78.67334942353332, 71.70275919428877], 'initialization_stats': {'phis_precision': [3.6561311085829273], 'psis_precision': [67.12967637818517], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [-1.4559184312820435], 'psis_initial_rotation': [2.6101088523864746]}, 'final_stats': {'min_tts': {'step': 9, 'value': 71.70275919428877}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.large'}", 'initialization': 'random', 'method': 'qfold-cc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [87.534205262555, 86.2111105555448, 74.69970487036571, 73.08337476173075, 67.03236664089256, 66.49651435477368, 64.3293337690585, 64.37226004296241], 'initialization_stats': {'phis_precision': [80.29186537993999], 'psis_precision': [12.524701960918216], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [0.9516641666115051], 'psis_initial_rotation': [0.8946429875990303]}, 'final_stats': {'min_tts': {'step': 8, 'value': 64.3293337690585}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.4xlarge'}", 'initialization': 'random', 'method': 'qfold-cc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [84.56652111542819, 78.73080415301823, 76.81025422801773, 71.35676622033361, 71.92996869678453, 69.68428218287683, 63.151547249554746, 61.00867415803411], 'initialization_stats': {'phis_precision': [80.29186537993999], 'psis_precision': [12.524701960918216], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [0.9516641666115051], 'psis_initial_rotation': [0.8946429875990303]}, 'final_stats': {'min_tts': {'step': 9, 'value': 61.00867415803411}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.large'}", 'initialization': 'minifold', 'method': 'qfold-cc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [162.15688013768042, 135.36610064888248, 121.93947912207052, 107.84904511992883, 94.69605533966494, 83.78612607662282, 76.39739649406222, 70.31827482628702], 'initialization_stats': {'phis_precision': [3.6561311085829273], 'psis_precision': [67.12967637818517], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [-1.4559184312820435], 'psis_initial_rotation': [2.6101088523864746]}, 'final_stats': {'min_tts': {'step': 9, 'value': 70.31827482628702}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.large'}", 'initialization': 'minifold', 'method': 'qfold-qc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [297.20689904952036, 257.0768396884957, 341.8007711480159, 563.2642256428803, 491.2741292553694, 554.6665421562067, 339.5472618629955, 657.2258206536235], 'initialization_stats': {'phis_precision': [3.6561311085829273], 'psis_precision': [67.12967637818517], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [-1.4559184312820435], 'psis_initial_rotation': [2.6101088523864746]}, 'final_stats': {'min_tts': {'step': 3, 'value': 257.0768396884957}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.4xlarge'}", 'initialization': 'random', 'method': 'qfold-qc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [125.83909728469, 162.79166953788086, 166.465828110322, 226.87516833617673, 262.532539034563, 315.34165138580204, 262.5463694025349, 225.99270849033556], 'initialization_stats': {'phis_precision': [80.29186537993999], 'psis_precision': [12.524701960918216], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [0.9516641666115051], 'psis_initial_rotation': [0.8946429875990303]}, 'final_stats': {'min_tts': {'step': 2, 'value': 125.83909728469}}}}} {'precalculated_energies': {'hypermeter': {'device': "{'qc': 'null', 'cc': 'ml.m5.4xlarge'}", 'initialization': 'minifold', 'method': 'qfold-qc', 'mode': 'local-simulator', 'shots': '10000'}, 'result': {'initial_step': 2, 'final_step': 10, 'tts': [297.20689904952036, 257.0768396884957, 341.8007711480159, 563.2642256428803, 491.2741292553694, 554.6665421562067, 339.5472618629955, 657.2258206536235], 'initialization_stats': {'phis_precision': [3.6561311085829273], 'psis_precision': [67.12967637818517], 'phi_angles_psi4': [1.5708134759948975], 'psi_angles_psi4': [-2.6404247826789864], 'phis_initial_rotation': [-1.4559184312820435], 'psis_initial_rotation': [2.6101088523864746]}, 'final_stats': {'min_tts': {'step': 3, 'value': 257.0768396884957}}}}}
rename_result = {}
device_list = []
x_list = []
y_list = []
for k,vs in results.items():
device_name = k
for index, v in enumerate(vs):
device_list.append(device_name)
x_list.append(index)
y_list.append(v)
source = pd.DataFrame({
"Step": np.array(x_list),
"Time to Solution": np.array(y_list),
"Device": np.array(device_list),
})
alt.Chart(source).mark_line(point = True).encode(
x='Step',
y='Time to Solution',
color='Device',
).properties(
title = f"{experiment_name} experiments",
width = 700,
height = 600,
).interactive()