diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..1532c049 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: f21dcf8b8d69e165e6fbab9dfd760aa4 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/acknowledgements.doctree b/.doctrees/acknowledgements.doctree new file mode 100644 index 00000000..c61adc3c Binary files /dev/null and b/.doctrees/acknowledgements.doctree differ diff --git a/.doctrees/available_methods.doctree b/.doctrees/available_methods.doctree new file mode 100644 index 00000000..8fdff286 Binary files /dev/null and b/.doctrees/available_methods.doctree differ diff --git a/.doctrees/bonus.doctree b/.doctrees/bonus.doctree new file mode 100644 index 00000000..633a945f Binary files /dev/null and b/.doctrees/bonus.doctree differ diff --git a/.doctrees/citing_this_work.doctree b/.doctrees/citing_this_work.doctree new file mode 100644 index 00000000..95b6cfaf Binary files /dev/null and b/.doctrees/citing_this_work.doctree differ diff --git a/.doctrees/codeautolink-cache.json b/.doctrees/codeautolink-cache.json new file mode 100644 index 00000000..83278d8c --- /dev/null +++ b/.doctrees/codeautolink-cache.json @@ -0,0 +1,25 @@ +{ + "acknowledgements": [], + "available_methods": [], + "bonus": [], + "citing_this_work": [], + "comparative_plots": [], + "configs/analysis": [], + "configs/data": [], + "configs/model": [], + "data_preparation": [], + "ensemble_inference": [], + "for_developers": [], + "index": [], + "installation": [], + "method_inference": [], + "modules/src.complex_alignment": [], + "modules/src.data_utils": [], + "modules/src.ensemble_generation": [], + "modules/src.inference_relaxation": [], + "modules/src.minimize_energy": [], + "modules/src.model_utils": [], + "modules/src.resolvers": [], + "modules/src.utils": [], + "tutorials": [] +} \ No newline at end of file diff --git a/.doctrees/comparative_plots.doctree b/.doctrees/comparative_plots.doctree new file mode 100644 index 00000000..b8655a65 Binary files /dev/null and b/.doctrees/comparative_plots.doctree differ diff --git a/.doctrees/configs/analysis.doctree b/.doctrees/configs/analysis.doctree new file mode 100644 index 00000000..2f4a4f46 Binary files /dev/null and b/.doctrees/configs/analysis.doctree differ diff --git a/.doctrees/configs/data.doctree b/.doctrees/configs/data.doctree new file mode 100644 index 00000000..aaf91a92 Binary files /dev/null and b/.doctrees/configs/data.doctree differ diff --git a/.doctrees/configs/model.doctree b/.doctrees/configs/model.doctree new file mode 100644 index 00000000..bb2d42c1 Binary files /dev/null and b/.doctrees/configs/model.doctree differ diff --git a/.doctrees/data_preparation.doctree b/.doctrees/data_preparation.doctree new file mode 100644 index 00000000..6789eba5 Binary files /dev/null and b/.doctrees/data_preparation.doctree differ diff --git a/.doctrees/ensemble_inference.doctree b/.doctrees/ensemble_inference.doctree new file mode 100644 index 00000000..220c1568 Binary files /dev/null and b/.doctrees/ensemble_inference.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 00000000..41d27944 Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/for_developers.doctree b/.doctrees/for_developers.doctree new file mode 100644 index 00000000..d6f6dc02 Binary files /dev/null and b/.doctrees/for_developers.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 00000000..2110643c Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/installation.doctree b/.doctrees/installation.doctree new file mode 100644 index 00000000..9a1feb43 Binary files /dev/null and b/.doctrees/installation.doctree differ diff --git a/.doctrees/method_inference.doctree b/.doctrees/method_inference.doctree new file mode 100644 index 00000000..e2756fb2 Binary files /dev/null and b/.doctrees/method_inference.doctree differ diff --git a/.doctrees/modules/src.complex_alignment.doctree b/.doctrees/modules/src.complex_alignment.doctree new file mode 100644 index 00000000..770ad725 Binary files /dev/null and b/.doctrees/modules/src.complex_alignment.doctree differ diff --git a/.doctrees/modules/src.data_utils.doctree b/.doctrees/modules/src.data_utils.doctree new file mode 100644 index 00000000..a65486f4 Binary files /dev/null and b/.doctrees/modules/src.data_utils.doctree differ diff --git a/.doctrees/modules/src.ensemble_generation.doctree b/.doctrees/modules/src.ensemble_generation.doctree new file mode 100644 index 00000000..f5733167 Binary files /dev/null and b/.doctrees/modules/src.ensemble_generation.doctree differ diff --git a/.doctrees/modules/src.inference_relaxation.doctree b/.doctrees/modules/src.inference_relaxation.doctree new file mode 100644 index 00000000..97bb9569 Binary files /dev/null and b/.doctrees/modules/src.inference_relaxation.doctree differ diff --git a/.doctrees/modules/src.minimize_energy.doctree b/.doctrees/modules/src.minimize_energy.doctree new file mode 100644 index 00000000..e0634c62 Binary files /dev/null and b/.doctrees/modules/src.minimize_energy.doctree differ diff --git a/.doctrees/modules/src.model_utils.doctree b/.doctrees/modules/src.model_utils.doctree new file mode 100644 index 00000000..2153e04a Binary files /dev/null and b/.doctrees/modules/src.model_utils.doctree differ diff --git a/.doctrees/modules/src.resolvers.doctree b/.doctrees/modules/src.resolvers.doctree new file mode 100644 index 00000000..da4ca012 Binary files /dev/null and b/.doctrees/modules/src.resolvers.doctree differ diff --git a/.doctrees/modules/src.utils.doctree b/.doctrees/modules/src.utils.doctree new file mode 100644 index 00000000..cef6a984 Binary files /dev/null and b/.doctrees/modules/src.utils.doctree differ diff --git a/.doctrees/tutorials.doctree b/.doctrees/tutorials.doctree new file mode 100644 index 00000000..7df099a8 Binary files /dev/null and b/.doctrees/tutorials.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_images/PoseBench.png b/_images/PoseBench.png new file mode 100644 index 00000000..8e45d221 Binary files /dev/null and b/_images/PoseBench.png differ diff --git a/_images/WorkBench.jpeg b/_images/WorkBench.jpeg new file mode 100644 index 00000000..e86d5b53 Binary files /dev/null and b/_images/WorkBench.jpeg differ diff --git a/_images/social_previews/summary_acknowledgements_11a2cab9.png b/_images/social_previews/summary_acknowledgements_11a2cab9.png new file mode 100644 index 00000000..08d60605 Binary files /dev/null and b/_images/social_previews/summary_acknowledgements_11a2cab9.png differ diff --git a/_images/social_previews/summary_available_methods_46236b6f.png b/_images/social_previews/summary_available_methods_46236b6f.png new file mode 100644 index 00000000..9aa3546e Binary files /dev/null and b/_images/social_previews/summary_available_methods_46236b6f.png differ diff --git a/_images/social_previews/summary_bonus_555ffd58.png b/_images/social_previews/summary_bonus_555ffd58.png new file mode 100644 index 00000000..28acaa6a Binary files /dev/null and b/_images/social_previews/summary_bonus_555ffd58.png differ diff --git a/_images/social_previews/summary_citing_this_work_3bf7880d.png b/_images/social_previews/summary_citing_this_work_3bf7880d.png new file mode 100644 index 00000000..1290a2e6 Binary files /dev/null and b/_images/social_previews/summary_citing_this_work_3bf7880d.png differ diff --git a/_images/social_previews/summary_comparative_plots_9fa326ec.png b/_images/social_previews/summary_comparative_plots_9fa326ec.png new file mode 100644 index 00000000..3b770067 Binary files /dev/null and b/_images/social_previews/summary_comparative_plots_9fa326ec.png differ diff --git a/_images/social_previews/summary_configs_analysis_02d94955.png b/_images/social_previews/summary_configs_analysis_02d94955.png new file mode 100644 index 00000000..f61c101c Binary files /dev/null and b/_images/social_previews/summary_configs_analysis_02d94955.png differ diff --git a/_images/social_previews/summary_configs_data_939b3d32.png b/_images/social_previews/summary_configs_data_939b3d32.png new file mode 100644 index 00000000..1875fc08 Binary files /dev/null and b/_images/social_previews/summary_configs_data_939b3d32.png differ diff --git a/_images/social_previews/summary_configs_model_214477e1.png b/_images/social_previews/summary_configs_model_214477e1.png new file mode 100644 index 00000000..44e48215 Binary files /dev/null and b/_images/social_previews/summary_configs_model_214477e1.png differ diff --git a/_images/social_previews/summary_data_preparation_230426e1.png b/_images/social_previews/summary_data_preparation_230426e1.png new file mode 100644 index 00000000..5885d5d1 Binary files /dev/null and b/_images/social_previews/summary_data_preparation_230426e1.png differ diff --git a/_images/social_previews/summary_ensemble_inference_a10c727d.png b/_images/social_previews/summary_ensemble_inference_a10c727d.png new file mode 100644 index 00000000..f7b85057 Binary files /dev/null and b/_images/social_previews/summary_ensemble_inference_a10c727d.png differ diff --git a/_images/social_previews/summary_for_developers_5db0cab2.png b/_images/social_previews/summary_for_developers_5db0cab2.png new file mode 100644 index 00000000..71c1f9c8 Binary files /dev/null and b/_images/social_previews/summary_for_developers_5db0cab2.png differ diff --git a/_images/social_previews/summary_index_63aa4c1e.png b/_images/social_previews/summary_index_63aa4c1e.png new file mode 100644 index 00000000..d12bad72 Binary files /dev/null and b/_images/social_previews/summary_index_63aa4c1e.png differ diff --git a/_images/social_previews/summary_installation_258b268e.png b/_images/social_previews/summary_installation_258b268e.png new file mode 100644 index 00000000..01ed6a73 Binary files /dev/null and b/_images/social_previews/summary_installation_258b268e.png differ diff --git a/_images/social_previews/summary_method_inference_34164cb9.png b/_images/social_previews/summary_method_inference_34164cb9.png new file mode 100644 index 00000000..f89e4436 Binary files /dev/null and b/_images/social_previews/summary_method_inference_34164cb9.png differ diff --git a/_images/social_previews/summary_modules_src.complex_alignment_1ef687e6.png b/_images/social_previews/summary_modules_src.complex_alignment_1ef687e6.png new file mode 100644 index 00000000..d74d8e4a Binary files /dev/null and b/_images/social_previews/summary_modules_src.complex_alignment_1ef687e6.png differ diff --git a/_images/social_previews/summary_modules_src.data_utils_26925c64.png b/_images/social_previews/summary_modules_src.data_utils_26925c64.png new file mode 100644 index 00000000..50992241 Binary files /dev/null and b/_images/social_previews/summary_modules_src.data_utils_26925c64.png differ diff --git a/_images/social_previews/summary_modules_src.ensemble_generation_39ac3963.png b/_images/social_previews/summary_modules_src.ensemble_generation_39ac3963.png new file mode 100644 index 00000000..05ddc53d Binary files /dev/null and b/_images/social_previews/summary_modules_src.ensemble_generation_39ac3963.png differ diff --git a/_images/social_previews/summary_modules_src.inference_relaxation_f3165fc8.png b/_images/social_previews/summary_modules_src.inference_relaxation_f3165fc8.png new file mode 100644 index 00000000..2faf5e62 Binary files /dev/null and b/_images/social_previews/summary_modules_src.inference_relaxation_f3165fc8.png differ diff --git a/_images/social_previews/summary_modules_src.minimize_energy_24211bf5.png b/_images/social_previews/summary_modules_src.minimize_energy_24211bf5.png new file mode 100644 index 00000000..b7538bf6 Binary files /dev/null and b/_images/social_previews/summary_modules_src.minimize_energy_24211bf5.png differ diff --git a/_images/social_previews/summary_modules_src.model_utils_9ea4468d.png b/_images/social_previews/summary_modules_src.model_utils_9ea4468d.png new file mode 100644 index 00000000..5bca2653 Binary files /dev/null and b/_images/social_previews/summary_modules_src.model_utils_9ea4468d.png differ diff --git a/_images/social_previews/summary_modules_src.resolvers_a917f3b3.png b/_images/social_previews/summary_modules_src.resolvers_a917f3b3.png new file mode 100644 index 00000000..f8c7e596 Binary files /dev/null and b/_images/social_previews/summary_modules_src.resolvers_a917f3b3.png differ diff --git a/_images/social_previews/summary_modules_src.utils_c6c740e4.png b/_images/social_previews/summary_modules_src.utils_c6c740e4.png new file mode 100644 index 00000000..426421aa Binary files /dev/null and b/_images/social_previews/summary_modules_src.utils_c6c740e4.png differ diff --git a/_images/social_previews/summary_tutorials_d58fb0b6.png b/_images/social_previews/summary_tutorials_d58fb0b6.png new file mode 100644 index 00000000..2382b482 Binary files /dev/null and b/_images/social_previews/summary_tutorials_d58fb0b6.png differ diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 00000000..6a044ae9 --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,341 @@ + + +
+ + + + + + + +
+# -------------------------------------------------------------------------------------------------------------------------------------
+# Following code curated for PoseBench: (https://github.com/BioinfoMachineLearning/PoseBench)
+# -------------------------------------------------------------------------------------------------------------------------------------
+
+import importlib
+import os
+from typing import Any
+
+from omegaconf import OmegaConf
+
+METHOD_TITLE_MAPPING = {
+ "diffdock": "DiffDock",
+ "fabind": "FABind",
+ "dynamicbind": "DynamicBind",
+ "neuralplexer": "NeuralPLexer",
+ "rfaa": "RoseTTAFold-All-Atom",
+ "vina": "Vina",
+ "tulip": "TULIP",
+}
+
+STANDARDIZED_DIR_METHODS = ["diffdock", "fabind"]
+
+
+
+[docs]
+def resolve_omegaconf_variable(variable_path: str) -> Any:
+ """Resolve an OmegaConf variable path to its value."""
+ # split the string into parts using the dot separator
+ parts = variable_path.rsplit(".", 1)
+
+ # get the module name from the first part of the path
+ module_name = parts[0]
+
+ # dynamically import the module using the module name
+ try:
+ module = importlib.import_module(module_name)
+ # use the imported module to get the requested attribute value
+ attribute = getattr(module, parts[1])
+ except Exception:
+ module = importlib.import_module(".".join(module_name.split(".")[:-1]))
+ inner_module = ".".join(module_name.split(".")[-1:])
+ # use the imported module to get the requested attribute value
+ attribute = getattr(getattr(module, inner_module), parts[1])
+
+ return attribute
+
+
+
+
+[docs]
+def resolve_method_title(method: str) -> str:
+ """Resolve the method title for a given method.
+
+ :param method: The method name.
+ :return: The method title for the given method.
+ """
+ return METHOD_TITLE_MAPPING.get(method, method)
+
+
+
+
+[docs]
+def resolve_method_protein_dir(method: str, dataset: str, repeat_index: int) -> str:
+ """Resolve the protein directory for a given method.
+
+ :param method: The method name.
+ :param dataset: The dataset name.
+ :param repeat_index: The repeat index for the method.
+ :return: The protein directory for the given method.
+ """
+ if method in STANDARDIZED_DIR_METHODS or method in ["vina", "tulip"]:
+ return (
+ os.path.join("data", f"{dataset}_set", f"{dataset}_holo_aligned_esmfold_structures")
+ if os.path.exists(
+ os.path.join(
+ "data", f"{dataset}_set", f"{dataset}_holo_aligned_esmfold_structures"
+ )
+ )
+ else os.path.join(
+ "data",
+ f"{dataset}_set",
+ "predicted_structures" if dataset == "casp15" else f"{dataset}_esmfold_structures",
+ )
+ )
+ elif method == "dynamicbind":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ "outputs",
+ "results",
+ dataset,
+ )
+ elif method in ["neuralplexer", "rfaa"]:
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"{method}_{dataset}_outputs_{repeat_index}",
+ )
+ else:
+ raise ValueError(f"Invalid method: {method}")
+
+
+
+
+[docs]
+def resolve_method_ligand_dir(
+ method: str, dataset: str, vina_binding_site_method: str, repeat_index: int
+) -> str:
+ """Resolve the ligand directory for a given method.
+
+ :param method: The method name.
+ :param dataset: The dataset name.
+ :param vina_binding_site_method: The binding site method used for Vina.
+ :param repeat_index: The repeat index for the method.
+ :return: The ligand directory for the given method.
+ """
+ if method in STANDARDIZED_DIR_METHODS or method in ["neuralplexer", "rfaa", "tulip"]:
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"{method}_{dataset}_output{'s' if method in ['neuralplexer', 'rfaa', 'tulip'] else ''}_{repeat_index}",
+ )
+ elif method == "dynamicbind":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ "outputs",
+ "results",
+ dataset,
+ )
+ elif method == "vina":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"vina_{vina_binding_site_method}_{dataset}_outputs_{repeat_index}",
+ )
+ else:
+ raise ValueError(f"Invalid method: {method}")
+
+
+
+
+[docs]
+def resolve_method_output_dir(
+ method: str,
+ dataset: str,
+ vina_binding_site_method: str,
+ ensemble_ranking_method: str,
+ repeat_index: int,
+) -> str:
+ """Resolve the output directory for a given method.
+
+ :param method: The method name.
+ :param dataset: The dataset name.
+ :param vina_binding_site_method: The binding site method used for Vina.
+ :param ensemble_ranking_method: The ranking method used for the ensemble method.
+ :param repeat_index: The repeat index for the method.
+ :return: The output directory for the given method.
+ """
+ if method in STANDARDIZED_DIR_METHODS or method in ["neuralplexer", "rfaa", "tulip"]:
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"{method}_{dataset}_output{'s' if method in ['neuralplexer', 'rfaa', 'tulip'] else ''}_{repeat_index}",
+ )
+ elif method == "dynamicbind":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ "outputs",
+ "results",
+ f"{dataset}_{repeat_index}",
+ )
+ elif method == "vina":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"vina_{vina_binding_site_method}_{dataset}_outputs_{repeat_index}",
+ )
+ elif method == "ensemble":
+ return os.path.join(
+ "data",
+ "test_cases",
+ dataset,
+ f"top_{ensemble_ranking_method}_ensemble_predictions_{repeat_index}",
+ )
+ else:
+ raise ValueError(f"Invalid method: {method}")
+
+
+
+
+[docs]
+def resolve_method_input_csv_path(method: str, dataset: str) -> str:
+ """Resolve the input CSV path for a given method.
+
+ :param method: The method name.
+ :param dataset: The dataset name.
+ :return: The input CSV path for the given method.
+ """
+ if method in STANDARDIZED_DIR_METHODS or method in ["neuralplexer", "rfaa", "vina", "tulip"]:
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"{method}_{dataset}_inputs.csv",
+ )
+ elif method == "dynamicbind":
+ return os.path.join(
+ "forks",
+ METHOD_TITLE_MAPPING.get(method, method),
+ "inference",
+ f"{method}_{dataset}_inputs",
+ )
+ elif method == "ensemble":
+ return os.path.join(
+ "data",
+ "test_cases",
+ dataset,
+ "ensemble_inputs.csv",
+ )
+ else:
+ raise ValueError(f"Invalid method: {method}")
+
+
+
+
+[docs]
+def register_custom_omegaconf_resolvers():
+ """Register custom OmegaConf resolvers."""
+ OmegaConf.register_new_resolver(
+ "resolve_variable", lambda variable_path: resolve_omegaconf_variable(variable_path)
+ )
+ OmegaConf.register_new_resolver(
+ "resolve_method_title",
+ lambda method: resolve_method_title(method),
+ )
+ OmegaConf.register_new_resolver(
+ "resolve_method_protein_dir",
+ lambda method, dataset, repeat_index: resolve_method_protein_dir(
+ method, dataset, repeat_index
+ ),
+ )
+ OmegaConf.register_new_resolver(
+ "resolve_method_ligand_dir",
+ lambda method, dataset, vina_binding_site_method, repeat_index: resolve_method_ligand_dir(
+ method,
+ dataset,
+ vina_binding_site_method,
+ repeat_index,
+ ),
+ )
+ OmegaConf.register_new_resolver(
+ "resolve_method_output_dir",
+ lambda method, dataset, vina_binding_site_method, ensemble_ranking_method, repeat_index: resolve_method_output_dir(
+ method,
+ dataset,
+ vina_binding_site_method,
+ ensemble_ranking_method,
+ repeat_index,
+ ),
+ )
+ OmegaConf.register_new_resolver(
+ "resolve_method_input_csv_path",
+ lambda method, dataset: resolve_method_input_csv_path(method, dataset),
+ )
+
+
+# -------------------------------------------------------------------------------------------------------------------------------------
+# Following code curated for PoseBench: (https://github.com/BioinfoMachineLearning/PoseBench)
+# -------------------------------------------------------------------------------------------------------------------------------------
+
+import numpy as np
+
+
+
+[docs]
+def calculate_rmsd(positions1: np.array, positions2: np.array) -> float:
+ """Calculate the root-mean-square deviation (RMSD) between two sets of positions.
+
+ :param positions1: Array of positions for the first set of atoms.
+ :param positions2: Array of positions for the second set of atoms.
+ :return: RMSD between the two sets of positions.
+ """
+ diff_squared = np.sum((positions1 - positions2) ** 2, axis=1)
+ rmsd = np.sqrt(np.mean(diff_squared))
+ return rmsd
+
+
Short
+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_static/copybutton.js b/_static/copybutton.js new file mode 100644 index 00000000..2ea7ff3e --- /dev/null +++ b/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': 'Β‘Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'CopiΓ© !', + 'copy_failure': 'Γchec de la copie', + }, + 'ru': { + 'copy': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ', + 'copy_to_clipboard': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π±ΡΡΠ΅Ρ', + 'copy_success': 'Π‘ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΎ!', + 'copy_failure': 'ΠΠ΅ ΡΠ΄Π°Π»ΠΎΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ', + }, + 'zh-CN': { + 'copy': 'ε€εΆ', + 'copy_to_clipboard': 'ε€εΆε°εͺθ΄΄ζΏ', + 'copy_success': 'ε€εΆζε!', + 'copy_failure': 'ε€εΆε€±θ΄₯', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = `' + + '' + + _("Hide Search Matches") + + "
" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css new file mode 100644 index 00000000..bc447f22 --- /dev/null +++ b/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map new file mode 100644 index 00000000..9ba5637f --- /dev/null +++ b/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/styles/furo.css b/_static/styles/furo.css new file mode 100644 index 00000000..e3d4e57b --- /dev/null +++ b/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,