diff --git a/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt b/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt index b5f5049398..4123fb3d41 100644 --- a/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt +++ b/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt @@ -1,16 +1,17 @@ -2024-07-19 20:36:44 (INFO): Running in non-distributed local mode -2024-07-19 20:36:44 (INFO): Project root: /home/runner/work/fairchem/fairchem/src/fairchem -2024-07-19 20:36:45 (INFO): amp: true +2024-08-03 02:07:49 (INFO): Running in non-distributed local mode +2024-08-03 02:07:49 (INFO): Setting env PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True +2024-08-03 02:07:49 (INFO): Project root: /home/runner/work/fairchem/fairchem/src/fairchem +2024-08-03 02:07:50 (INFO): amp: true cmd: - checkpoint_dir: fine-tuning/checkpoints/2024-07-19-20-37-20-ft-oxides - commit: f9ecf73 + checkpoint_dir: fine-tuning/checkpoints/2024-08-03-02-08-00-ft-oxides + commit: 08b8c1e identifier: ft-oxides - logs_dir: fine-tuning/logs/tensorboard/2024-07-19-20-37-20-ft-oxides + logs_dir: fine-tuning/logs/tensorboard/2024-08-03-02-08-00-ft-oxides print_every: 10 - results_dir: fine-tuning/results/2024-07-19-20-37-20-ft-oxides + results_dir: fine-tuning/results/2024-08-03-02-08-00-ft-oxides seed: 0 - timestamp_id: 2024-07-19-20-37-20-ft-oxides - version: 0.1.dev1+gf9ecf73 + timestamp_id: 2024-08-03-02-08-00-ft-oxides + version: 0.1.dev1+g08b8c1e dataset: a2g_args: r_energy: true @@ -106,7 +107,6 @@ optim: eval_every: 10 factor: 0.8 force_coefficient: 1 - load_balancing: atoms loss_energy: mae lr_initial: 0.0005 max_epochs: 1 @@ -142,83 +142,92 @@ val_dataset: format: ase_db src: val.db -2024-07-19 20:36:45 (INFO): Loading dataset: ase_db -2024-07-19 20:36:45 (INFO): rank: 0: Sampler created... -2024-07-19 20:36:45 (INFO): Batch balancing is disabled for single GPU training. -2024-07-19 20:36:45 (INFO): rank: 0: Sampler created... -2024-07-19 20:36:45 (INFO): Batch balancing is disabled for single GPU training. -2024-07-19 20:36:45 (INFO): rank: 0: Sampler created... -2024-07-19 20:36:45 (INFO): Batch balancing is disabled for single GPU training. -2024-07-19 20:36:45 (INFO): Loading model: gemnet_oc -2024-07-19 20:36:45 (WARNING): Unrecognized arguments: ['symmetric_edge_symmetrization'] -2024-07-19 20:36:48 (INFO): Loaded GemNetOC with 38864438 parameters. -2024-07-19 20:36:48 (WARNING): log_summary for Tensorboard not supported -2024-07-19 20:36:48 (WARNING): Using `weight_decay` from `optim` instead of `optim.optimizer_params`.Please update your config to use `optim.optimizer_params.weight_decay`.`optim.weight_decay` will soon be deprecated. -2024-07-19 20:36:48 (INFO): Loading checkpoint from: /tmp/fairchem_checkpoints/gnoc_oc22_oc20_all_s2ef.pt -2024-07-19 20:36:48 (INFO): Overwriting scaling factors with those loaded from checkpoint. If you're generating predictions with a pretrained checkpoint, this is the correct behavior. To disable this, delete `scale_dict` from the checkpoint. +2024-08-03 02:07:50 (INFO): Loading dataset: ase_db +2024-08-03 02:07:50 (WARNING): Could not find dataset metadata.npz files in '[PosixPath('train.db')]' +2024-08-03 02:07:50 (WARNING): Disabled BalancedBatchSampler because num_replicas=1. +2024-08-03 02:07:50 (WARNING): Failed to get data sizes, falling back to uniform partitioning. BalancedBatchSampler requires a dataset that has a metadata attributed with number of atoms. +2024-08-03 02:07:50 (INFO): rank: 0: Sampler created... +2024-08-03 02:07:50 (INFO): Created BalancedBatchSampler with sampler=, batch_size=4, drop_last=False +2024-08-03 02:07:50 (WARNING): Could not find dataset metadata.npz files in '[PosixPath('val.db')]' +2024-08-03 02:07:50 (WARNING): Disabled BalancedBatchSampler because num_replicas=1. +2024-08-03 02:07:50 (WARNING): Failed to get data sizes, falling back to uniform partitioning. BalancedBatchSampler requires a dataset that has a metadata attributed with number of atoms. +2024-08-03 02:07:50 (INFO): rank: 0: Sampler created... +2024-08-03 02:07:50 (INFO): Created BalancedBatchSampler with sampler=, batch_size=16, drop_last=False +2024-08-03 02:07:50 (WARNING): Could not find dataset metadata.npz files in '[PosixPath('test.db')]' +2024-08-03 02:07:50 (WARNING): Disabled BalancedBatchSampler because num_replicas=1. +2024-08-03 02:07:50 (WARNING): Failed to get data sizes, falling back to uniform partitioning. BalancedBatchSampler requires a dataset that has a metadata attributed with number of atoms. +2024-08-03 02:07:50 (INFO): rank: 0: Sampler created... +2024-08-03 02:07:50 (INFO): Created BalancedBatchSampler with sampler=, batch_size=16, drop_last=False +2024-08-03 02:07:50 (INFO): Loading model: gemnet_oc +2024-08-03 02:07:50 (WARNING): Unrecognized arguments: ['symmetric_edge_symmetrization'] +2024-08-03 02:07:52 (INFO): Loaded GemNetOC with 38864438 parameters. +2024-08-03 02:07:52 (WARNING): log_summary for Tensorboard not supported +2024-08-03 02:07:52 (WARNING): Using `weight_decay` from `optim` instead of `optim.optimizer_params`.Please update your config to use `optim.optimizer_params.weight_decay`.`optim.weight_decay` will soon be deprecated. +2024-08-03 02:07:53 (INFO): Loading checkpoint from: /tmp/fairchem_checkpoints/gnoc_oc22_oc20_all_s2ef.pt +2024-08-03 02:07:53 (INFO): Overwriting scaling factors with those loaded from checkpoint. If you're generating predictions with a pretrained checkpoint, this is the correct behavior. To disable this, delete `scale_dict` from the checkpoint. /opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/torch_geometric/data/collate.py:145: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage() storage = elem.storage()._new_shared(numel) /opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/torch_geometric/data/collate.py:145: UserWarning: TypedStorage is deprecated. It will be removed in the future and UntypedStorage will be the only storage class. This should only matter to you if you are using storages directly. To access UntypedStorage directly, use tensor.untyped_storage() instead of tensor.storage() storage = elem.storage()._new_shared(numel) -2024-07-19 20:37:11 (INFO): energy_mae: 6.77e+00, forcesx_mae: 4.11e-02, forcesy_mae: 3.63e-02, forcesz_mae: 5.26e-02, forces_mae: 4.33e-02, forces_cosine_similarity: 8.24e-02, forces_magnitude_error: 7.42e-02, energy_forces_within_threshold: 0.00e+00, loss: 6.86e+00, lr: 5.00e-04, epoch: 1.69e-01, step: 1.00e+01 -2024-07-19 20:37:12 (INFO): Evaluating on val. +2024-08-03 02:08:15 (INFO): energy_mae: 9.52e+00, forcesx_mae: 7.22e-02, forcesy_mae: 3.94e-02, forcesz_mae: 5.74e-02, forces_mae: 5.63e-02, forces_cosine_similarity: 1.39e-01, forces_magnitude_error: 1.11e-01, energy_forces_within_threshold: 0.00e+00, loss: 9.65e+00, lr: 5.00e-04, epoch: 1.69e-01, step: 1.00e+01 +2024-08-03 02:08:16 (INFO): Evaluating on val. device 0: 0%| | 0/2 [00:00, batch_size=16, drop_last=False +2024-08-03 02:13:06 (INFO): Loading model: gemnet_t +2024-08-03 02:13:08 (INFO): Loaded GemNetT with 31671825 parameters. +2024-08-03 02:13:08 (WARNING): log_summary for Tensorboard not supported +2024-08-03 02:13:08 (INFO): Loading checkpoint from: /tmp/fairchem_checkpoints/gndt_oc22_all_s2ef.pt +2024-08-03 02:13:08 (INFO): Overwriting scaling factors with those loaded from checkpoint. If you're generating predictions with a pretrained checkpoint, this is the correct behavior. To disable this, delete `scale_dict` from the checkpoint. +2024-08-03 02:13:08 (WARNING): Scale factor comment not found in model +2024-08-03 02:13:08 (INFO): Predicting on test. device 0: 0%| | 0/3 [00:00 None Load existing trained model @@ -58,6 +85,18 @@ Package Contents Initialize Reaction object + .. py:attribute:: reaction_db_path + + + .. py:attribute:: reaction_db + + + .. py:attribute:: adsorbate_db + + + .. py:attribute:: entry + + .. py:method:: get_desorption_mapping(reactant) Get mapping for desorption reaction diff --git a/_sources/autoapi/cattsunami/core/ocpneb/index.rst b/_sources/autoapi/cattsunami/core/ocpneb/index.rst index f75e61786e..e022987357 100644 --- a/_sources/autoapi/cattsunami/core/ocpneb/index.rst +++ b/_sources/autoapi/cattsunami/core/ocpneb/index.rst @@ -20,6 +20,33 @@ Module Contents Bases: :py:obj:`ase.neb.DyNEB` + .. py:attribute:: batch_size + + + .. py:attribute:: config + + + .. py:attribute:: trainer + + + .. py:attribute:: a2g + + + .. py:attribute:: intermediate_energies + :value: [] + + + + .. py:attribute:: intermediate_forces + :value: [] + + + + .. py:attribute:: cached + :value: False + + + .. py:method:: load_checkpoint(checkpoint_path: str) -> None Load existing trained model diff --git a/_sources/autoapi/cattsunami/core/reaction/index.rst b/_sources/autoapi/cattsunami/core/reaction/index.rst index 7af3e28ecb..dd3a716866 100644 --- a/_sources/autoapi/cattsunami/core/reaction/index.rst +++ b/_sources/autoapi/cattsunami/core/reaction/index.rst @@ -20,6 +20,18 @@ Module Contents Initialize Reaction object + .. py:attribute:: reaction_db_path + + + .. py:attribute:: reaction_db + + + .. py:attribute:: adsorbate_db + + + .. py:attribute:: entry + + .. py:method:: get_desorption_mapping(reactant) Get mapping for desorption reaction diff --git a/_sources/autoapi/core/_cli/index.rst b/_sources/autoapi/core/_cli/index.rst index a050e042f1..bbf9036fda 100644 --- a/_sources/autoapi/core/_cli/index.rst +++ b/_sources/autoapi/core/_cli/index.rst @@ -50,6 +50,14 @@ Module Contents the state so that not to pickle it) and change/remove the initial parameters. + .. py:attribute:: config + :value: None + + + + .. py:attribute:: distributed + + .. py:method:: __call__(config: dict) -> None diff --git a/_sources/autoapi/core/common/data_parallel/index.rst b/_sources/autoapi/core/common/data_parallel/index.rst index ed87b0b185..764972c88d 100644 --- a/_sources/autoapi/core/common/data_parallel/index.rst +++ b/_sources/autoapi/core/common/data_parallel/index.rst @@ -18,7 +18,6 @@ Classes .. autoapisummary:: core.common.data_parallel.OCPCollater - core.common.data_parallel._HasMetadata core.common.data_parallel.StatefulDistributedSampler core.common.data_parallel.BalancedBatchSampler @@ -28,7 +27,8 @@ Functions .. autoapisummary:: - core.common.data_parallel.balanced_partition + core.common.data_parallel._balanced_partition + core.common.data_parallel._ensure_supported Module Contents @@ -36,131 +36,97 @@ Module Contents .. py:class:: OCPCollater(otf_graph: bool = False) + .. py:attribute:: otf_graph + + .. py:method:: __call__(data_list: list[torch_geometric.data.Data]) -> torch_geometric.data.Batch -.. py:function:: balanced_partition(sizes: numpy.typing.NDArray[numpy.int_], num_parts: int) +.. py:function:: _balanced_partition(sizes: numpy.typing.NDArray[numpy.int_], num_parts: int) Greedily partition the given set by always inserting the largest element into the smallest partition. -.. py:class:: _HasMetadata - - Bases: :py:obj:`Protocol` +.. py:class:: StatefulDistributedSampler(dataset, batch_size, **kwargs) + Bases: :py:obj:`torch.utils.data.DistributedSampler` - Base class for protocol classes. - Protocol classes are defined as:: + More fine-grained state DataSampler that uses training iteration and epoch + both for shuffling data. PyTorch DistributedSampler only uses epoch + for the shuffling and starts sampling data from the start. In case of training + on very large data, we train for one epoch only and when we resume training, + we want to resume the data sampler from the training iteration. - class Proto(Protocol): - def meth(self) -> int: - ... - Such classes are primarily used with static type checkers that recognize - structural subtyping (static duck-typing). + .. py:attribute:: start_iter + :value: 0 - For example:: - class C: - def meth(self) -> int: - return 0 - def func(x: Proto) -> int: - return x.meth() + .. py:attribute:: batch_size - func(C()) # Passes static type check - See PEP 544 for details. Protocol classes decorated with - @typing.runtime_checkable act as simple-minded runtime protocols that check - only the presence of given attributes, ignoring their type signatures. - Protocol classes can be generic, they are defined as:: + .. py:method:: __iter__() - class GenProto(Protocol[T]): - def meth(self) -> T: - ... + .. py:method:: set_epoch_and_start_iteration(epoch, start_iter) - .. py:property:: metadata_path - :type: pathlib.Path +.. py:function:: _ensure_supported(dataset: Any) +.. py:class:: BalancedBatchSampler(dataset: torch.utils.data.Dataset, *, batch_size: int, num_replicas: int, rank: int, device: torch.device, seed: int, mode: bool | Literal['atoms'] = 'atoms', shuffle: bool = True, on_error: Literal['warn_and_balance', 'warn_and_no_balance', 'raise'] = 'raise', drop_last: bool = False) -.. py:class:: StatefulDistributedSampler(dataset, batch_size, **kwargs) + Bases: :py:obj:`torch.utils.data.BatchSampler` - Bases: :py:obj:`torch.utils.data.DistributedSampler` + Wraps another sampler to yield a mini-batch of indices. - More fine-grained state DataSampler that uses training iteration and epoch - both for shuffling data. PyTorch DistributedSampler only uses epoch - for the shuffling and starts sampling data from the start. In case of training - on very large data, we train for one epoch only and when we resume training, - we want to resume the data sampler from the training iteration. + :param sampler: Base sampler. Can be any iterable object + :type sampler: Sampler or Iterable + :param batch_size: Size of mini-batch. + :type batch_size: int + :param drop_last: If ``True``, the sampler will drop the last batch if + its size would be less than ``batch_size`` + :type drop_last: bool + .. rubric:: Example - .. py:method:: __iter__() + >>> list(BatchSampler(SequentialSampler(range(10)), batch_size=3, drop_last=False)) + [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]] + >>> list(BatchSampler(SequentialSampler(range(10)), batch_size=3, drop_last=True)) + [[0, 1, 2], [3, 4, 5], [6, 7, 8]] - .. py:method:: set_epoch_and_start_iteration(epoch, start_iter) + .. py:attribute:: disabled + :value: False -.. py:class:: BalancedBatchSampler(dataset, batch_size: int, num_replicas: int, rank: int, device: torch.device, seed: int, mode: str | bool = 'atoms', shuffle: bool = True, drop_last: bool = False, force_balancing: bool = False, throw_on_error: bool = False) - Bases: :py:obj:`torch.utils.data.Sampler` + .. py:attribute:: on_error - Base class for all Samplers. + .. py:attribute:: sampler - Every Sampler subclass has to provide an :meth:`__iter__` method, providing a - way to iterate over indices or lists of indices (batches) of dataset elements, and a :meth:`__len__` method - that returns the length of the returned iterators. - :param data_source: This argument is not used and will be removed in 2.2.0. - You may still have custom implementation that utilizes it. - :type data_source: Dataset + .. py:attribute:: device - .. rubric:: Example - >>> # xdoctest: +SKIP - >>> class AccedingSequenceLengthSampler(Sampler[int]): - >>> def __init__(self, data: List[str]) -> None: - >>> self.data = data - >>> - >>> def __len__(self) -> int: - >>> return len(self.data) - >>> - >>> def __iter__(self) -> Iterator[int]: - >>> sizes = torch.tensor([len(x) for x in self.data]) - >>> yield from torch.argsort(sizes).tolist() - >>> - >>> class AccedingSequenceLengthBatchSampler(Sampler[List[int]]): - >>> def __init__(self, data: List[str], batch_size: int) -> None: - >>> self.data = data - >>> self.batch_size = batch_size - >>> - >>> def __len__(self) -> int: - >>> return (len(self.data) + self.batch_size - 1) // self.batch_size - >>> - >>> def __iter__(self) -> Iterator[List[int]]: - >>> sizes = torch.tensor([len(x) for x in self.data]) - >>> for batch in torch.chunk(torch.argsort(sizes), len(self)): - >>> yield batch.tolist() - - .. note:: The :meth:`__len__` method isn't strictly required by - :class:`~torch.utils.data.DataLoader`, but is expected in any - calculation involving the length of a :class:`~torch.utils.data.DataLoader`. - - - .. py:method:: _load_dataset(dataset, mode: Literal['atoms', 'neighbors']) - - - .. py:method:: __len__() -> int + .. py:method:: _get_natoms(batch_idx: list[int]) .. py:method:: set_epoch_and_start_iteration(epoch: int, start_iteration: int) -> None + .. py:method:: set_epoch(epoch: int) -> None + + + .. py:method:: _dist_enabled() + :staticmethod: + + + .. py:method:: __iter__() diff --git a/_sources/autoapi/core/common/flags/index.rst b/_sources/autoapi/core/common/flags/index.rst index f7f5239980..5eac3c95bd 100644 --- a/_sources/autoapi/core/common/flags/index.rst +++ b/_sources/autoapi/core/common/flags/index.rst @@ -33,6 +33,9 @@ Module Contents .. py:class:: Flags + .. py:attribute:: parser + + .. py:method:: get_parser() -> argparse.ArgumentParser diff --git a/_sources/autoapi/core/common/logger/index.rst b/_sources/autoapi/core/common/logger/index.rst index 1d3b1fb634..cd227b74a3 100644 --- a/_sources/autoapi/core/common/logger/index.rst +++ b/_sources/autoapi/core/common/logger/index.rst @@ -34,6 +34,9 @@ Module Contents tensorboard, etc. + .. py:attribute:: config + + .. py:method:: watch(model, log_freq: int = 1000) :abstractmethod: @@ -77,6 +80,12 @@ Module Contents tensorboard, etc. + .. py:attribute:: project + + + .. py:attribute:: entity + + .. py:method:: watch(model, log_freq: int = 1000) -> None Monitor parameters and gradients. @@ -110,6 +119,9 @@ Module Contents tensorboard, etc. + .. py:attribute:: writer + + .. py:method:: watch(model, log_freq: int = 1000) -> bool Monitor parameters and gradients. diff --git a/_sources/autoapi/core/common/relaxation/ase_utils/index.rst b/_sources/autoapi/core/common/relaxation/ase_utils/index.rst index a08b4245fd..23028b0932 100644 --- a/_sources/autoapi/core/common/relaxation/ase_utils/index.rst +++ b/_sources/autoapi/core/common/relaxation/ase_utils/index.rst @@ -61,6 +61,23 @@ Module Contents + .. py:attribute:: checkpoint + :value: None + + + + .. py:attribute:: config + + + .. py:attribute:: trainer + + + .. py:attribute:: seed + + + .. py:attribute:: a2g + + .. py:method:: load_checkpoint(checkpoint_path: str, checkpoint: dict | None = None) -> None Load existing trained model diff --git a/_sources/autoapi/core/common/relaxation/optimizers/lbfgs_torch/index.rst b/_sources/autoapi/core/common/relaxation/optimizers/lbfgs_torch/index.rst index 81823ad913..869c926345 100644 --- a/_sources/autoapi/core/common/relaxation/optimizers/lbfgs_torch/index.rst +++ b/_sources/autoapi/core/common/relaxation/optimizers/lbfgs_torch/index.rst @@ -26,6 +26,48 @@ Module Contents .. py:class:: LBFGS(batch: torch_geometric.data.Batch, model: TorchCalc, maxstep: float = 0.01, memory: int = 100, damping: float = 0.25, alpha: float = 100.0, force_consistent=None, device: str = 'cuda:0', save_full_traj: bool = True, traj_dir: pathlib.Path | None = None, traj_names=None, early_stop_batch: bool = False) + .. py:attribute:: batch + + + .. py:attribute:: model + + + .. py:attribute:: maxstep + + + .. py:attribute:: memory + + + .. py:attribute:: damping + + + .. py:attribute:: alpha + + + .. py:attribute:: H0 + + + .. py:attribute:: force_consistent + + + .. py:attribute:: device + + + .. py:attribute:: save_full + + + .. py:attribute:: traj_dir + + + .. py:attribute:: traj_names + + + .. py:attribute:: early_stop_batch + + + .. py:attribute:: otf_graph + + .. py:method:: get_energy_and_forces(apply_constraint: bool = True) @@ -46,6 +88,12 @@ Module Contents .. py:class:: TorchCalc(model, transform=None) + .. py:attribute:: model + + + .. py:attribute:: transform + + .. py:method:: get_energy_and_forces(atoms, apply_constraint: bool = True) diff --git a/_sources/autoapi/core/common/test_utils/index.rst b/_sources/autoapi/core/common/test_utils/index.rst index 420bb15b28..a41657e097 100644 --- a/_sources/autoapi/core/common/test_utils/index.rst +++ b/_sources/autoapi/core/common/test_utils/index.rst @@ -18,8 +18,9 @@ Functions .. autoapisummary:: + core.common.test_utils.init_env_rank_and_launch_test + core.common.test_utils.init_pg_and_rank_and_launch_test core.common.test_utils.spawn_multi_process - core.common.test_utils._init_pg_and_rank_and_launch_test Module Contents @@ -70,7 +71,11 @@ Module Contents -.. py:function:: spawn_multi_process(config: PGConfig, test_method: callable, *test_method_args: Any, **test_method_kwargs: Any) -> list[Any] +.. py:function:: init_env_rank_and_launch_test(rank: int, pg_setup_params: PGConfig, mp_output_dict: dict[int, object], test_method: callable, args: list[object], kwargs: dict[str, object]) -> None + +.. py:function:: init_pg_and_rank_and_launch_test(rank: int, pg_setup_params: PGConfig, mp_output_dict: dict[int, object], test_method: callable, args: list[object], kwargs: dict[str, object]) -> None + +.. py:function:: spawn_multi_process(config: PGConfig, test_method: callable, init_and_launch: callable, *test_method_args: Any, **test_method_kwargs: Any) -> list[Any] Spawn single node, multi-rank function. Uses localhost and free port to communicate. @@ -84,5 +89,3 @@ Module Contents :returns: A list, l, where l[i] is the return value of test_method on rank i -.. py:function:: _init_pg_and_rank_and_launch_test(rank: int, pg_setup_params: PGConfig, mp_output_dict: dict[int, object], test_method: callable, args: list[object], kwargs: dict[str, object]) -> None - diff --git a/_sources/autoapi/core/common/transforms/index.rst b/_sources/autoapi/core/common/transforms/index.rst index 2b7c552e42..c1d9af27ab 100644 --- a/_sources/autoapi/core/common/transforms/index.rst +++ b/_sources/autoapi/core/common/transforms/index.rst @@ -37,6 +37,12 @@ Module Contents :type axes: int, optional + .. py:attribute:: degrees + + + .. py:attribute:: axes + + .. py:method:: __call__(data) diff --git a/_sources/autoapi/core/common/utils/index.rst b/_sources/autoapi/core/common/utils/index.rst index ab7212b987..975cde5fae 100644 --- a/_sources/autoapi/core/common/utils/index.rst +++ b/_sources/autoapi/core/common/utils/index.rst @@ -12,6 +12,14 @@ core.common.utils +Attributes +---------- + +.. autoapisummary:: + + core.common.utils.DEFAULT_ENV_VARS + + Classes ------- @@ -54,6 +62,7 @@ Functions core.common.utils.setup_logging core.common.utils.compute_neighbors core.common.utils.check_traj_files + core.common.utils.setup_env_vars core.common.utils.new_trainer_context core.common.utils._resolve_scale_factor_submodule core.common.utils._report_incompat_keys @@ -69,6 +78,8 @@ Functions Module Contents --------------- +.. py:data:: DEFAULT_ENV_VARS + .. py:class:: UniqueKeyLoader(stream) Bases: :py:obj:`yaml.SafeLoader` @@ -215,6 +226,12 @@ Module Contents initialized with the empty string, all events are passed. + .. py:attribute:: min_level + + + .. py:attribute:: max_level + + .. py:method:: filter(record) -> bool Determine if the specified record is to be logged. @@ -230,6 +247,8 @@ Module Contents .. py:function:: check_traj_files(batch, traj_dir) -> bool +.. py:function:: setup_env_vars() -> None + .. py:function:: new_trainer_context(*, config: dict[str, Any], distributed: bool = False) .. py:function:: _resolve_scale_factor_submodule(model: torch.nn.Module, name: str) diff --git a/_sources/autoapi/core/datasets/ase_datasets/index.rst b/_sources/autoapi/core/datasets/ase_datasets/index.rst index 8cfba4ecb3..52a7112a0f 100644 --- a/_sources/autoapi/core/datasets/ase_datasets/index.rst +++ b/_sources/autoapi/core/datasets/ase_datasets/index.rst @@ -53,7 +53,7 @@ Module Contents .. py:class:: AseAtomsDataset(config: dict, atoms_transform: Callable[[ase.Atoms, Any, Ellipsis], ase.Atoms] = apply_one_tags) - Bases: :py:obj:`torch.utils.data.Dataset`, :py:obj:`abc.ABC` + Bases: :py:obj:`fairchem.core.datasets.base_dataset.BaseDataset`, :py:obj:`abc.ABC` This is an abstract Dataset that includes helpful utilities for turning @@ -70,7 +70,25 @@ Module Contents Identifiers need not be any particular type. - .. py:method:: __len__() -> int + .. py:attribute:: a2g_args + + + .. py:attribute:: a2g + + + .. py:attribute:: key_mapping + + + .. py:attribute:: transforms + + + .. py:attribute:: atoms_transform + + + .. py:attribute:: ids + + + .. py:attribute:: num_samples .. py:method:: __getitem__(idx) @@ -91,10 +109,10 @@ Module Contents - .. py:method:: close_db() -> None + .. py:method:: sample_property_metadata(num_samples: int = 100) -> dict - .. py:method:: get_metadata(num_samples: int = 100) -> dict + .. py:method:: get_metadata(attr, idx) .. py:class:: AseReadDataset(config: dict, atoms_transform: Callable[[ase.Atoms, Any, Ellipsis], ase.Atoms] = apply_one_tags) @@ -225,7 +243,7 @@ Module Contents .. py:method:: get_atoms(idx: str) -> ase.Atoms - .. py:method:: get_metadata(num_samples: int = 100) -> dict + .. py:method:: sample_property_metadata(num_samples: int = 100) -> dict .. py:method:: get_relaxed_energy(identifier) -> float @@ -310,10 +328,10 @@ Module Contents - .. py:method:: close_db() -> None + .. py:method:: __del__() - .. py:method:: get_metadata(num_samples: int = 100) -> dict + .. py:method:: sample_property_metadata(num_samples: int = 100) -> dict .. py:method:: get_relaxed_energy(identifier) diff --git a/_sources/autoapi/core/datasets/base_dataset/index.rst b/_sources/autoapi/core/datasets/base_dataset/index.rst new file mode 100644 index 0000000000..1ddedcd058 --- /dev/null +++ b/_sources/autoapi/core/datasets/base_dataset/index.rst @@ -0,0 +1,150 @@ +core.datasets.base_dataset +========================== + +.. py:module:: core.datasets.base_dataset + +.. autoapi-nested-parse:: + + Copyright (c) Meta, Inc. and its affiliates. + This source code is licensed under the MIT license found in the + LICENSE file in the root directory of this source tree. + + + +Attributes +---------- + +.. autoapisummary:: + + core.datasets.base_dataset.T_co + + +Exceptions +---------- + +.. autoapisummary:: + + core.datasets.base_dataset.UnsupportedDatasetError + + +Classes +------- + +.. autoapisummary:: + + core.datasets.base_dataset.DatasetMetadata + core.datasets.base_dataset.BaseDataset + core.datasets.base_dataset.Subset + + +Functions +--------- + +.. autoapisummary:: + + core.datasets.base_dataset.create_dataset + + +Module Contents +--------------- + +.. py:data:: T_co + +.. py:class:: DatasetMetadata + + Bases: :py:obj:`NamedTuple` + + + .. py:attribute:: natoms + :type: numpy.typing.ArrayLike | None + :value: None + + + +.. py:exception:: UnsupportedDatasetError + + Bases: :py:obj:`ValueError` + + + Inappropriate argument value (of correct type). + + +.. py:class:: BaseDataset(config: dict) + + Bases: :py:obj:`torch.utils.data.Dataset`\ [\ :py:obj:`T_co`\ ] + + + Base Dataset class for all OCP datasets. + + + .. py:attribute:: config + + + .. py:attribute:: paths + :value: [] + + + + .. py:attribute:: lin_ref + :value: None + + + + .. py:method:: __len__() -> int + + + .. py:method:: metadata_hasattr(attr) -> bool + + + .. py:property:: indices + + + .. py:property:: _metadata + :type: DatasetMetadata + + + + .. py:method:: get_metadata(attr, idx) + + +.. py:class:: Subset(dataset: BaseDataset, indices: collections.abc.Sequence[int], metadata: DatasetMetadata | None = None) + + Bases: :py:obj:`torch.utils.data.Subset`, :py:obj:`BaseDataset` + + + A pytorch subset that also takes metadata if given. + + + .. py:attribute:: metadata + + + .. py:attribute:: indices + + + .. py:attribute:: num_samples + + + .. py:attribute:: config + + + .. py:property:: _metadata + :type: DatasetMetadata + + + + .. py:method:: get_metadata(attr, idx) + + +.. py:function:: create_dataset(config: dict[str, Any], split: str) -> Subset + + Create a dataset from a config dictionary + + :param config: dataset config dictionary + :type config: dict + :param split: name of split + :type split: str + + :returns: dataset subset class + :rtype: Subset + + diff --git a/_sources/autoapi/core/datasets/index.rst b/_sources/autoapi/core/datasets/index.rst index 057404a2ab..34a7b2c572 100644 --- a/_sources/autoapi/core/datasets/index.rst +++ b/_sources/autoapi/core/datasets/index.rst @@ -21,6 +21,7 @@ Submodules /autoapi/core/datasets/_utils/index /autoapi/core/datasets/ase_datasets/index + /autoapi/core/datasets/base_dataset/index /autoapi/core/datasets/lmdb_database/index /autoapi/core/datasets/lmdb_dataset/index /autoapi/core/datasets/oc22_lmdb_dataset/index @@ -37,9 +38,6 @@ Classes core.datasets.AseReadMultiStructureDataset core.datasets.LMDBDatabase core.datasets.LmdbDataset - core.datasets.SinglePointLmdbDataset - core.datasets.TrajectoryLmdbDataset - core.datasets.OC22LmdbDataset Functions @@ -47,6 +45,7 @@ Functions .. autoapisummary:: + core.datasets.create_dataset core.datasets.data_list_collater @@ -132,10 +131,10 @@ Package Contents - .. py:method:: close_db() -> None + .. py:method:: __del__() - .. py:method:: get_metadata(num_samples: int = 100) -> dict + .. py:method:: sample_property_metadata(num_samples: int = 100) -> dict .. py:method:: get_relaxed_energy(identifier) @@ -271,12 +270,25 @@ Package Contents .. py:method:: get_atoms(idx: str) -> ase.Atoms - .. py:method:: get_metadata(num_samples: int = 100) -> dict + .. py:method:: sample_property_metadata(num_samples: int = 100) -> dict .. py:method:: get_relaxed_energy(identifier) -> float +.. py:function:: create_dataset(config: dict[str, Any], split: str) -> Subset + + Create a dataset from a config dictionary + + :param config: dataset config dictionary + :type config: dict + :param split: name of split + :type split: str + + :returns: dataset subset class + :rtype: Subset + + .. py:class:: LMDBDatabase(filename: str | pathlib.Path | None = None, create_indices: bool = True, use_lock_file: bool = False, serial: bool = False, readonly: bool = False, *args, **kwargs) Bases: :py:obj:`ase.db.core.Database` @@ -285,6 +297,19 @@ Package Contents Base class for all databases. + .. py:attribute:: readonly + + + .. py:attribute:: ids + :value: [] + + + + .. py:attribute:: deleted_ids + :value: [] + + + .. py:method:: __enter__() -> typing_extensions.Self @@ -351,29 +376,10 @@ Package Contents .. py:class:: LmdbDataset(config) - Bases: :py:obj:`torch.utils.data.Dataset`\ [\ :py:obj:`T_co`\ ] - - - An abstract class representing a :class:`Dataset`. + Bases: :py:obj:`fairchem.core.datasets.base_dataset.BaseDataset` - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. - - - .. py:attribute:: metadata_path - :type: pathlib.Path + Base Dataset class for all OCP datasets. .. py:attribute:: sharded @@ -391,101 +397,26 @@ Package Contents :type config: dict - .. py:method:: __len__() -> int - - - .. py:method:: __getitem__(idx: int) -> T_co - - - .. py:method:: connect_db(lmdb_path: pathlib.Path | None = None) -> lmdb.Environment - - - .. py:method:: close_db() -> None - - - .. py:method:: get_metadata(num_samples: int = 100) - + .. py:attribute:: path -.. py:class:: SinglePointLmdbDataset(config, transform=None) - Bases: :py:obj:`LmdbDataset`\ [\ :py:obj:`torch_geometric.data.data.BaseData`\ ] + .. py:attribute:: key_mapping - An abstract class representing a :class:`Dataset`. + .. py:attribute:: transforms - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. + .. py:method:: __getitem__(idx: int) -> T_co -.. py:class:: TrajectoryLmdbDataset(config, transform=None) - Bases: :py:obj:`LmdbDataset`\ [\ :py:obj:`torch_geometric.data.data.BaseData`\ ] + .. py:method:: connect_db(lmdb_path: pathlib.Path | None = None) -> lmdb.Environment - An abstract class representing a :class:`Dataset`. + .. py:method:: __del__() - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. + .. py:method:: sample_property_metadata(num_samples: int = 100) .. py:function:: data_list_collater(data_list: list[torch_geometric.data.data.BaseData], otf_graph: bool = False) -> torch_geometric.data.data.BaseData -.. py:class:: OC22LmdbDataset(config, transform=None) - - Bases: :py:obj:`torch.utils.data.Dataset` - - - Dataset class to load from LMDB files containing relaxation - trajectories or single point computations. - - Useful for Structure to Energy & Force (S2EF), Initial State to - Relaxed State (IS2RS), and Initial State to Relaxed Energy (IS2RE) tasks. - - The keys in the LMDB must be integers (stored as ascii objects) starting - from 0 through the length of the LMDB. For historical reasons any key named - "length" is ignored since that was used to infer length of many lmdbs in the same - folder, but lmdb lengths are now calculated directly from the number of keys. - - :param config: Dataset configuration - :type config: dict - :param transform: Data transform function. - (default: :obj:`None`) - :type transform: callable, optional - - - .. py:method:: __len__() -> int - - - .. py:method:: __getitem__(idx) - - - .. py:method:: connect_db(lmdb_path=None) - - - .. py:method:: close_db() -> None - - diff --git a/_sources/autoapi/core/datasets/lmdb_database/index.rst b/_sources/autoapi/core/datasets/lmdb_database/index.rst index 8bb8e266cb..1c5f256ca1 100644 --- a/_sources/autoapi/core/datasets/lmdb_database/index.rst +++ b/_sources/autoapi/core/datasets/lmdb_database/index.rst @@ -46,6 +46,19 @@ Module Contents Base class for all databases. + .. py:attribute:: readonly + + + .. py:attribute:: ids + :value: [] + + + + .. py:attribute:: deleted_ids + :value: [] + + + .. py:method:: __enter__() -> typing_extensions.Self diff --git a/_sources/autoapi/core/datasets/lmdb_dataset/index.rst b/_sources/autoapi/core/datasets/lmdb_dataset/index.rst index 49153c4517..838e0ee739 100644 --- a/_sources/autoapi/core/datasets/lmdb_dataset/index.rst +++ b/_sources/autoapi/core/datasets/lmdb_dataset/index.rst @@ -25,8 +25,6 @@ Classes .. autoapisummary:: core.datasets.lmdb_dataset.LmdbDataset - core.datasets.lmdb_dataset.SinglePointLmdbDataset - core.datasets.lmdb_dataset.TrajectoryLmdbDataset Functions @@ -44,29 +42,10 @@ Module Contents .. py:class:: LmdbDataset(config) - Bases: :py:obj:`torch.utils.data.Dataset`\ [\ :py:obj:`T_co`\ ] + Bases: :py:obj:`fairchem.core.datasets.base_dataset.BaseDataset` - An abstract class representing a :class:`Dataset`. - - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. - - - .. py:attribute:: metadata_path - :type: pathlib.Path + Base Dataset class for all OCP datasets. .. py:attribute:: sharded @@ -84,65 +63,25 @@ Module Contents :type config: dict - .. py:method:: __len__() -> int - - - .. py:method:: __getitem__(idx: int) -> T_co - - - .. py:method:: connect_db(lmdb_path: pathlib.Path | None = None) -> lmdb.Environment - - - .. py:method:: close_db() -> None - - - .. py:method:: get_metadata(num_samples: int = 100) + .. py:attribute:: path -.. py:class:: SinglePointLmdbDataset(config, transform=None) + .. py:attribute:: key_mapping - Bases: :py:obj:`LmdbDataset`\ [\ :py:obj:`torch_geometric.data.data.BaseData`\ ] + .. py:attribute:: transforms - An abstract class representing a :class:`Dataset`. - - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. + .. py:method:: __getitem__(idx: int) -> T_co -.. py:class:: TrajectoryLmdbDataset(config, transform=None) - Bases: :py:obj:`LmdbDataset`\ [\ :py:obj:`torch_geometric.data.data.BaseData`\ ] + .. py:method:: connect_db(lmdb_path: pathlib.Path | None = None) -> lmdb.Environment - An abstract class representing a :class:`Dataset`. + .. py:method:: __del__() - All datasets that represent a map from keys to data samples should subclass - it. All subclasses should overwrite :meth:`__getitem__`, supporting fetching a - data sample for a given key. Subclasses could also optionally overwrite - :meth:`__len__`, which is expected to return the size of the dataset by many - :class:`~torch.utils.data.Sampler` implementations and the default options - of :class:`~torch.utils.data.DataLoader`. Subclasses could also - optionally implement :meth:`__getitems__`, for speedup batched samples - loading. This method accepts list of indices of samples of batch and returns - list of samples. - .. note:: - :class:`~torch.utils.data.DataLoader` by default constructs an index - sampler that yields integral indices. To make it work with a map-style - dataset with non-integral indices/keys, a custom sampler must be provided. + .. py:method:: sample_property_metadata(num_samples: int = 100) .. py:function:: data_list_collater(data_list: list[torch_geometric.data.data.BaseData], otf_graph: bool = False) -> torch_geometric.data.data.BaseData diff --git a/_sources/autoapi/core/datasets/oc22_lmdb_dataset/index.rst b/_sources/autoapi/core/datasets/oc22_lmdb_dataset/index.rst index 191570ac0c..770cbff8d4 100644 --- a/_sources/autoapi/core/datasets/oc22_lmdb_dataset/index.rst +++ b/_sources/autoapi/core/datasets/oc22_lmdb_dataset/index.rst @@ -25,7 +25,7 @@ Module Contents .. py:class:: OC22LmdbDataset(config, transform=None) - Bases: :py:obj:`torch.utils.data.Dataset` + Bases: :py:obj:`fairchem.core.datasets.base_dataset.BaseDataset` Dataset class to load from LMDB files containing relaxation @@ -46,6 +46,21 @@ Module Contents :type transform: callable, optional + .. py:attribute:: path + + + .. py:attribute:: data2train + + + .. py:attribute:: key_mapping + + + .. py:attribute:: transforms + + + .. py:attribute:: train_on_oc20_total_energies + + .. py:method:: __len__() -> int diff --git a/_sources/autoapi/core/models/base/index.rst b/_sources/autoapi/core/models/base/index.rst index 1560f650e7..c4257651e4 100644 --- a/_sources/autoapi/core/models/base/index.rst +++ b/_sources/autoapi/core/models/base/index.rst @@ -17,15 +17,115 @@ Classes .. autoapisummary:: - core.models.base.BaseModel + core.models.base.GraphData + core.models.base.GraphModelMixin + core.models.base.HeadInterface + core.models.base.BackboneInterface + core.models.base.HydraModel Module Contents --------------- -.. py:class:: BaseModel(num_atoms=None, bond_feat_dim=None, num_targets=None) +.. py:class:: GraphData - Bases: :py:obj:`torch.nn.Module` + Class to keep graph attributes nicely packaged. + + + .. py:attribute:: edge_index + :type: torch.Tensor + + + .. py:attribute:: edge_distance + :type: torch.Tensor + + + .. py:attribute:: edge_distance_vec + :type: torch.Tensor + + + .. py:attribute:: cell_offsets + :type: torch.Tensor + + + .. py:attribute:: offset_distances + :type: torch.Tensor + + + .. py:attribute:: neighbors + :type: torch.Tensor + + + .. py:attribute:: batch_full + :type: torch.Tensor + + + .. py:attribute:: atomic_numbers_full + :type: torch.Tensor + + + .. py:attribute:: node_offset + :type: int + :value: 0 + + + +.. py:class:: GraphModelMixin + + Mixin Model class implementing some general convenience properties and methods. + + + .. py:method:: generate_graph(data, cutoff=None, max_neighbors=None, use_pbc=None, otf_graph=None, enforce_max_neighbors_strictly=None) + + + .. py:property:: num_params + :type: int + + + + .. py:method:: no_weight_decay() -> list + + Returns a list of parameters with no weight decay. + + + +.. py:class:: HeadInterface + + .. py:method:: forward(data: torch_geometric.data.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + :abstractmethod: + + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: BackboneInterface + + .. py:method:: forward(data: torch_geometric.data.Batch) -> dict[str, torch.Tensor] + :abstractmethod: + + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: HydraModel(backbone: dict, heads: dict, otf_graph: bool = True) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`GraphModelMixin` Base class for all neural network modules. @@ -60,22 +160,23 @@ Module Contents :vartype training: bool - .. py:method:: forward(data) - :abstractmethod: + .. py:attribute:: otf_graph + .. py:attribute:: backbone_model_name - .. py:method:: generate_graph(data, cutoff=None, max_neighbors=None, use_pbc=None, otf_graph=None, enforce_max_neighbors_strictly=None) + .. py:attribute:: backbone + :type: BackboneInterface - .. py:property:: num_params - :type: int + .. py:attribute:: output_heads + :type: dict[str, HeadInterface] - .. py:method:: no_weight_decay() -> list + .. py:attribute:: head_names_sorted - Returns a list of parameters with no weight decay. + .. py:method:: forward(data: torch_geometric.data.Batch) diff --git a/_sources/autoapi/core/models/dimenet_plus_plus/index.rst b/_sources/autoapi/core/models/dimenet_plus_plus/index.rst index 2e662dfa2d..09634fbd7e 100644 --- a/_sources/autoapi/core/models/dimenet_plus_plus/index.rst +++ b/_sources/autoapi/core/models/dimenet_plus_plus/index.rst @@ -55,7 +55,9 @@ Classes core.models.dimenet_plus_plus.InteractionPPBlock core.models.dimenet_plus_plus.OutputPPBlock core.models.dimenet_plus_plus.DimeNetPlusPlus + core.models.dimenet_plus_plus.DimeNetPlusPlusWrapEnergyAndForceHead core.models.dimenet_plus_plus.DimeNetPlusPlusWrap + core.models.dimenet_plus_plus.DimeNetPlusPlusWrapBackbone Module Contents @@ -102,6 +104,42 @@ Module Contents :vartype training: bool + .. py:attribute:: act + + + .. py:attribute:: lin_rbf1 + + + .. py:attribute:: lin_rbf2 + + + .. py:attribute:: lin_sbf1 + + + .. py:attribute:: lin_sbf2 + + + .. py:attribute:: lin_kj + + + .. py:attribute:: lin_ji + + + .. py:attribute:: lin_down + + + .. py:attribute:: lin_up + + + .. py:attribute:: layers_before_skip + + + .. py:attribute:: lin + + + .. py:attribute:: layers_after_skip + + .. py:method:: reset_parameters() -> None @@ -145,6 +183,21 @@ Module Contents :vartype training: bool + .. py:attribute:: act + + + .. py:attribute:: lin_rbf + + + .. py:attribute:: lin_up + + + .. py:attribute:: lins + + + .. py:attribute:: lin + + .. py:method:: reset_parameters() -> None @@ -194,6 +247,30 @@ Module Contents + .. py:attribute:: act + + + .. py:attribute:: cutoff + + + .. py:attribute:: num_blocks + + + .. py:attribute:: rbf + + + .. py:attribute:: sbf + + + .. py:attribute:: emb + + + .. py:attribute:: output_blocks + + + .. py:attribute:: interaction_blocks + + .. py:method:: reset_parameters() -> None @@ -205,9 +282,63 @@ Module Contents -.. py:class:: DimeNetPlusPlusWrap(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, hidden_channels: int = 128, num_blocks: int = 4, int_emb_size: int = 64, basis_emb_size: int = 8, out_emb_channels: int = 256, num_spherical: int = 7, num_radial: int = 6, otf_graph: bool = False, cutoff: float = 10.0, envelope_exponent: int = 5, num_before_skip: int = 1, num_after_skip: int = 2, num_output_layers: int = 3) +.. py:class:: DimeNetPlusPlusWrapEnergyAndForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: regress_forces + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] - Bases: :py:obj:`DimeNetPlusPlus`, :py:obj:`fairchem.core.models.base.BaseModel` + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: DimeNetPlusPlusWrap(use_pbc: bool = True, regress_forces: bool = True, hidden_channels: int = 128, num_blocks: int = 4, int_emb_size: int = 64, basis_emb_size: int = 8, out_emb_channels: int = 256, num_spherical: int = 7, num_radial: int = 6, otf_graph: bool = False, cutoff: float = 10.0, envelope_exponent: int = 5, num_before_skip: int = 1, num_after_skip: int = 2, num_output_layers: int = 3) + + Bases: :py:obj:`DimeNetPlusPlus`, :py:obj:`fairchem.core.models.base.GraphModelMixin` DimeNet++ implementation based on https://github.com/klicperajo/dimenet. @@ -243,6 +374,23 @@ Module Contents (default: :obj:`silu`) + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: max_neighbors + :value: 50 + + + .. py:method:: _forward(data) @@ -254,3 +402,44 @@ Module Contents +.. py:class:: DimeNetPlusPlusWrapBackbone(use_pbc: bool = True, regress_forces: bool = True, hidden_channels: int = 128, num_blocks: int = 4, int_emb_size: int = 64, basis_emb_size: int = 8, out_emb_channels: int = 256, num_spherical: int = 7, num_radial: int = 6, otf_graph: bool = False, cutoff: float = 10.0, envelope_exponent: int = 5, num_before_skip: int = 1, num_after_skip: int = 2, num_output_layers: int = 3) + + Bases: :py:obj:`DimeNetPlusPlusWrap`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + DimeNet++ implementation based on https://github.com/klicperajo/dimenet. + + :param hidden_channels: Hidden embedding size. + :type hidden_channels: int + :param out_channels: Size of each output sample. + :type out_channels: int + :param num_blocks: Number of building blocks. + :type num_blocks: int + :param int_emb_size: Embedding size used for interaction triplets + :type int_emb_size: int + :param basis_emb_size: Embedding size used in the basis transformation + :type basis_emb_size: int + :param out_emb_channels: Embedding size used for atoms in the output block + :type out_emb_channels: int + :param num_spherical: Number of spherical harmonics. + :type num_spherical: int + :param num_radial: Number of radial basis functions. + :type num_radial: int + :param cutoff: (float, optional): Cutoff distance for interatomic + interactions. (default: :obj:`5.0`) + :param envelope_exponent: Shape of the smooth cutoff. + (default: :obj:`5`) + :type envelope_exponent: int, optional + :param num_before_skip: (int, optional): Number of residual layers in the + interaction blocks before the skip connection. (default: :obj:`1`) + :param num_after_skip: (int, optional): Number of residual layers in the + interaction blocks after the skip connection. (default: :obj:`2`) + :param num_output_layers: (int, optional): Number of linear layers for the + output blocks. (default: :obj:`3`) + :param act: (function, optional): The activation funtion. + (default: :obj:`silu`) + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch) -> dict[str, torch.Tensor] + + diff --git a/_sources/autoapi/core/models/equiformer_v2/activation/index.rst b/_sources/autoapi/core/models/equiformer_v2/activation/index.rst index 902e99d3f3..20404a62de 100644 --- a/_sources/autoapi/core/models/equiformer_v2/activation/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/activation/index.rst @@ -60,6 +60,14 @@ Module Contents :vartype training: bool + .. py:attribute:: inplace + + + .. py:attribute:: scale_factor + :value: 1.6791767923989418 + + + .. py:method:: forward(inputs) @@ -110,6 +118,18 @@ Module Contents :vartype training: bool + .. py:attribute:: in_channels + + + .. py:attribute:: out_channels + + + .. py:attribute:: w + + + .. py:attribute:: act + + .. py:method:: forward(inputs) @@ -150,6 +170,18 @@ Module Contents :vartype training: bool + .. py:attribute:: in_channels + + + .. py:attribute:: out_channels + + + .. py:attribute:: w + + + .. py:attribute:: act + + .. py:method:: forward(inputs) @@ -190,6 +222,9 @@ Module Contents :vartype training: bool + .. py:attribute:: alpha + + .. py:method:: forward(x) @@ -240,6 +275,14 @@ Module Contents :vartype training: bool + .. py:attribute:: act + + + .. py:attribute:: scale_factor + :value: 1.531320475574866 + + + .. py:method:: forward(x) @@ -290,6 +333,11 @@ Module Contents :vartype training: bool + .. py:attribute:: scale_factor + :value: 1.8467055342154763 + + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -330,6 +378,34 @@ Module Contents :vartype training: bool + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: num_components + :value: 0 + + + + .. py:attribute:: expand_index + + + .. py:attribute:: start_idx + :value: 0 + + + + .. py:attribute:: scalar_act + + + .. py:attribute:: gate_act + + .. py:method:: forward(gating_scalars, input_tensors) `gating_scalars`: shape [N, lmax * num_channels] @@ -345,6 +421,15 @@ Module Contents Assume we only have one resolution + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: act + + .. py:method:: forward(inputs, SO3_grid) @@ -385,6 +470,18 @@ Module Contents :vartype training: bool + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: scalar_act + + + .. py:attribute:: s2_act + + .. py:method:: forward(input_scalars, input_tensors, SO3_grid) diff --git a/_sources/autoapi/core/models/equiformer_v2/drop/index.rst b/_sources/autoapi/core/models/equiformer_v2/drop/index.rst index 07e19be194..d6026b0fad 100644 --- a/_sources/autoapi/core/models/equiformer_v2/drop/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/drop/index.rst @@ -51,6 +51,9 @@ Module Contents Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks). + .. py:attribute:: drop_prob + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -72,6 +75,9 @@ Module Contents Consider batch for graph data when dropping paths. + .. py:attribute:: drop_prob + + .. py:method:: forward(x: torch.Tensor, batch) -> torch.Tensor @@ -122,6 +128,21 @@ Module Contents :vartype training: bool + .. py:attribute:: irreps + + + .. py:attribute:: num_irreps + + + .. py:attribute:: drop_prob + + + .. py:attribute:: drop + + + .. py:attribute:: mul + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -162,6 +183,12 @@ Module Contents :vartype training: bool + .. py:attribute:: irreps + + + .. py:attribute:: drop_prob + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -212,6 +239,15 @@ Module Contents :vartype training: bool + .. py:attribute:: drop_prob + + + .. py:attribute:: drop + + + .. py:attribute:: drop_graph + + .. py:method:: forward(x: torch.Tensor, batch=None) -> torch.Tensor diff --git a/_sources/autoapi/core/models/equiformer_v2/equiformer_v2/index.rst b/_sources/autoapi/core/models/equiformer_v2/equiformer_v2/index.rst new file mode 100644 index 0000000000..418930d59b --- /dev/null +++ b/_sources/autoapi/core/models/equiformer_v2/equiformer_v2/index.rst @@ -0,0 +1,542 @@ +core.models.equiformer_v2.equiformer_v2 +======================================= + +.. py:module:: core.models.equiformer_v2.equiformer_v2 + + +Attributes +---------- + +.. autoapisummary:: + + core.models.equiformer_v2.equiformer_v2._AVG_NUM_NODES + core.models.equiformer_v2.equiformer_v2._AVG_DEGREE + + +Classes +------- + +.. autoapisummary:: + + core.models.equiformer_v2.equiformer_v2.EquiformerV2 + core.models.equiformer_v2.equiformer_v2.EquiformerV2Backbone + core.models.equiformer_v2.equiformer_v2.EquiformerV2EnergyHead + core.models.equiformer_v2.equiformer_v2.EquiformerV2ForceHead + + +Module Contents +--------------- + +.. py:data:: _AVG_NUM_NODES + :value: 77.81317 + + +.. py:data:: _AVG_DEGREE + :value: 23.395238876342773 + + +.. py:class:: EquiformerV2(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = True, max_neighbors: int = 500, max_radius: float = 5.0, max_num_elements: int = 90, num_layers: int = 12, sphere_channels: int = 128, attn_hidden_channels: int = 128, num_heads: int = 8, attn_alpha_channels: int = 32, attn_value_channels: int = 16, ffn_hidden_channels: int = 512, norm_type: str = 'rms_norm_sh', lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, grid_resolution: int | None = None, num_sphere_samples: int = 128, edge_channels: int = 128, use_atom_edge_embedding: bool = True, share_atom_edge_embedding: bool = False, use_m_share_rad: bool = False, distance_function: str = 'gaussian', num_distance_basis: int = 512, attn_activation: str = 'scaled_silu', use_s2_act_attn: bool = False, use_attn_renorm: bool = True, ffn_activation: str = 'scaled_silu', use_gate_act: bool = False, use_grid_mlp: bool = False, use_sep_s2_act: bool = True, alpha_drop: float = 0.1, drop_path_rate: float = 0.05, proj_drop: float = 0.0, weight_init: str = 'normal', enforce_max_neighbors_strictly: bool = True, avg_num_nodes: float | None = None, avg_degree: float | None = None, use_energy_lin_ref: bool | None = False, load_energy_lin_ref: bool | None = False) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` + + + Equiformer with graph attention built upon SO(2) convolution and feedforward network built upon S2 activation + + :param use_pbc: Use periodic boundary conditions + :type use_pbc: bool + :param regress_forces: Compute forces + :type regress_forces: bool + :param otf_graph: Compute graph On The Fly (OTF) + :type otf_graph: bool + :param max_neighbors: Maximum number of neighbors per atom + :type max_neighbors: int + :param max_radius: Maximum distance between nieghboring atoms in Angstroms + :type max_radius: float + :param max_num_elements: Maximum atomic number + :type max_num_elements: int + :param num_layers: Number of layers in the GNN + :type num_layers: int + :param sphere_channels: Number of spherical channels (one set per resolution) + :type sphere_channels: int + :param attn_hidden_channels: Number of hidden channels used during SO(2) graph attention + :type attn_hidden_channels: int + :param num_heads: Number of attention heads + :type num_heads: int + :param attn_alpha_head: Number of channels for alpha vector in each attention head + :type attn_alpha_head: int + :param attn_value_head: Number of channels for value vector in each attention head + :type attn_value_head: int + :param ffn_hidden_channels: Number of hidden channels used during feedforward network + :type ffn_hidden_channels: int + :param norm_type: Type of normalization layer (['layer_norm', 'layer_norm_sh', 'rms_norm_sh']) + :type norm_type: str + :param lmax_list: List of maximum degree of the spherical harmonics (1 to 10) + :type lmax_list: int + :param mmax_list: List of maximum order of the spherical harmonics (0 to lmax) + :type mmax_list: int + :param grid_resolution: Resolution of SO3_Grid + :type grid_resolution: int + :param num_sphere_samples: Number of samples used to approximate the integration of the sphere in the output blocks + :type num_sphere_samples: int + :param edge_channels: Number of channels for the edge invariant features + :type edge_channels: int + :param use_atom_edge_embedding: Whether to use atomic embedding along with relative distance for edge scalar features + :type use_atom_edge_embedding: bool + :param share_atom_edge_embedding: Whether to share `atom_edge_embedding` across all blocks + :type share_atom_edge_embedding: bool + :param use_m_share_rad: Whether all m components within a type-L vector of one channel share radial function weights + :type use_m_share_rad: bool + :param distance_function: Basis function used for distances + :type distance_function: "gaussian", "sigmoid", "linearsigmoid", "silu" + :param attn_activation: Type of activation function for SO(2) graph attention + :type attn_activation: str + :param use_s2_act_attn: Whether to use attention after S2 activation. Otherwise, use the same attention as Equiformer + :type use_s2_act_attn: bool + :param use_attn_renorm: Whether to re-normalize attention weights + :type use_attn_renorm: bool + :param ffn_activation: Type of activation function for feedforward network + :type ffn_activation: str + :param use_gate_act: If `True`, use gate activation. Otherwise, use S2 activation + :type use_gate_act: bool + :param use_grid_mlp: If `True`, use projecting to grids and performing MLPs for FFNs. + :type use_grid_mlp: bool + :param use_sep_s2_act: If `True`, use separable S2 activation when `use_gate_act` is False. + :type use_sep_s2_act: bool + :param alpha_drop: Dropout rate for attention weights + :type alpha_drop: float + :param drop_path_rate: Drop path rate + :type drop_path_rate: float + :param proj_drop: Dropout rate for outputs of attention and FFN in Transformer blocks + :type proj_drop: float + :param weight_init: ['normal', 'uniform'] initialization of weights of linear layers except those in radial functions + :type weight_init: str + :param enforce_max_neighbors_strictly: When edges are subselected based on the `max_neighbors` arg, arbitrarily select amongst equidistant / degenerate edges to have exactly the correct number. + :type enforce_max_neighbors_strictly: bool + :param avg_num_nodes: Average number of nodes per graph + :type avg_num_nodes: float + :param avg_degree: Average degree of nodes in the graph + :type avg_degree: float + :param use_energy_lin_ref: Whether to add the per-atom energy references during prediction. + During training and validation, this should be kept `False` since we use the `lin_ref` parameter in the OC22 dataloader to subtract the per-atom linear references from the energy targets. + During prediction (where we don't have energy targets), this can be set to `True` to add the per-atom linear references to the predicted energies. + :type use_energy_lin_ref: bool + :param load_energy_lin_ref: Whether to add nn.Parameters for the per-element energy references. + This additional flag is there to ensure compatibility when strict-loading checkpoints, since the `use_energy_lin_ref` flag can be either True or False even if the model is trained with linear references. + You can't have use_energy_lin_ref = True and load_energy_lin_ref = False, since the model will not have the parameters for the linear references. All other combinations are fine. + :type load_energy_lin_ref: bool + + + .. py:attribute:: use_pbc + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: max_radius + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: num_layers + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: attn_hidden_channels + + + .. py:attribute:: num_heads + + + .. py:attribute:: attn_alpha_channels + + + .. py:attribute:: attn_value_channels + + + .. py:attribute:: ffn_hidden_channels + + + .. py:attribute:: norm_type + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: grid_resolution + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: edge_channels + + + .. py:attribute:: use_atom_edge_embedding + + + .. py:attribute:: share_atom_edge_embedding + + + .. py:attribute:: use_m_share_rad + + + .. py:attribute:: distance_function + + + .. py:attribute:: num_distance_basis + + + .. py:attribute:: attn_activation + + + .. py:attribute:: use_s2_act_attn + + + .. py:attribute:: use_attn_renorm + + + .. py:attribute:: ffn_activation + + + .. py:attribute:: use_gate_act + + + .. py:attribute:: use_grid_mlp + + + .. py:attribute:: use_sep_s2_act + + + .. py:attribute:: alpha_drop + + + .. py:attribute:: drop_path_rate + + + .. py:attribute:: proj_drop + + + .. py:attribute:: avg_num_nodes + + + .. py:attribute:: avg_degree + + + .. py:attribute:: use_energy_lin_ref + + + .. py:attribute:: load_energy_lin_ref + + + .. py:attribute:: weight_init + + + .. py:attribute:: enforce_max_neighbors_strictly + + + .. py:attribute:: device + :value: 'cpu' + + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: sphere_channels_all + :type: int + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: SO3_rotation + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: edge_degree_embedding + + + .. py:attribute:: blocks + + + .. py:attribute:: norm + + + .. py:attribute:: energy_block + + + .. py:method:: _init_gp_partitions(atomic_numbers_full, data_batch_full, edge_index, edge_distance, edge_distance_vec) + + Graph Parallel + This creates the required partial tensors for each rank given the full tensors. + The tensors are split on the dimension along the node index using node_partition. + + + + .. py:method:: forward(data) + + + .. py:method:: _init_edge_rot_mat(data, edge_index, edge_distance_vec) + + + .. py:property:: num_params + + + .. py:method:: _init_weights(m) + + + .. py:method:: _uniform_init_rad_func_linear_weights(m) + + + .. py:method:: _uniform_init_linear_weights(m) + + + .. py:method:: no_weight_decay() -> set + + Returns a list of parameters with no weight decay. + + + +.. py:class:: EquiformerV2Backbone(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = True, max_neighbors: int = 500, max_radius: float = 5.0, max_num_elements: int = 90, num_layers: int = 12, sphere_channels: int = 128, attn_hidden_channels: int = 128, num_heads: int = 8, attn_alpha_channels: int = 32, attn_value_channels: int = 16, ffn_hidden_channels: int = 512, norm_type: str = 'rms_norm_sh', lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, grid_resolution: int | None = None, num_sphere_samples: int = 128, edge_channels: int = 128, use_atom_edge_embedding: bool = True, share_atom_edge_embedding: bool = False, use_m_share_rad: bool = False, distance_function: str = 'gaussian', num_distance_basis: int = 512, attn_activation: str = 'scaled_silu', use_s2_act_attn: bool = False, use_attn_renorm: bool = True, ffn_activation: str = 'scaled_silu', use_gate_act: bool = False, use_grid_mlp: bool = False, use_sep_s2_act: bool = True, alpha_drop: float = 0.1, drop_path_rate: float = 0.05, proj_drop: float = 0.0, weight_init: str = 'normal', enforce_max_neighbors_strictly: bool = True, avg_num_nodes: float | None = None, avg_degree: float | None = None, use_energy_lin_ref: bool | None = False, load_energy_lin_ref: bool | None = False) + + Bases: :py:obj:`EquiformerV2`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + Equiformer with graph attention built upon SO(2) convolution and feedforward network built upon S2 activation + + :param use_pbc: Use periodic boundary conditions + :type use_pbc: bool + :param regress_forces: Compute forces + :type regress_forces: bool + :param otf_graph: Compute graph On The Fly (OTF) + :type otf_graph: bool + :param max_neighbors: Maximum number of neighbors per atom + :type max_neighbors: int + :param max_radius: Maximum distance between nieghboring atoms in Angstroms + :type max_radius: float + :param max_num_elements: Maximum atomic number + :type max_num_elements: int + :param num_layers: Number of layers in the GNN + :type num_layers: int + :param sphere_channels: Number of spherical channels (one set per resolution) + :type sphere_channels: int + :param attn_hidden_channels: Number of hidden channels used during SO(2) graph attention + :type attn_hidden_channels: int + :param num_heads: Number of attention heads + :type num_heads: int + :param attn_alpha_head: Number of channels for alpha vector in each attention head + :type attn_alpha_head: int + :param attn_value_head: Number of channels for value vector in each attention head + :type attn_value_head: int + :param ffn_hidden_channels: Number of hidden channels used during feedforward network + :type ffn_hidden_channels: int + :param norm_type: Type of normalization layer (['layer_norm', 'layer_norm_sh', 'rms_norm_sh']) + :type norm_type: str + :param lmax_list: List of maximum degree of the spherical harmonics (1 to 10) + :type lmax_list: int + :param mmax_list: List of maximum order of the spherical harmonics (0 to lmax) + :type mmax_list: int + :param grid_resolution: Resolution of SO3_Grid + :type grid_resolution: int + :param num_sphere_samples: Number of samples used to approximate the integration of the sphere in the output blocks + :type num_sphere_samples: int + :param edge_channels: Number of channels for the edge invariant features + :type edge_channels: int + :param use_atom_edge_embedding: Whether to use atomic embedding along with relative distance for edge scalar features + :type use_atom_edge_embedding: bool + :param share_atom_edge_embedding: Whether to share `atom_edge_embedding` across all blocks + :type share_atom_edge_embedding: bool + :param use_m_share_rad: Whether all m components within a type-L vector of one channel share radial function weights + :type use_m_share_rad: bool + :param distance_function: Basis function used for distances + :type distance_function: "gaussian", "sigmoid", "linearsigmoid", "silu" + :param attn_activation: Type of activation function for SO(2) graph attention + :type attn_activation: str + :param use_s2_act_attn: Whether to use attention after S2 activation. Otherwise, use the same attention as Equiformer + :type use_s2_act_attn: bool + :param use_attn_renorm: Whether to re-normalize attention weights + :type use_attn_renorm: bool + :param ffn_activation: Type of activation function for feedforward network + :type ffn_activation: str + :param use_gate_act: If `True`, use gate activation. Otherwise, use S2 activation + :type use_gate_act: bool + :param use_grid_mlp: If `True`, use projecting to grids and performing MLPs for FFNs. + :type use_grid_mlp: bool + :param use_sep_s2_act: If `True`, use separable S2 activation when `use_gate_act` is False. + :type use_sep_s2_act: bool + :param alpha_drop: Dropout rate for attention weights + :type alpha_drop: float + :param drop_path_rate: Drop path rate + :type drop_path_rate: float + :param proj_drop: Dropout rate for outputs of attention and FFN in Transformer blocks + :type proj_drop: float + :param weight_init: ['normal', 'uniform'] initialization of weights of linear layers except those in radial functions + :type weight_init: str + :param enforce_max_neighbors_strictly: When edges are subselected based on the `max_neighbors` arg, arbitrarily select amongst equidistant / degenerate edges to have exactly the correct number. + :type enforce_max_neighbors_strictly: bool + :param avg_num_nodes: Average number of nodes per graph + :type avg_num_nodes: float + :param avg_degree: Average degree of nodes in the graph + :type avg_degree: float + :param use_energy_lin_ref: Whether to add the per-atom energy references during prediction. + During training and validation, this should be kept `False` since we use the `lin_ref` parameter in the OC22 dataloader to subtract the per-atom linear references from the energy targets. + During prediction (where we don't have energy targets), this can be set to `True` to add the per-atom linear references to the predicted energies. + :type use_energy_lin_ref: bool + :param load_energy_lin_ref: Whether to add nn.Parameters for the per-element energy references. + This additional flag is there to ensure compatibility when strict-loading checkpoints, since the `use_energy_lin_ref` flag can be either True or False even if the model is trained with linear references. + You can't have use_energy_lin_ref = True and load_energy_lin_ref = False, since the model will not have the parameters for the linear references. All other combinations are fine. + :type load_energy_lin_ref: bool + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch) -> dict[str, torch.Tensor] + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: EquiformerV2EnergyHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: avg_num_nodes + + + .. py:attribute:: energy_block + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor | fairchem.core.models.base.GraphData]) + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: EquiformerV2ForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: force_block + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + diff --git a/_sources/autoapi/core/models/equiformer_v2/equiformer_v2_oc20/index.rst b/_sources/autoapi/core/models/equiformer_v2/equiformer_v2_oc20/index.rst deleted file mode 100644 index 7287a4c2d1..0000000000 --- a/_sources/autoapi/core/models/equiformer_v2/equiformer_v2_oc20/index.rst +++ /dev/null @@ -1,157 +0,0 @@ -core.models.equiformer_v2.equiformer_v2_oc20 -============================================ - -.. py:module:: core.models.equiformer_v2.equiformer_v2_oc20 - - -Attributes ----------- - -.. autoapisummary:: - - core.models.equiformer_v2.equiformer_v2_oc20._AVG_NUM_NODES - core.models.equiformer_v2.equiformer_v2_oc20._AVG_DEGREE - - -Classes -------- - -.. autoapisummary:: - - core.models.equiformer_v2.equiformer_v2_oc20.EquiformerV2_OC20 - - -Module Contents ---------------- - -.. py:data:: _AVG_NUM_NODES - :value: 77.81317 - - -.. py:data:: _AVG_DEGREE - :value: 23.395238876342773 - - -.. py:class:: EquiformerV2_OC20(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = True, max_neighbors: int = 500, max_radius: float = 5.0, max_num_elements: int = 90, num_layers: int = 12, sphere_channels: int = 128, attn_hidden_channels: int = 128, num_heads: int = 8, attn_alpha_channels: int = 32, attn_value_channels: int = 16, ffn_hidden_channels: int = 512, norm_type: str = 'rms_norm_sh', lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, grid_resolution: int | None = None, num_sphere_samples: int = 128, edge_channels: int = 128, use_atom_edge_embedding: bool = True, share_atom_edge_embedding: bool = False, use_m_share_rad: bool = False, distance_function: str = 'gaussian', num_distance_basis: int = 512, attn_activation: str = 'scaled_silu', use_s2_act_attn: bool = False, use_attn_renorm: bool = True, ffn_activation: str = 'scaled_silu', use_gate_act: bool = False, use_grid_mlp: bool = False, use_sep_s2_act: bool = True, alpha_drop: float = 0.1, drop_path_rate: float = 0.05, proj_drop: float = 0.0, weight_init: str = 'normal', enforce_max_neighbors_strictly: bool = True, avg_num_nodes: float | None = None, avg_degree: float | None = None, use_energy_lin_ref: bool | None = False, load_energy_lin_ref: bool | None = False) - - Bases: :py:obj:`fairchem.core.models.base.BaseModel` - - - Equiformer with graph attention built upon SO(2) convolution and feedforward network built upon S2 activation - - :param use_pbc: Use periodic boundary conditions - :type use_pbc: bool - :param regress_forces: Compute forces - :type regress_forces: bool - :param otf_graph: Compute graph On The Fly (OTF) - :type otf_graph: bool - :param max_neighbors: Maximum number of neighbors per atom - :type max_neighbors: int - :param max_radius: Maximum distance between nieghboring atoms in Angstroms - :type max_radius: float - :param max_num_elements: Maximum atomic number - :type max_num_elements: int - :param num_layers: Number of layers in the GNN - :type num_layers: int - :param sphere_channels: Number of spherical channels (one set per resolution) - :type sphere_channels: int - :param attn_hidden_channels: Number of hidden channels used during SO(2) graph attention - :type attn_hidden_channels: int - :param num_heads: Number of attention heads - :type num_heads: int - :param attn_alpha_head: Number of channels for alpha vector in each attention head - :type attn_alpha_head: int - :param attn_value_head: Number of channels for value vector in each attention head - :type attn_value_head: int - :param ffn_hidden_channels: Number of hidden channels used during feedforward network - :type ffn_hidden_channels: int - :param norm_type: Type of normalization layer (['layer_norm', 'layer_norm_sh', 'rms_norm_sh']) - :type norm_type: str - :param lmax_list: List of maximum degree of the spherical harmonics (1 to 10) - :type lmax_list: int - :param mmax_list: List of maximum order of the spherical harmonics (0 to lmax) - :type mmax_list: int - :param grid_resolution: Resolution of SO3_Grid - :type grid_resolution: int - :param num_sphere_samples: Number of samples used to approximate the integration of the sphere in the output blocks - :type num_sphere_samples: int - :param edge_channels: Number of channels for the edge invariant features - :type edge_channels: int - :param use_atom_edge_embedding: Whether to use atomic embedding along with relative distance for edge scalar features - :type use_atom_edge_embedding: bool - :param share_atom_edge_embedding: Whether to share `atom_edge_embedding` across all blocks - :type share_atom_edge_embedding: bool - :param use_m_share_rad: Whether all m components within a type-L vector of one channel share radial function weights - :type use_m_share_rad: bool - :param distance_function: Basis function used for distances - :type distance_function: "gaussian", "sigmoid", "linearsigmoid", "silu" - :param attn_activation: Type of activation function for SO(2) graph attention - :type attn_activation: str - :param use_s2_act_attn: Whether to use attention after S2 activation. Otherwise, use the same attention as Equiformer - :type use_s2_act_attn: bool - :param use_attn_renorm: Whether to re-normalize attention weights - :type use_attn_renorm: bool - :param ffn_activation: Type of activation function for feedforward network - :type ffn_activation: str - :param use_gate_act: If `True`, use gate activation. Otherwise, use S2 activation - :type use_gate_act: bool - :param use_grid_mlp: If `True`, use projecting to grids and performing MLPs for FFNs. - :type use_grid_mlp: bool - :param use_sep_s2_act: If `True`, use separable S2 activation when `use_gate_act` is False. - :type use_sep_s2_act: bool - :param alpha_drop: Dropout rate for attention weights - :type alpha_drop: float - :param drop_path_rate: Drop path rate - :type drop_path_rate: float - :param proj_drop: Dropout rate for outputs of attention and FFN in Transformer blocks - :type proj_drop: float - :param weight_init: ['normal', 'uniform'] initialization of weights of linear layers except those in radial functions - :type weight_init: str - :param enforce_max_neighbors_strictly: When edges are subselected based on the `max_neighbors` arg, arbitrarily select amongst equidistant / degenerate edges to have exactly the correct number. - :type enforce_max_neighbors_strictly: bool - :param avg_num_nodes: Average number of nodes per graph - :type avg_num_nodes: float - :param avg_degree: Average degree of nodes in the graph - :type avg_degree: float - :param use_energy_lin_ref: Whether to add the per-atom energy references during prediction. - During training and validation, this should be kept `False` since we use the `lin_ref` parameter in the OC22 dataloader to subtract the per-atom linear references from the energy targets. - During prediction (where we don't have energy targets), this can be set to `True` to add the per-atom linear references to the predicted energies. - :type use_energy_lin_ref: bool - :param load_energy_lin_ref: Whether to add nn.Parameters for the per-element energy references. - This additional flag is there to ensure compatibility when strict-loading checkpoints, since the `use_energy_lin_ref` flag can be either True or False even if the model is trained with linear references. - You can't have use_energy_lin_ref = True and load_energy_lin_ref = False, since the model will not have the parameters for the linear references. All other combinations are fine. - :type load_energy_lin_ref: bool - - - .. py:method:: _init_gp_partitions(atomic_numbers_full, data_batch_full, edge_index, edge_distance, edge_distance_vec) - - Graph Parallel - This creates the required partial tensors for each rank given the full tensors. - The tensors are split on the dimension along the node index using node_partition. - - - - .. py:method:: forward(data) - - - .. py:method:: _init_edge_rot_mat(data, edge_index, edge_distance_vec) - - - .. py:property:: num_params - - - .. py:method:: _init_weights(m) - - - .. py:method:: _uniform_init_rad_func_linear_weights(m) - - - .. py:method:: _uniform_init_linear_weights(m) - - - .. py:method:: no_weight_decay() -> set - - Returns a list of parameters with no weight decay. - - - diff --git a/_sources/autoapi/core/models/equiformer_v2/gaussian_rbf/index.rst b/_sources/autoapi/core/models/equiformer_v2/gaussian_rbf/index.rst index 0bea0d12c9..f2e361a348 100644 --- a/_sources/autoapi/core/models/equiformer_v2/gaussian_rbf/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/gaussian_rbf/index.rst @@ -62,6 +62,42 @@ Module Contents :vartype training: bool + .. py:attribute:: num_basis + + + .. py:attribute:: cutoff + + + .. py:attribute:: mean + + + .. py:attribute:: std + + + .. py:attribute:: weight + + + .. py:attribute:: bias + + + .. py:attribute:: std_init_max + :value: 1.0 + + + + .. py:attribute:: std_init_min + + + .. py:attribute:: mean_init_max + :value: 1.0 + + + + .. py:attribute:: mean_init_min + :value: 0 + + + .. py:method:: forward(dist: torch.Tensor, node_atom=None, edge_src=None, edge_dst=None) diff --git a/_sources/autoapi/core/models/equiformer_v2/index.rst b/_sources/autoapi/core/models/equiformer_v2/index.rst index a68c05549f..6e37fd57de 100644 --- a/_sources/autoapi/core/models/equiformer_v2/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/index.rst @@ -22,7 +22,7 @@ Submodules /autoapi/core/models/equiformer_v2/activation/index /autoapi/core/models/equiformer_v2/drop/index /autoapi/core/models/equiformer_v2/edge_rot_mat/index - /autoapi/core/models/equiformer_v2/equiformer_v2_oc20/index + /autoapi/core/models/equiformer_v2/equiformer_v2/index /autoapi/core/models/equiformer_v2/gaussian_rbf/index /autoapi/core/models/equiformer_v2/input_block/index /autoapi/core/models/equiformer_v2/layer_norm/index @@ -45,9 +45,9 @@ Classes Package Contents ---------------- -.. py:class:: EquiformerV2(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = True, max_neighbors: int = 500, max_radius: float = 5.0, max_num_elements: int = 90, num_layers: int = 12, sphere_channels: int = 128, attn_hidden_channels: int = 128, num_heads: int = 8, attn_alpha_channels: int = 32, attn_value_channels: int = 16, ffn_hidden_channels: int = 512, norm_type: str = 'rms_norm_sh', lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, grid_resolution: int | None = None, num_sphere_samples: int = 128, edge_channels: int = 128, use_atom_edge_embedding: bool = True, share_atom_edge_embedding: bool = False, use_m_share_rad: bool = False, distance_function: str = 'gaussian', num_distance_basis: int = 512, attn_activation: str = 'scaled_silu', use_s2_act_attn: bool = False, use_attn_renorm: bool = True, ffn_activation: str = 'scaled_silu', use_gate_act: bool = False, use_grid_mlp: bool = False, use_sep_s2_act: bool = True, alpha_drop: float = 0.1, drop_path_rate: float = 0.05, proj_drop: float = 0.0, weight_init: str = 'normal', enforce_max_neighbors_strictly: bool = True, avg_num_nodes: float | None = None, avg_degree: float | None = None, use_energy_lin_ref: bool | None = False, load_energy_lin_ref: bool | None = False) +.. py:class:: EquiformerV2(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = True, max_neighbors: int = 500, max_radius: float = 5.0, max_num_elements: int = 90, num_layers: int = 12, sphere_channels: int = 128, attn_hidden_channels: int = 128, num_heads: int = 8, attn_alpha_channels: int = 32, attn_value_channels: int = 16, ffn_hidden_channels: int = 512, norm_type: str = 'rms_norm_sh', lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, grid_resolution: int | None = None, num_sphere_samples: int = 128, edge_channels: int = 128, use_atom_edge_embedding: bool = True, share_atom_edge_embedding: bool = False, use_m_share_rad: bool = False, distance_function: str = 'gaussian', num_distance_basis: int = 512, attn_activation: str = 'scaled_silu', use_s2_act_attn: bool = False, use_attn_renorm: bool = True, ffn_activation: str = 'scaled_silu', use_gate_act: bool = False, use_grid_mlp: bool = False, use_sep_s2_act: bool = True, alpha_drop: float = 0.1, drop_path_rate: float = 0.05, proj_drop: float = 0.0, weight_init: str = 'normal', enforce_max_neighbors_strictly: bool = True, avg_num_nodes: float | None = None, avg_degree: float | None = None, use_energy_lin_ref: bool | None = False, load_energy_lin_ref: bool | None = False) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Equiformer with graph attention built upon SO(2) convolution and feedforward network built upon S2 activation @@ -136,6 +136,174 @@ Package Contents :type load_energy_lin_ref: bool + .. py:attribute:: use_pbc + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: max_radius + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: num_layers + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: attn_hidden_channels + + + .. py:attribute:: num_heads + + + .. py:attribute:: attn_alpha_channels + + + .. py:attribute:: attn_value_channels + + + .. py:attribute:: ffn_hidden_channels + + + .. py:attribute:: norm_type + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: grid_resolution + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: edge_channels + + + .. py:attribute:: use_atom_edge_embedding + + + .. py:attribute:: share_atom_edge_embedding + + + .. py:attribute:: use_m_share_rad + + + .. py:attribute:: distance_function + + + .. py:attribute:: num_distance_basis + + + .. py:attribute:: attn_activation + + + .. py:attribute:: use_s2_act_attn + + + .. py:attribute:: use_attn_renorm + + + .. py:attribute:: ffn_activation + + + .. py:attribute:: use_gate_act + + + .. py:attribute:: use_grid_mlp + + + .. py:attribute:: use_sep_s2_act + + + .. py:attribute:: alpha_drop + + + .. py:attribute:: drop_path_rate + + + .. py:attribute:: proj_drop + + + .. py:attribute:: avg_num_nodes + + + .. py:attribute:: avg_degree + + + .. py:attribute:: use_energy_lin_ref + + + .. py:attribute:: load_energy_lin_ref + + + .. py:attribute:: weight_init + + + .. py:attribute:: enforce_max_neighbors_strictly + + + .. py:attribute:: device + :value: 'cpu' + + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: sphere_channels_all + :type: int + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: SO3_rotation + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: edge_degree_embedding + + + .. py:attribute:: blocks + + + .. py:attribute:: norm + + + .. py:attribute:: energy_block + + .. py:method:: _init_gp_partitions(atomic_numbers_full, data_batch_full, edge_index, edge_distance, edge_distance_vec) Graph Parallel diff --git a/_sources/autoapi/core/models/equiformer_v2/input_block/index.rst b/_sources/autoapi/core/models/equiformer_v2/input_block/index.rst index aa8095446a..298aedd80b 100644 --- a/_sources/autoapi/core/models/equiformer_v2/input_block/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/input_block/index.rst @@ -37,6 +37,47 @@ Module Contents :type rescale_factor: float + .. py:attribute:: sphere_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: SO3_rotation + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: m_0_num_coefficients + :type: int + + + .. py:attribute:: m_all_num_coefficents + :type: int + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: use_atom_edge_embedding + + + .. py:attribute:: rad_func + + + .. py:attribute:: rescale_factor + + .. py:method:: forward(atomic_numbers, edge_distance, edge_index, num_nodes, node_offset=0) diff --git a/_sources/autoapi/core/models/equiformer_v2/layer_norm/index.rst b/_sources/autoapi/core/models/equiformer_v2/layer_norm/index.rst index 9230d3109b..f0c2a24a50 100644 --- a/_sources/autoapi/core/models/equiformer_v2/layer_norm/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/layer_norm/index.rst @@ -78,6 +78,21 @@ Module Contents :vartype training: bool + .. py:attribute:: lmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: eps + + + .. py:attribute:: affine + + + .. py:attribute:: normalization + + .. py:method:: __repr__() -> str Return repr(self). @@ -100,6 +115,27 @@ Module Contents 3. Do not normalize separately for different L (L > 0). + .. py:attribute:: lmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: eps + + + .. py:attribute:: affine + + + .. py:attribute:: std_balance_degrees + + + .. py:attribute:: norm_l0 + + + .. py:attribute:: normalization + + .. py:method:: __repr__() -> str Return repr(self). @@ -120,6 +156,21 @@ Module Contents 1. Normalize across all m components from degrees L >= 0. + .. py:attribute:: lmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: eps + + + .. py:attribute:: affine + + + .. py:attribute:: normalization + + .. py:method:: __repr__() -> str Return repr(self). @@ -141,6 +192,30 @@ Module Contents 2. Expand weights and multiply with normalized feature to prevent slicing and concatenation. + .. py:attribute:: lmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: eps + + + .. py:attribute:: affine + + + .. py:attribute:: centering + + + .. py:attribute:: std_balance_degrees + + + .. py:attribute:: normalization + + + .. py:attribute:: expand_index + + .. py:method:: __repr__() -> str Return repr(self). @@ -162,6 +237,21 @@ Module Contents 2. For degree L > 0, we scale down the square root of 2 * L, which is to emulate halving the number of channels when using higher L. + .. py:attribute:: lmax + + + .. py:attribute:: num_channels + + + .. py:attribute:: scale_factor + + + .. py:attribute:: affine_weight + + + .. py:attribute:: expand_index + + .. py:method:: __repr__() -> str Return repr(self). diff --git a/_sources/autoapi/core/models/equiformer_v2/module_list/index.rst b/_sources/autoapi/core/models/equiformer_v2/module_list/index.rst index 1b0d616727..b70be5dc7f 100644 --- a/_sources/autoapi/core/models/equiformer_v2/module_list/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/module_list/index.rst @@ -43,6 +43,9 @@ Module Contents return x + .. py:attribute:: info_str + + .. py:method:: __repr__() -> str Return a custom repr for ModuleList that compresses repeated module representations. diff --git a/_sources/autoapi/core/models/equiformer_v2/radial_function/index.rst b/_sources/autoapi/core/models/equiformer_v2/radial_function/index.rst index 53ef0e49f3..3e7f63a38c 100644 --- a/_sources/autoapi/core/models/equiformer_v2/radial_function/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/radial_function/index.rst @@ -23,6 +23,17 @@ Module Contents Contruct a radial function (linear layers + layer normalization + SiLU) given a list of channels + .. py:attribute:: modules + :value: [] + + + + .. py:attribute:: input_channels + + + .. py:attribute:: net + + .. py:method:: forward(inputs) diff --git a/_sources/autoapi/core/models/equiformer_v2/so2_ops/index.rst b/_sources/autoapi/core/models/equiformer_v2/so2_ops/index.rst index 9d33988bc3..743a7c13ef 100644 --- a/_sources/autoapi/core/models/equiformer_v2/so2_ops/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/so2_ops/index.rst @@ -34,6 +34,33 @@ Module Contents :param mmax_list (list: int): List of orders (m) for each resolution + .. py:attribute:: m + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: m_output_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: num_channels + :value: 0 + + + + .. py:attribute:: fc + + .. py:method:: forward(x_m) @@ -59,6 +86,57 @@ Module Contents :type extra_m0_output_channels: int + .. py:attribute:: sphere_channels + + + .. py:attribute:: m_output_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: internal_weights + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: extra_m0_output_channels + + + .. py:attribute:: num_channels_rad + :value: 0 + + + + .. py:attribute:: num_channels_m0 + :value: 0 + + + + .. py:attribute:: m0_output_channels + + + .. py:attribute:: fc_m0 + + + .. py:attribute:: so2_m_conv + + + .. py:attribute:: rad_func + :value: None + + + .. py:method:: forward(x, x_edge) @@ -82,6 +160,51 @@ Module Contents :param edge_channels_list (list: int): List of sizes of invariant edge embedding. For example, [input_channels, hidden_channels, hidden_channels]. + .. py:attribute:: sphere_channels + + + .. py:attribute:: m_output_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: internal_weights + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: num_channels_rad + :value: 0 + + + + .. py:attribute:: num_channels_m0 + :value: 0 + + + + .. py:attribute:: fc_m0 + + + .. py:attribute:: so2_m_fc + + + .. py:attribute:: rad_func + :value: None + + + .. py:method:: forward(x, x_edge) diff --git a/_sources/autoapi/core/models/equiformer_v2/so3/index.rst b/_sources/autoapi/core/models/equiformer_v2/so3/index.rst index 5d10923e93..8e628b2d13 100644 --- a/_sources/autoapi/core/models/equiformer_v2/so3/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/so3/index.rst @@ -46,6 +46,56 @@ Module Contents :param mmax_list (list: int): List of maximum order of the spherical harmonics + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: device + :value: 'cpu' + + + + .. py:attribute:: l_harmonic + + + .. py:attribute:: m_harmonic + + + .. py:attribute:: m_complex + + + .. py:attribute:: res_size + + + .. py:attribute:: offset + :value: 0 + + + + .. py:attribute:: num_coefficients + + + .. py:attribute:: to_m + + + .. py:attribute:: m_size + + + .. py:attribute:: mask_indices_cache + :value: None + + + + .. py:attribute:: rotate_inv_rescale_cache + :value: None + + + .. py:method:: complex_idx(m: int, lmax: int, m_complex, l_harmonic) Add `m_complex` and `l_harmonic` to the input arguments @@ -78,6 +128,26 @@ Module Contents :param dtype: type of the output tensors + .. py:attribute:: num_channels + + + .. py:attribute:: device + + + .. py:attribute:: dtype + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: num_coefficients + :value: 0 + + + + .. py:attribute:: embedding + + .. py:method:: clone() -> SO3_Embedding @@ -127,6 +197,12 @@ Module Contents :param lmax_list (list: int): List of maximum degree of the spherical harmonics + .. py:attribute:: lmax + + + .. py:attribute:: mapping + + .. py:method:: set_wigner(rot_mat3x3) @@ -152,16 +228,39 @@ Module Contents :type mmax: int - .. py:method:: get_to_grid_mat(device) + .. py:attribute:: lmax - .. py:method:: get_from_grid_mat(device) + .. py:attribute:: mmax + + + .. py:attribute:: lat_resolution + + + .. py:attribute:: mapping + + + .. py:attribute:: device + :value: 'cpu' - .. py:method:: to_grid(embedding, lmax: int, mmax: int) + .. py:attribute:: to_grid - .. py:method:: from_grid(grid, lmax: int, mmax: int) + + .. py:attribute:: to_grid_mat + + + .. py:attribute:: from_grid + + + .. py:attribute:: from_grid_mat + + + .. py:method:: get_to_grid_mat(device) + + + .. py:method:: get_from_grid_mat(device) .. py:class:: SO3_Linear(in_features: int, out_features: int, lmax: int, bias: bool = True) @@ -201,6 +300,18 @@ Module Contents :vartype training: bool + .. py:attribute:: in_features + + + .. py:attribute:: out_features + + + .. py:attribute:: lmax + + + .. py:attribute:: linear_list + + .. py:method:: forward(input_embedding, output_scale=None) @@ -247,6 +358,27 @@ Module Contents :vartype training: bool + .. py:attribute:: in_features + + + .. py:attribute:: out_features + + + .. py:attribute:: lmax + + + .. py:attribute:: weight + + + .. py:attribute:: bound + + + .. py:attribute:: bias + + + .. py:attribute:: expand_index + + .. py:method:: forward(input_embedding) diff --git a/_sources/autoapi/core/models/equiformer_v2/trainers/lr_scheduler/index.rst b/_sources/autoapi/core/models/equiformer_v2/trainers/lr_scheduler/index.rst index 5c8c83e910..52931c6966 100644 --- a/_sources/autoapi/core/models/equiformer_v2/trainers/lr_scheduler/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/trainers/lr_scheduler/index.rst @@ -33,6 +33,18 @@ Module Contents .. py:class:: CosineLRLambda(scheduler_params) + .. py:attribute:: warmup_epochs + + + .. py:attribute:: lr_warmup_factor + + + .. py:attribute:: max_epochs + + + .. py:attribute:: lr_min_factor + + .. py:method:: __call__(current_step: int) @@ -40,6 +52,18 @@ Module Contents .. py:class:: MultistepLRLambda(scheduler_params) + .. py:attribute:: warmup_epochs + + + .. py:attribute:: lr_warmup_factor + + + .. py:attribute:: lr_decay_epochs + + + .. py:attribute:: lr_gamma + + .. py:method:: __call__(current_step: int) -> float @@ -76,6 +100,18 @@ Module Contents :type config: dict + .. py:attribute:: optimizer + + + .. py:attribute:: config + + + .. py:attribute:: scheduler_type + + + .. py:attribute:: scheduler_params + + .. py:method:: step(metrics=None, epoch=None) diff --git a/_sources/autoapi/core/models/equiformer_v2/transformer_block/index.rst b/_sources/autoapi/core/models/equiformer_v2/transformer_block/index.rst index f76a094c8d..8ea081b698 100644 --- a/_sources/autoapi/core/models/equiformer_v2/transformer_block/index.rst +++ b/_sources/autoapi/core/models/equiformer_v2/transformer_block/index.rst @@ -67,6 +67,85 @@ Module Contents :type alpha_drop: float + .. py:attribute:: sphere_channels + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_heads + + + .. py:attribute:: attn_alpha_channels + + + .. py:attribute:: attn_value_channels + + + .. py:attribute:: output_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: SO3_rotation + + + .. py:attribute:: mappingReduced + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: edge_channels_list + + + .. py:attribute:: use_atom_edge_embedding + + + .. py:attribute:: use_m_share_rad + + + .. py:attribute:: use_s2_act_attn + + + .. py:attribute:: use_attn_renorm + + + .. py:attribute:: use_gate_act + + + .. py:attribute:: use_sep_s2_act + + + .. py:attribute:: extra_m0_output_channels + :value: None + + + + .. py:attribute:: so2_conv_1 + + + .. py:attribute:: alpha_dropout + :value: None + + + + .. py:attribute:: so2_conv_2 + + + .. py:attribute:: proj + + .. py:method:: forward(x: torch.Tensor, atomic_numbers, edge_distance: torch.Tensor, edge_index, node_offset: int = 0) @@ -97,6 +176,48 @@ Module Contents :type use_sep_s2_act: bool + .. py:attribute:: sphere_channels + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: output_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: sphere_channels_all + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: use_gate_act + + + .. py:attribute:: use_grid_mlp + + + .. py:attribute:: use_sep_s2_act + + + .. py:attribute:: max_lmax + + + .. py:attribute:: so3_linear_1 + + + .. py:attribute:: so3_linear_2 + + .. py:method:: forward(input_embedding) @@ -158,6 +279,27 @@ Module Contents :type proj_drop: float + .. py:attribute:: max_lmax + + + .. py:attribute:: norm_1 + + + .. py:attribute:: ga + + + .. py:attribute:: drop_path + + + .. py:attribute:: proj_drop + + + .. py:attribute:: norm_2 + + + .. py:attribute:: ffn + + .. py:method:: forward(x, atomic_numbers, edge_distance, edge_index, batch, node_offset: int = 0) diff --git a/_sources/autoapi/core/models/escn/escn/index.rst b/_sources/autoapi/core/models/escn/escn/index.rst index 802e5d2138..136fcbc303 100644 --- a/_sources/autoapi/core/models/escn/escn/index.rst +++ b/_sources/autoapi/core/models/escn/escn/index.rst @@ -18,6 +18,9 @@ Classes .. autoapisummary:: core.models.escn.escn.eSCN + core.models.escn.escn.eSCNBackbone + core.models.escn.escn.eSCNEnergyHead + core.models.escn.escn.eSCNForceHead core.models.escn.escn.LayerBlock core.models.escn.escn.MessageBlock core.models.escn.escn.SO2Block @@ -30,9 +33,9 @@ Classes Module Contents --------------- -.. py:class:: eSCN(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_neighbors: int = 40, cutoff: float = 8.0, max_num_elements: int = 90, num_layers: int = 8, lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, sphere_channels: int = 128, hidden_channels: int = 256, edge_channels: int = 128, use_grid: bool = True, num_sphere_samples: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False) +.. py:class:: eSCN(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_neighbors: int = 40, cutoff: float = 8.0, max_num_elements: int = 90, num_layers: int = 8, lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, sphere_channels: int = 128, hidden_channels: int = 256, edge_channels: int = 128, num_sphere_samples: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Equivariant Spherical Channel Network @@ -75,6 +78,107 @@ Module Contents :type show_timing_info: bool + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: show_timing_info + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_layers + + + .. py:attribute:: num_atoms + :value: 0 + + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: edge_channels + + + .. py:attribute:: distance_resolution + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: sphere_channels_all + :type: int + + + .. py:attribute:: basis_width_scalar + + + .. py:attribute:: distance_function + + + .. py:attribute:: counter + :value: 0 + + + + .. py:attribute:: act + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: num_gaussians + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: layer_blocks + + + .. py:attribute:: energy_block + + + .. py:attribute:: sphere_points + + + .. py:attribute:: sphharm_weights + :type: list[torch.nn.Parameter] + :value: [] + + + .. py:method:: forward(data) @@ -86,6 +190,171 @@ Module Contents +.. py:class:: eSCNBackbone(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_neighbors: int = 40, cutoff: float = 8.0, max_num_elements: int = 90, num_layers: int = 8, lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, sphere_channels: int = 128, hidden_channels: int = 256, edge_channels: int = 128, num_sphere_samples: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False) + + Bases: :py:obj:`eSCN`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + Equivariant Spherical Channel Network + Paper: Reducing SO(3) Convolutions to SO(2) for Efficient Equivariant GNNs + + + :param use_pbc: Use periodic boundary conditions + :type use_pbc: bool + :param regress_forces: Compute forces + :type regress_forces: bool + :param otf_graph: Compute graph On The Fly (OTF) + :type otf_graph: bool + :param max_neighbors: Maximum number of neighbors per atom + :type max_neighbors: int + :param cutoff: Maximum distance between nieghboring atoms in Angstroms + :type cutoff: float + :param max_num_elements: Maximum atomic number + :type max_num_elements: int + :param num_layers: Number of layers in the GNN + :type num_layers: int + :param lmax_list: List of maximum degree of the spherical harmonics (1 to 10) + :type lmax_list: int + :param mmax_list: List of maximum order of the spherical harmonics (0 to lmax) + :type mmax_list: int + :param sphere_channels: Number of spherical channels (one set per resolution) + :type sphere_channels: int + :param hidden_channels: Number of hidden units in message passing + :type hidden_channels: int + :param num_sphere_samples: Number of samples used to approximate the integration of the sphere in the output blocks + :type num_sphere_samples: int + :param edge_channels: Number of channels for the edge invariant features + :type edge_channels: int + :param distance_function: Basis function used for distances + :type distance_function: "gaussian", "sigmoid", "linearsigmoid", "silu" + :param basis_width_scalar: Width of distance basis function + :type basis_width_scalar: float + :param distance_resolution: Distance between distance basis functions in Angstroms + :type distance_resolution: float + :param show_timing_info: Show timing and memory info + :type show_timing_info: bool + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch) -> dict[str, torch.Tensor] + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: eSCNEnergyHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: energy_block + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: eSCNForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: force_block + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + .. py:class:: LayerBlock(layer_idx: int, sphere_channels: int, hidden_channels: int, edge_channels: int, lmax_list: list[int], mmax_list: list[int], distance_expansion, max_num_elements: int, SO3_grid: fairchem.core.models.escn.so3.SO3_Grid, act) Bases: :py:obj:`torch.nn.Module` @@ -113,6 +382,42 @@ Module Contents :type act: function + .. py:attribute:: layer_idx + + + .. py:attribute:: act + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: sphere_channels_all + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: message_block + + + .. py:attribute:: fc1_sphere + + + .. py:attribute:: fc2_sphere + + + .. py:attribute:: fc3_sphere + + .. py:method:: forward(x, atomic_numbers, edge_distance, edge_index, SO3_edge_rot, mappingReduced) @@ -143,6 +448,42 @@ Module Contents :type act: function + .. py:attribute:: layer_idx + + + .. py:attribute:: act + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: edge_channels + + + .. py:attribute:: edge_block + + + .. py:attribute:: so2_block_source + + + .. py:attribute:: so2_block_target + + .. py:method:: forward(x, atomic_numbers, edge_distance, edge_index, SO3_edge_rot, mappingReduced) @@ -165,6 +506,42 @@ Module Contents :type act: function + .. py:attribute:: sphere_channels + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: act + + + .. py:attribute:: num_channels_m0 + :value: 0 + + + + .. py:attribute:: fc1_dist0 + + + .. py:attribute:: fc1_m0 + + + .. py:attribute:: fc2_m0 + + + .. py:attribute:: so2_conv + + .. py:method:: forward(x, x_edge, mappingReduced) @@ -189,6 +566,48 @@ Module Contents :type act: function + .. py:attribute:: hidden_channels + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: m + + + .. py:attribute:: act + + + .. py:attribute:: num_channels + :value: 0 + + + + .. py:attribute:: fc1_dist + + + .. py:attribute:: fc1_r + + + .. py:attribute:: fc2_r + + + .. py:attribute:: fc1_i + + + .. py:attribute:: fc2_i + + .. py:method:: forward(x_m, x_edge) -> torch.Tensor @@ -209,6 +628,33 @@ Module Contents :type act: function + .. py:attribute:: in_channels + + + .. py:attribute:: distance_expansion + + + .. py:attribute:: act + + + .. py:attribute:: edge_channels + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: fc1_dist + + + .. py:attribute:: source_embedding + + + .. py:attribute:: target_embedding + + + .. py:attribute:: fc1_edge_attr + + .. py:method:: forward(edge_distance, source_element, target_element) @@ -227,6 +673,24 @@ Module Contents :type act: function + .. py:attribute:: num_channels + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: act + + + .. py:attribute:: fc1 + + + .. py:attribute:: fc2 + + + .. py:attribute:: fc3 + + .. py:method:: forward(x_pt) -> torch.Tensor @@ -245,6 +709,24 @@ Module Contents :type act: function + .. py:attribute:: num_channels + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: act + + + .. py:attribute:: fc1 + + + .. py:attribute:: fc2 + + + .. py:attribute:: fc3 + + .. py:method:: forward(x_pt, sphere_points) -> torch.Tensor diff --git a/_sources/autoapi/core/models/escn/index.rst b/_sources/autoapi/core/models/escn/index.rst index 8e4f0f2b39..875e7791f3 100644 --- a/_sources/autoapi/core/models/escn/index.rst +++ b/_sources/autoapi/core/models/escn/index.rst @@ -25,9 +25,9 @@ Classes Package Contents ---------------- -.. py:class:: eSCN(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_neighbors: int = 40, cutoff: float = 8.0, max_num_elements: int = 90, num_layers: int = 8, lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, sphere_channels: int = 128, hidden_channels: int = 256, edge_channels: int = 128, use_grid: bool = True, num_sphere_samples: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False) +.. py:class:: eSCN(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_neighbors: int = 40, cutoff: float = 8.0, max_num_elements: int = 90, num_layers: int = 8, lmax_list: list[int] | None = None, mmax_list: list[int] | None = None, sphere_channels: int = 128, hidden_channels: int = 256, edge_channels: int = 128, num_sphere_samples: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Equivariant Spherical Channel Network @@ -70,6 +70,107 @@ Package Contents :type show_timing_info: bool + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: show_timing_info + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_layers + + + .. py:attribute:: num_atoms + :value: 0 + + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: edge_channels + + + .. py:attribute:: distance_resolution + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + :type: int + + + .. py:attribute:: sphere_channels_all + :type: int + + + .. py:attribute:: basis_width_scalar + + + .. py:attribute:: distance_function + + + .. py:attribute:: counter + :value: 0 + + + + .. py:attribute:: act + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: num_gaussians + + + .. py:attribute:: SO3_grid + + + .. py:attribute:: layer_blocks + + + .. py:attribute:: energy_block + + + .. py:attribute:: sphere_points + + + .. py:attribute:: sphharm_weights + :type: list[torch.nn.Parameter] + :value: [] + + + .. py:method:: forward(data) diff --git a/_sources/autoapi/core/models/escn/so3/index.rst b/_sources/autoapi/core/models/escn/so3/index.rst index 93b0061de9..1e85e54c06 100644 --- a/_sources/autoapi/core/models/escn/so3/index.rst +++ b/_sources/autoapi/core/models/escn/so3/index.rst @@ -45,6 +45,44 @@ Module Contents :param device: Device of the output + .. py:attribute:: lmax_list + + + .. py:attribute:: mmax_list + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: device + + + .. py:attribute:: l_harmonic + + + .. py:attribute:: m_harmonic + + + .. py:attribute:: m_complex + + + .. py:attribute:: res_size + + + .. py:attribute:: offset + :value: 0 + + + + .. py:attribute:: num_coefficients + + + .. py:attribute:: to_m + + + .. py:attribute:: m_size + + .. py:method:: complex_idx(m, lmax: int = -1) @@ -67,6 +105,26 @@ Module Contents :param dtype: type of the output tensors + .. py:attribute:: num_channels + + + .. py:attribute:: device + + + .. py:attribute:: dtype + + + .. py:attribute:: num_resolutions + + + .. py:attribute:: num_coefficients + :value: 0 + + + + .. py:attribute:: embedding + + .. py:method:: clone() -> SO3_Embedding @@ -118,6 +176,18 @@ Module Contents :param lmax_list (list: int): List of maximum degree of the spherical harmonics + .. py:attribute:: device + + + .. py:attribute:: dtype + + + .. py:attribute:: wigner + + + .. py:attribute:: wigner_inv + + .. py:method:: set_lmax(lmax) -> None @@ -149,6 +219,20 @@ Module Contents :type mmax: int + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: lat_resolution + + + .. py:attribute:: initialized + :value: False + + + .. py:method:: _initialize(device: torch.device) -> None diff --git a/_sources/autoapi/core/models/gemnet/gemnet/index.rst b/_sources/autoapi/core/models/gemnet/gemnet/index.rst index 7355afe78e..f09b49d192 100644 --- a/_sources/autoapi/core/models/gemnet/gemnet/index.rst +++ b/_sources/autoapi/core/models/gemnet/gemnet/index.rst @@ -18,24 +18,21 @@ Classes .. autoapisummary:: core.models.gemnet.gemnet.GemNetT + core.models.gemnet.gemnet.GemNetTBackbone + core.models.gemnet.gemnet.GemNetTEnergyAndGradForceHead + core.models.gemnet.gemnet.GemNetTForceHead Module Contents --------------- -.. py:class:: GemNetT(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', num_elements: int = 83, scale_file: str | None = None) +.. py:class:: GemNetT(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', num_elements: int = 83, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` GemNet-T, triplets-only variant of GemNet - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -85,6 +82,73 @@ Module Contents :type scale_file: str + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: radial_basis + + + .. py:attribute:: radial_basis_cbf3 + + + .. py:attribute:: cbf_basis3 + + + .. py:attribute:: mlp_rbf3 + + + .. py:attribute:: mlp_cbf3 + + + .. py:attribute:: mlp_rbf_h + + + .. py:attribute:: mlp_rbf_out + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: interaction_block + + + .. py:attribute:: shared_parameters + + .. py:method:: get_triplets(edge_index, num_atoms) Get all b->a for each edge c->a. @@ -125,3 +189,185 @@ Module Contents .. py:property:: num_params +.. py:class:: GemNetTBackbone(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', num_elements: int = 83, scale_file: str | None = None) + + Bases: :py:obj:`GemNetT`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + GemNet-T, triplets-only variant of GemNet + + :param num_spherical: Controls maximum frequency. + :type num_spherical: int + :param num_radial: Controls maximum frequency. + :type num_radial: int + :param num_blocks: Number of building blocks to be stacked. + :type num_blocks: int + :param emb_size_atom: Embedding size of the atoms. + :type emb_size_atom: int + :param emb_size_edge: Embedding size of the edges. + :type emb_size_edge: int + :param emb_size_trip: (Down-projected) Embedding size in the triplet message passing block. + :type emb_size_trip: int + :param emb_size_rbf: Embedding size of the radial basis transformation. + :type emb_size_rbf: int + :param emb_size_cbf: Embedding size of the circular basis transformation (one angle). + :type emb_size_cbf: int + :param emb_size_bil_trip: Embedding size of the edge embeddings in the triplet-based message passing block after the bilinear layer. + :type emb_size_bil_trip: int + :param num_before_skip: Number of residual blocks before the first skip connection. + :type num_before_skip: int + :param num_after_skip: Number of residual blocks after the first skip connection. + :type num_after_skip: int + :param num_concat: Number of residual blocks after the concatenation. + :type num_concat: int + :param num_atom: Number of residual blocks in the atom embedding blocks. + :type num_atom: int + :param regress_forces: Whether to predict forces. Default: True + :type regress_forces: bool + :param direct_forces: If True predict forces based on aggregation of interatomic directions. + If False predict forces based on negative gradient of energy potential. + :type direct_forces: bool + :param cutoff: Embedding cutoff for interactomic directions in Angstrom. + :type cutoff: float + :param rbf: Name and hyperparameters of the radial basis function. + :type rbf: dict + :param envelope: Name and hyperparameters of the envelope function. + :type envelope: dict + :param cbf: Name and hyperparameters of the cosine basis function. + :type cbf: dict + :param extensive: Whether the output should be extensive (proportional to the number of atoms) + :type extensive: bool + :param output_init: Initialization method for the final dense layer. + :type output_init: str + :param activation: Name of the activation function. + :type activation: str + :param scale_file: Path to the json file containing the scaling factors. + :type scale_file: str + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch) -> dict[str, torch.Tensor] + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: GemNetTEnergyAndGradForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: extensive + + + .. py:attribute:: regress_forces + + + .. py:attribute:: direct_forces + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: GemNetTForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: direct_forces + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + diff --git a/_sources/autoapi/core/models/gemnet/index.rst b/_sources/autoapi/core/models/gemnet/index.rst index fcb24cb973..70cbf598b7 100644 --- a/_sources/autoapi/core/models/gemnet/index.rst +++ b/_sources/autoapi/core/models/gemnet/index.rst @@ -35,19 +35,13 @@ Classes Package Contents ---------------- -.. py:class:: GemNetT(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', num_elements: int = 83, scale_file: str | None = None) +.. py:class:: GemNetT(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', num_elements: int = 83, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` GemNet-T, triplets-only variant of GemNet - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -97,6 +91,73 @@ Package Contents :type scale_file: str + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: radial_basis + + + .. py:attribute:: radial_basis_cbf3 + + + .. py:attribute:: cbf_basis3 + + + .. py:attribute:: mlp_rbf3 + + + .. py:attribute:: mlp_cbf3 + + + .. py:attribute:: mlp_rbf_h + + + .. py:attribute:: mlp_rbf_out + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: interaction_block + + + .. py:attribute:: shared_parameters + + .. py:method:: get_triplets(edge_index, num_atoms) Get all b->a for each edge c->a. diff --git a/_sources/autoapi/core/models/gemnet/layers/atom_update_block/index.rst b/_sources/autoapi/core/models/gemnet/layers/atom_update_block/index.rst index 98951275e7..492a56d522 100644 --- a/_sources/autoapi/core/models/gemnet/layers/atom_update_block/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/atom_update_block/index.rst @@ -41,6 +41,18 @@ Module Contents :type activation: callable/str + .. py:attribute:: name + + + .. py:attribute:: dense_rbf + + + .. py:attribute:: scale_sum + + + .. py:attribute:: layers + + .. py:method:: get_mlp(units_in, units, nHidden, activation) @@ -74,6 +86,18 @@ Module Contents :type output_init: int + .. py:attribute:: output_init + + + .. py:attribute:: direct_forces + + + .. py:attribute:: seq_energy + + + .. py:attribute:: out_energy + + .. py:method:: reset_parameters() -> None diff --git a/_sources/autoapi/core/models/gemnet/layers/base_layers/index.rst b/_sources/autoapi/core/models/gemnet/layers/base_layers/index.rst index 6ecb05b7d8..0def6a7e74 100644 --- a/_sources/autoapi/core/models/gemnet/layers/base_layers/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/base_layers/index.rst @@ -41,6 +41,9 @@ Module Contents :type bias: bool + .. py:attribute:: linear + + .. py:method:: reset_parameters(initializer=he_orthogonal_init) -> None @@ -84,6 +87,12 @@ Module Contents :vartype training: bool + .. py:attribute:: scale_factor + + + .. py:attribute:: _activation + + .. py:method:: forward(x) @@ -124,6 +133,9 @@ Module Contents :vartype training: bool + .. py:attribute:: _activation + + .. py:method:: forward(x) @@ -142,6 +154,12 @@ Module Contents :type layer_kwargs: str + .. py:attribute:: dense_mlp + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(input) diff --git a/_sources/autoapi/core/models/gemnet/layers/efficient/index.rst b/_sources/autoapi/core/models/gemnet/layers/efficient/index.rst index c35b1bdfe3..3beaad0f4e 100644 --- a/_sources/autoapi/core/models/gemnet/layers/efficient/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/efficient/index.rst @@ -37,6 +37,15 @@ Module Contents :type kernel_initializer: callable + .. py:attribute:: num_spherical + + + .. py:attribute:: num_radial + + + .. py:attribute:: emb_size_interm + + .. py:method:: reset_parameters() -> None @@ -67,6 +76,15 @@ Module Contents :type kernel_initializer: callable + .. py:attribute:: emb_size + + + .. py:attribute:: emb_size_interm + + + .. py:attribute:: units_out + + .. py:method:: reset_parameters() -> None diff --git a/_sources/autoapi/core/models/gemnet/layers/embedding_block/index.rst b/_sources/autoapi/core/models/gemnet/layers/embedding_block/index.rst index 46249b993d..f5a3f2ade9 100644 --- a/_sources/autoapi/core/models/gemnet/layers/embedding_block/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/embedding_block/index.rst @@ -35,6 +35,12 @@ Module Contents :type emb_size: int + .. py:attribute:: emb_size + + + .. py:attribute:: embeddings + + .. py:method:: forward(Z) :returns: **h** -- Atom embeddings. @@ -55,6 +61,12 @@ Module Contents :type activation: str + .. py:attribute:: in_features + + + .. py:attribute:: dense + + .. py:method:: forward(h, m_rbf, idx_s, idx_t) :param h: diff --git a/_sources/autoapi/core/models/gemnet/layers/interaction_block/index.rst b/_sources/autoapi/core/models/gemnet/layers/interaction_block/index.rst index e9211aad11..6f670adcf8 100644 --- a/_sources/autoapi/core/models/gemnet/layers/interaction_block/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/interaction_block/index.rst @@ -55,6 +55,36 @@ Module Contents :type activation: str + .. py:attribute:: name + + + .. py:attribute:: block_nr + + + .. py:attribute:: dense_ca + + + .. py:attribute:: trip_interaction + + + .. py:attribute:: layers_before_skip + + + .. py:attribute:: layers_after_skip + + + .. py:attribute:: atom_update + + + .. py:attribute:: concat_layer + + + .. py:attribute:: residual_m + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(h: torch.Tensor, m: torch.Tensor, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca, rbf_h, idx_s, idx_t) :returns: * **h** (*torch.Tensor, shape=(nEdges, emb_size_atom)*) -- Atom embeddings. @@ -83,6 +113,36 @@ Module Contents :type activation: str + .. py:attribute:: name + + + .. py:attribute:: dense_ba + + + .. py:attribute:: mlp_rbf + + + .. py:attribute:: scale_rbf + + + .. py:attribute:: mlp_cbf + + + .. py:attribute:: scale_cbf_sum + + + .. py:attribute:: down_projection + + + .. py:attribute:: up_projection_ca + + + .. py:attribute:: up_projection_ac + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(m: torch.Tensor, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca) :returns: **m** -- Edge embeddings (c->a). diff --git a/_sources/autoapi/core/models/gemnet/layers/radial_basis/index.rst b/_sources/autoapi/core/models/gemnet/layers/radial_basis/index.rst index d48c0d4c0e..682482ba57 100644 --- a/_sources/autoapi/core/models/gemnet/layers/radial_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/radial_basis/index.rst @@ -38,6 +38,22 @@ Module Contents :type exponent: int + .. py:attribute:: p + :type: float + + + .. py:attribute:: a + :type: float + + + .. py:attribute:: b + :type: float + + + .. py:attribute:: c + :type: float + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -68,6 +84,12 @@ Module Contents :type cutoff: float + .. py:attribute:: norm_const + + + .. py:attribute:: frequencies + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -89,6 +111,21 @@ Module Contents :type pregamma_initial: float + .. py:attribute:: prefactor + + + .. py:attribute:: pregamma + + + .. py:attribute:: softplus + + + .. py:attribute:: exp1 + + + .. py:attribute:: exp2 + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -107,6 +144,25 @@ Module Contents :type envelope: dict = {"name": "polynomial", "exponent": 5} + .. py:attribute:: inv_cutoff + + + .. py:attribute:: env_name + + + .. py:attribute:: env_hparams + + + .. py:attribute:: envelope + :type: PolynomialEnvelope | ExponentialEnvelope + + + .. py:attribute:: rbf_name + + + .. py:attribute:: rbf_hparams + + .. py:method:: forward(d) diff --git a/_sources/autoapi/core/models/gemnet/layers/spherical_basis/index.rst b/_sources/autoapi/core/models/gemnet/layers/spherical_basis/index.rst index b842cdbb43..8b122ad337 100644 --- a/_sources/autoapi/core/models/gemnet/layers/spherical_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet/layers/spherical_basis/index.rst @@ -40,6 +40,18 @@ Module Contents :type efficient: bool + .. py:attribute:: radial_basis + + + .. py:attribute:: efficient + + + .. py:attribute:: cbf_name + + + .. py:attribute:: cbf_hparams + + .. py:method:: forward(D_ca, cosφ_cab, id3_ca) diff --git a/_sources/autoapi/core/models/gemnet_gp/gemnet/index.rst b/_sources/autoapi/core/models/gemnet_gp/gemnet/index.rst index f994d52864..bfe2f7cca2 100644 --- a/_sources/autoapi/core/models/gemnet_gp/gemnet/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/gemnet/index.rst @@ -23,19 +23,13 @@ Classes Module Contents --------------- -.. py:class:: GraphParallelGemNetT(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', scale_num_blocks: bool = False, scatter_atoms: bool = True, scale_file: str | None = None) +.. py:class:: GraphParallelGemNetT(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', scale_num_blocks: bool = False, scatter_atoms: bool = True, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` GemNet-T, triplets-only variant of GemNet - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -85,6 +79,76 @@ Module Contents :type scale_file: str + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: scale_num_blocks + + + .. py:attribute:: scatter_atoms + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: radial_basis + + + .. py:attribute:: radial_basis_cbf3 + + + .. py:attribute:: cbf_basis3 + + + .. py:attribute:: mlp_rbf3 + + + .. py:attribute:: mlp_cbf3 + + + .. py:attribute:: mlp_rbf_h + + + .. py:attribute:: mlp_rbf_out + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: interaction_block + + .. py:method:: get_triplets(edge_index, num_atoms) Get all b->a for each edge c->a. diff --git a/_sources/autoapi/core/models/gemnet_gp/index.rst b/_sources/autoapi/core/models/gemnet_gp/index.rst index b41eb5aac4..e5378365f8 100644 --- a/_sources/autoapi/core/models/gemnet_gp/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/index.rst @@ -35,19 +35,13 @@ Classes Package Contents ---------------- -.. py:class:: GraphParallelGemNetT(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', scale_num_blocks: bool = False, scatter_atoms: bool = True, scale_file: str | None = None) +.. py:class:: GraphParallelGemNetT(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_bil_trip: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, regress_forces: bool = True, direct_forces: bool = False, cutoff: float = 6.0, max_neighbors: int = 50, rbf: dict | None = None, envelope: dict | None = None, cbf: dict | None = None, extensive: bool = True, otf_graph: bool = False, use_pbc: bool = True, output_init: str = 'HeOrthogonal', activation: str = 'swish', scale_num_blocks: bool = False, scatter_atoms: bool = True, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` GemNet-T, triplets-only variant of GemNet - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -97,6 +91,76 @@ Package Contents :type scale_file: str + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: scale_num_blocks + + + .. py:attribute:: scatter_atoms + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: radial_basis + + + .. py:attribute:: radial_basis_cbf3 + + + .. py:attribute:: cbf_basis3 + + + .. py:attribute:: mlp_rbf3 + + + .. py:attribute:: mlp_cbf3 + + + .. py:attribute:: mlp_rbf_h + + + .. py:attribute:: mlp_rbf_out + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: interaction_block + + .. py:method:: get_triplets(edge_index, num_atoms) Get all b->a for each edge c->a. diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/atom_update_block/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/atom_update_block/index.rst index eff4ac32bf..20f84a83dc 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/atom_update_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/atom_update_block/index.rst @@ -54,6 +54,18 @@ Module Contents :type activation: callable/str + .. py:attribute:: name + + + .. py:attribute:: dense_rbf + + + .. py:attribute:: scale_sum + + + .. py:attribute:: layers + + .. py:method:: get_mlp(units_in: int, units: int, nHidden: int, activation: str | None) @@ -99,6 +111,15 @@ Module Contents :type: core.models.gemnet_gp.layers.base_layers.Dense + .. py:attribute:: output_init + + + .. py:attribute:: direct_forces + + + .. py:attribute:: seq_energy + + .. py:method:: reset_parameters() -> None diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/base_layers/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/base_layers/index.rst index 1081496838..236fc08989 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/base_layers/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/base_layers/index.rst @@ -41,6 +41,9 @@ Module Contents :type bias: bool + .. py:attribute:: linear + + .. py:method:: reset_parameters(initializer=he_orthogonal_init) -> None @@ -84,6 +87,12 @@ Module Contents :vartype training: bool + .. py:attribute:: scale_factor + + + .. py:attribute:: _activation + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -124,6 +133,9 @@ Module Contents :vartype training: bool + .. py:attribute:: _activation + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -142,6 +154,12 @@ Module Contents :type layer_kwargs: str + .. py:attribute:: dense_mlp + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(input: torch.Tensor) -> torch.Tensor diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/efficient/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/efficient/index.rst index c4c4fc4ac0..119f962510 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/efficient/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/efficient/index.rst @@ -37,6 +37,15 @@ Module Contents :type kernel_initializer: callable + .. py:attribute:: num_spherical + + + .. py:attribute:: num_radial + + + .. py:attribute:: emb_size_interm + + .. py:method:: reset_parameters() -> None @@ -67,6 +76,15 @@ Module Contents :type kernel_initializer: callable + .. py:attribute:: emb_size + + + .. py:attribute:: emb_size_interm + + + .. py:attribute:: units_out + + .. py:method:: reset_parameters() -> None diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/embedding_block/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/embedding_block/index.rst index 611592f92e..639a50447f 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/embedding_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/embedding_block/index.rst @@ -35,6 +35,12 @@ Module Contents :type emb_size: int + .. py:attribute:: emb_size + + + .. py:attribute:: embeddings + + .. py:method:: forward(Z) -> torch.Tensor :returns: **h** -- Atom embeddings. @@ -55,6 +61,12 @@ Module Contents :type activation: str + .. py:attribute:: in_features + + + .. py:attribute:: dense + + .. py:method:: forward(h, m_rbf, idx_s, idx_t) -> torch.Tensor :param h: diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/interaction_block/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/interaction_block/index.rst index 3521b74f29..9158a1c8d2 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/interaction_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/interaction_block/index.rst @@ -55,6 +55,36 @@ Module Contents :type activation: str + .. py:attribute:: name + + + .. py:attribute:: block_nr + + + .. py:attribute:: dense_ca + + + .. py:attribute:: trip_interaction + + + .. py:attribute:: layers_before_skip + + + .. py:attribute:: layers_after_skip + + + .. py:attribute:: atom_update + + + .. py:attribute:: concat_layer + + + .. py:attribute:: residual_m + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(h: torch.Tensor, m: torch.Tensor, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca, rbf_h, idx_s, idx_t, edge_offset, Kmax, nAtoms) :returns: * **h** (*torch.Tensor, shape=(nEdges, emb_size_atom)*) -- Atom embeddings. @@ -86,6 +116,36 @@ Module Contents :type activation: str + .. py:attribute:: name + + + .. py:attribute:: dense_ba + + + .. py:attribute:: mlp_rbf + + + .. py:attribute:: scale_rbf + + + .. py:attribute:: mlp_cbf + + + .. py:attribute:: scale_cbf_sum + + + .. py:attribute:: down_projection + + + .. py:attribute:: up_projection_ca + + + .. py:attribute:: up_projection_ac + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(m: torch.Tensor, rbf3, cbf3, id3_ragged_idx, id_swap, id3_ba, id3_ca, edge_offset, Kmax) :returns: **m** -- Edge embeddings (c->a). diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/radial_basis/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/radial_basis/index.rst index c0b2cf841e..2df2df7d82 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/radial_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/radial_basis/index.rst @@ -38,6 +38,21 @@ Module Contents :type exponent: int + .. py:attribute:: p + + + .. py:attribute:: a + :type: float + + + .. py:attribute:: b + :type: float + + + .. py:attribute:: c + :type: float + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -68,6 +83,12 @@ Module Contents :type cutoff: float + .. py:attribute:: norm_const + + + .. py:attribute:: frequencies + + .. py:method:: forward(d_scaled) @@ -89,6 +110,21 @@ Module Contents :type pregamma_initial: float + .. py:attribute:: prefactor + + + .. py:attribute:: pregamma + + + .. py:attribute:: softplus + + + .. py:attribute:: exp1 + + + .. py:attribute:: exp2 + + .. py:method:: forward(d_scaled) -> torch.Tensor @@ -107,6 +143,21 @@ Module Contents :type envelope: dict = {"name": "polynomial", "exponent": 5} + .. py:attribute:: inv_cutoff + + + .. py:attribute:: env_name + + + .. py:attribute:: env_hparams + + + .. py:attribute:: rbf_name + + + .. py:attribute:: rbf_hparams + + .. py:method:: forward(d) diff --git a/_sources/autoapi/core/models/gemnet_gp/layers/spherical_basis/index.rst b/_sources/autoapi/core/models/gemnet_gp/layers/spherical_basis/index.rst index 6e2a117a28..a10be21bd7 100644 --- a/_sources/autoapi/core/models/gemnet_gp/layers/spherical_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet_gp/layers/spherical_basis/index.rst @@ -40,6 +40,18 @@ Module Contents :type efficient: bool + .. py:attribute:: radial_basis + + + .. py:attribute:: efficient + + + .. py:attribute:: cbf_name + + + .. py:attribute:: cbf_hparams + + .. py:method:: forward(D_ca, cosφ_cab, id3_ca) diff --git a/_sources/autoapi/core/models/gemnet_oc/gemnet_oc/index.rst b/_sources/autoapi/core/models/gemnet_oc/gemnet_oc/index.rst index ba03b6997f..a3fedc041c 100644 --- a/_sources/autoapi/core/models/gemnet_oc/gemnet_oc/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/gemnet_oc/index.rst @@ -17,22 +17,19 @@ Classes .. autoapisummary:: core.models.gemnet_oc.gemnet_oc.GemNetOC + core.models.gemnet_oc.gemnet_oc.GemNetOCBackbone + core.models.gemnet_oc.gemnet_oc.GemNetOCEnergyAndGradForceHead + core.models.gemnet_oc.gemnet_oc.GemNetOCForceHead Module Contents --------------- -.. py:class:: GemNetOC(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip_in: int, emb_size_trip_out: int, emb_size_quad_in: int, emb_size_quad_out: int, emb_size_aint_in: int, emb_size_aint_out: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_sbf: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, num_output_afteratom: int, num_atom_emb_layers: int = 0, num_global_out_layers: int = 2, regress_forces: bool = True, direct_forces: bool = False, use_pbc: bool = True, scale_backprop_forces: bool = False, cutoff: float = 6.0, cutoff_qint: float | None = None, cutoff_aeaint: float | None = None, cutoff_aint: float | None = None, max_neighbors: int = 50, max_neighbors_qint: int | None = None, max_neighbors_aeaint: int | None = None, max_neighbors_aint: int | None = None, enforce_max_neighbors_strictly: bool = True, rbf: dict[str, str] | None = None, rbf_spherical: dict | None = None, envelope: dict[str, str | int] | None = None, cbf: dict[str, str] | None = None, sbf: dict[str, str] | None = None, extensive: bool = True, forces_coupled: bool = False, output_init: str = 'HeOrthogonal', activation: str = 'silu', quad_interaction: bool = False, atom_edge_interaction: bool = False, edge_atom_interaction: bool = False, atom_interaction: bool = False, scale_basis: bool = False, qint_tags: list | None = None, num_elements: int = 83, otf_graph: bool = False, scale_file: str | None = None, **kwargs) +.. py:class:: GemNetOC(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip_in: int, emb_size_trip_out: int, emb_size_quad_in: int, emb_size_quad_out: int, emb_size_aint_in: int, emb_size_aint_out: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_sbf: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, num_output_afteratom: int, num_atom_emb_layers: int = 0, num_global_out_layers: int = 2, regress_forces: bool = True, direct_forces: bool = False, use_pbc: bool = True, scale_backprop_forces: bool = False, cutoff: float = 6.0, cutoff_qint: float | None = None, cutoff_aeaint: float | None = None, cutoff_aint: float | None = None, max_neighbors: int = 50, max_neighbors_qint: int | None = None, max_neighbors_aeaint: int | None = None, max_neighbors_aint: int | None = None, enforce_max_neighbors_strictly: bool = True, rbf: dict[str, str] | None = None, rbf_spherical: dict | None = None, envelope: dict[str, str | int] | None = None, cbf: dict[str, str] | None = None, sbf: dict[str, str] | None = None, extensive: bool = True, forces_coupled: bool = False, output_init: str = 'HeOrthogonal', activation: str = 'silu', quad_interaction: bool = False, atom_edge_interaction: bool = False, edge_atom_interaction: bool = False, atom_interaction: bool = False, scale_basis: bool = False, qint_tags: list | None = None, num_elements: int = 83, otf_graph: bool = False, scale_file: str | None = None, **kwargs) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -153,6 +150,76 @@ Module Contents :type qint_tags: list + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: activation + + + .. py:attribute:: atom_edge_interaction + + + .. py:attribute:: edge_atom_interaction + + + .. py:attribute:: atom_interaction + + + .. py:attribute:: quad_interaction + + + .. py:attribute:: qint_tags + + + .. py:attribute:: otf_graph + + + .. py:attribute:: enforce_max_neighbors_strictly + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: forces_coupled + + + .. py:attribute:: regress_forces + + + .. py:attribute:: force_scaler + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: out_mlp_E + + + .. py:attribute:: out_energy + + + .. py:attribute:: out_initializer + + .. py:method:: set_cutoffs(cutoff, cutoff_qint, cutoff_aeaint, cutoff_aint) @@ -254,3 +321,272 @@ Module Contents +.. py:class:: GemNetOCBackbone(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip_in: int, emb_size_trip_out: int, emb_size_quad_in: int, emb_size_quad_out: int, emb_size_aint_in: int, emb_size_aint_out: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_sbf: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, num_output_afteratom: int, num_atom_emb_layers: int = 0, num_global_out_layers: int = 2, regress_forces: bool = True, direct_forces: bool = False, use_pbc: bool = True, scale_backprop_forces: bool = False, cutoff: float = 6.0, cutoff_qint: float | None = None, cutoff_aeaint: float | None = None, cutoff_aint: float | None = None, max_neighbors: int = 50, max_neighbors_qint: int | None = None, max_neighbors_aeaint: int | None = None, max_neighbors_aint: int | None = None, enforce_max_neighbors_strictly: bool = True, rbf: dict[str, str] | None = None, rbf_spherical: dict | None = None, envelope: dict[str, str | int] | None = None, cbf: dict[str, str] | None = None, sbf: dict[str, str] | None = None, extensive: bool = True, forces_coupled: bool = False, output_init: str = 'HeOrthogonal', activation: str = 'silu', quad_interaction: bool = False, atom_edge_interaction: bool = False, edge_atom_interaction: bool = False, atom_interaction: bool = False, scale_basis: bool = False, qint_tags: list | None = None, num_elements: int = 83, otf_graph: bool = False, scale_file: str | None = None, **kwargs) + + Bases: :py:obj:`GemNetOC`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + :param num_spherical: Controls maximum frequency. + :type num_spherical: int + :param num_radial: Controls maximum frequency. + :type num_radial: int + :param num_blocks: Number of building blocks to be stacked. + :type num_blocks: int + :param emb_size_atom: Embedding size of the atoms. + :type emb_size_atom: int + :param emb_size_edge: Embedding size of the edges. + :type emb_size_edge: int + :param emb_size_trip_in: (Down-projected) embedding size of the quadruplet edge embeddings + before the bilinear layer. + :type emb_size_trip_in: int + :param emb_size_trip_out: (Down-projected) embedding size of the quadruplet edge embeddings + after the bilinear layer. + :type emb_size_trip_out: int + :param emb_size_quad_in: (Down-projected) embedding size of the quadruplet edge embeddings + before the bilinear layer. + :type emb_size_quad_in: int + :param emb_size_quad_out: (Down-projected) embedding size of the quadruplet edge embeddings + after the bilinear layer. + :type emb_size_quad_out: int + :param emb_size_aint_in: Embedding size in the atom interaction before the bilinear layer. + :type emb_size_aint_in: int + :param emb_size_aint_out: Embedding size in the atom interaction after the bilinear layer. + :type emb_size_aint_out: int + :param emb_size_rbf: Embedding size of the radial basis transformation. + :type emb_size_rbf: int + :param emb_size_cbf: Embedding size of the circular basis transformation (one angle). + :type emb_size_cbf: int + :param emb_size_sbf: Embedding size of the spherical basis transformation (two angles). + :type emb_size_sbf: int + :param num_before_skip: Number of residual blocks before the first skip connection. + :type num_before_skip: int + :param num_after_skip: Number of residual blocks after the first skip connection. + :type num_after_skip: int + :param num_concat: Number of residual blocks after the concatenation. + :type num_concat: int + :param num_atom: Number of residual blocks in the atom embedding blocks. + :type num_atom: int + :param num_output_afteratom: Number of residual blocks in the output blocks + after adding the atom embedding. + :type num_output_afteratom: int + :param num_atom_emb_layers: Number of residual blocks for transforming atom embeddings. + :type num_atom_emb_layers: int + :param num_global_out_layers: Number of final residual blocks before the output. + :type num_global_out_layers: int + :param regress_forces: Whether to predict forces. Default: True + :type regress_forces: bool + :param direct_forces: If True predict forces based on aggregation of interatomic directions. + If False predict forces based on negative gradient of energy potential. + :type direct_forces: bool + :param use_pbc: Whether to use periodic boundary conditions. + :type use_pbc: bool + :param scale_backprop_forces: Whether to scale up the energy and then scales down the forces + to prevent NaNs and infs in backpropagated forces. + :type scale_backprop_forces: bool + :param cutoff: Embedding cutoff for interatomic connections and embeddings in Angstrom. + :type cutoff: float + :param cutoff_qint: Quadruplet interaction cutoff in Angstrom. + Optional. Uses cutoff per default. + :type cutoff_qint: float + :param cutoff_aeaint: Edge-to-atom and atom-to-edge interaction cutoff in Angstrom. + Optional. Uses cutoff per default. + :type cutoff_aeaint: float + :param cutoff_aint: Atom-to-atom interaction cutoff in Angstrom. + Optional. Uses maximum of all other cutoffs per default. + :type cutoff_aint: float + :param max_neighbors: Maximum number of neighbors for interatomic connections and embeddings. + :type max_neighbors: int + :param max_neighbors_qint: Maximum number of quadruplet interactions per embedding. + Optional. Uses max_neighbors per default. + :type max_neighbors_qint: int + :param max_neighbors_aeaint: Maximum number of edge-to-atom and atom-to-edge interactions per embedding. + Optional. Uses max_neighbors per default. + :type max_neighbors_aeaint: int + :param max_neighbors_aint: Maximum number of atom-to-atom interactions per atom. + Optional. Uses maximum of all other neighbors per default. + :type max_neighbors_aint: int + :param enforce_max_neighbors_strictly: When subselected edges based on max_neighbors args, arbitrarily + select amongst degenerate edges to have exactly the correct number. + :type enforce_max_neighbors_strictly: bool + :param rbf: Name and hyperparameters of the radial basis function. + :type rbf: dict + :param rbf_spherical: Name and hyperparameters of the radial basis function used as part of the + circular and spherical bases. + Optional. Uses rbf per default. + :type rbf_spherical: dict + :param envelope: Name and hyperparameters of the envelope function. + :type envelope: dict + :param cbf: Name and hyperparameters of the circular basis function. + :type cbf: dict + :param sbf: Name and hyperparameters of the spherical basis function. + :type sbf: dict + :param extensive: Whether the output should be extensive (proportional to the number of atoms) + :type extensive: bool + :param forces_coupled: If True, enforce that |F_st| = |F_ts|. No effect if direct_forces is False. + :type forces_coupled: bool + :param output_init: Initialization method for the final dense layer. + :type output_init: str + :param activation: Name of the activation function. + :type activation: str + :param scale_file: Path to the pytorch file containing the scaling factors. + :type scale_file: str + :param quad_interaction: Whether to use quadruplet interactions (with dihedral angles) + :type quad_interaction: bool + :param atom_edge_interaction: Whether to use atom-to-edge interactions + :type atom_edge_interaction: bool + :param edge_atom_interaction: Whether to use edge-to-atom interactions + :type edge_atom_interaction: bool + :param atom_interaction: Whether to use atom-to-atom interactions + :type atom_interaction: bool + :param scale_basis: Whether to use a scaling layer in the raw basis function for better + numerical stability. + :type scale_basis: bool + :param qint_tags: Which atom tags to use quadruplet interactions for. + 0=sub-surface bulk, 1=surface, 2=adsorbate atoms. + :type qint_tags: list + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch) -> dict[str, torch.Tensor] + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: GemNetOCEnergyAndGradForceHead(backbone: fairchem.core.models.base.BackboneInterface, num_global_out_layers: int, output_init: str = 'HeOrthogonal') + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: extensive + + + .. py:attribute:: regress_forces + + + .. py:attribute:: direct_forces + + + .. py:attribute:: force_scaler + + + .. py:attribute:: out_mlp_E + + + .. py:attribute:: out_energy + + + .. py:attribute:: out_initializer + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: GemNetOCForceHead(backbone, num_global_out_layers: int, output_init: str = 'HeOrthogonal') + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: direct_forces + + + .. py:attribute:: forces_coupled + + + .. py:attribute:: emb_size_edge + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + diff --git a/_sources/autoapi/core/models/gemnet_oc/index.rst b/_sources/autoapi/core/models/gemnet_oc/index.rst index e5bcf33ef0..5091731b03 100644 --- a/_sources/autoapi/core/models/gemnet_oc/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/index.rst @@ -36,17 +36,11 @@ Classes Package Contents ---------------- -.. py:class:: GemNetOC(num_atoms: int | None, bond_feat_dim: int, num_targets: int, num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip_in: int, emb_size_trip_out: int, emb_size_quad_in: int, emb_size_quad_out: int, emb_size_aint_in: int, emb_size_aint_out: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_sbf: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, num_output_afteratom: int, num_atom_emb_layers: int = 0, num_global_out_layers: int = 2, regress_forces: bool = True, direct_forces: bool = False, use_pbc: bool = True, scale_backprop_forces: bool = False, cutoff: float = 6.0, cutoff_qint: float | None = None, cutoff_aeaint: float | None = None, cutoff_aint: float | None = None, max_neighbors: int = 50, max_neighbors_qint: int | None = None, max_neighbors_aeaint: int | None = None, max_neighbors_aint: int | None = None, enforce_max_neighbors_strictly: bool = True, rbf: dict[str, str] | None = None, rbf_spherical: dict | None = None, envelope: dict[str, str | int] | None = None, cbf: dict[str, str] | None = None, sbf: dict[str, str] | None = None, extensive: bool = True, forces_coupled: bool = False, output_init: str = 'HeOrthogonal', activation: str = 'silu', quad_interaction: bool = False, atom_edge_interaction: bool = False, edge_atom_interaction: bool = False, atom_interaction: bool = False, scale_basis: bool = False, qint_tags: list | None = None, num_elements: int = 83, otf_graph: bool = False, scale_file: str | None = None, **kwargs) +.. py:class:: GemNetOC(num_spherical: int, num_radial: int, num_blocks: int, emb_size_atom: int, emb_size_edge: int, emb_size_trip_in: int, emb_size_trip_out: int, emb_size_quad_in: int, emb_size_quad_out: int, emb_size_aint_in: int, emb_size_aint_out: int, emb_size_rbf: int, emb_size_cbf: int, emb_size_sbf: int, num_before_skip: int, num_after_skip: int, num_concat: int, num_atom: int, num_output_afteratom: int, num_atom_emb_layers: int = 0, num_global_out_layers: int = 2, regress_forces: bool = True, direct_forces: bool = False, use_pbc: bool = True, scale_backprop_forces: bool = False, cutoff: float = 6.0, cutoff_qint: float | None = None, cutoff_aeaint: float | None = None, cutoff_aint: float | None = None, max_neighbors: int = 50, max_neighbors_qint: int | None = None, max_neighbors_aeaint: int | None = None, max_neighbors_aint: int | None = None, enforce_max_neighbors_strictly: bool = True, rbf: dict[str, str] | None = None, rbf_spherical: dict | None = None, envelope: dict[str, str | int] | None = None, cbf: dict[str, str] | None = None, sbf: dict[str, str] | None = None, extensive: bool = True, forces_coupled: bool = False, output_init: str = 'HeOrthogonal', activation: str = 'silu', quad_interaction: bool = False, atom_edge_interaction: bool = False, edge_atom_interaction: bool = False, atom_interaction: bool = False, scale_basis: bool = False, qint_tags: list | None = None, num_elements: int = 83, otf_graph: bool = False, scale_file: str | None = None, **kwargs) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` - :param num_atoms (int): - :type num_atoms (int): Unused argument - :param bond_feat_dim (int): - :type bond_feat_dim (int): Unused argument - :param num_targets: Number of prediction targets. - :type num_targets: int :param num_spherical: Controls maximum frequency. :type num_spherical: int :param num_radial: Controls maximum frequency. @@ -167,6 +161,76 @@ Package Contents :type qint_tags: list + .. py:attribute:: num_blocks + + + .. py:attribute:: extensive + + + .. py:attribute:: activation + + + .. py:attribute:: atom_edge_interaction + + + .. py:attribute:: edge_atom_interaction + + + .. py:attribute:: atom_interaction + + + .. py:attribute:: quad_interaction + + + .. py:attribute:: qint_tags + + + .. py:attribute:: otf_graph + + + .. py:attribute:: enforce_max_neighbors_strictly + + + .. py:attribute:: use_pbc + + + .. py:attribute:: direct_forces + + + .. py:attribute:: forces_coupled + + + .. py:attribute:: regress_forces + + + .. py:attribute:: force_scaler + + + .. py:attribute:: atom_emb + + + .. py:attribute:: edge_emb + + + .. py:attribute:: int_blocks + :value: [] + + + + .. py:attribute:: out_blocks + :value: [] + + + + .. py:attribute:: out_mlp_E + + + .. py:attribute:: out_energy + + + .. py:attribute:: out_initializer + + .. py:method:: set_cutoffs(cutoff, cutoff_qint, cutoff_aeaint, cutoff_aint) diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/atom_update_block/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/atom_update_block/index.rst index 51a972e969..8aecd00f9d 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/atom_update_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/atom_update_block/index.rst @@ -42,6 +42,15 @@ Module Contents :type activation: callable/str + .. py:attribute:: dense_rbf + + + .. py:attribute:: scale_sum + + + .. py:attribute:: layers + + .. py:method:: get_mlp(units_in: int, units: int, nHidden: int, activation) @@ -76,6 +85,12 @@ Module Contents :type direct_forces: bool + .. py:attribute:: direct_forces + + + .. py:attribute:: seq_energy_pre + + .. py:method:: forward(h: torch.Tensor, m: torch.Tensor, basis_rad, idx_atom) :returns: * *torch.Tensor, shape=(nAtoms, emb_size_atom)* -- Output atom embeddings. diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/base_layers/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/base_layers/index.rst index 88c9e018a0..778e5a21eb 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/base_layers/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/base_layers/index.rst @@ -41,6 +41,9 @@ Module Contents :type activation: str + .. py:attribute:: linear + + .. py:method:: reset_parameters(initializer=he_orthogonal_init) -> None @@ -84,6 +87,12 @@ Module Contents :vartype training: bool + .. py:attribute:: scale_factor + + + .. py:attribute:: _activation + + .. py:method:: forward(x) @@ -104,6 +113,12 @@ Module Contents :type layer_kwargs: str + .. py:attribute:: dense_mlp + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(input) diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/efficient/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/efficient/index.rst index e9790b9cf0..1953a18c2d 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/efficient/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/efficient/index.rst @@ -43,6 +43,12 @@ Module Contents :type: torch.nn.Parameter + .. py:attribute:: num_radial + + + .. py:attribute:: num_spherical + + .. py:method:: reset_parameters() -> None @@ -88,6 +94,18 @@ Module Contents :type emb_size_out: int + .. py:attribute:: emb_size_in + + + .. py:attribute:: emb_size_interm + + + .. py:attribute:: emb_size_out + + + .. py:attribute:: bilinear + + .. py:method:: forward(basis, m, idx_agg_outer, idx_agg_inner, idx_agg2_outer=None, idx_agg2_inner=None, agg2_out_size=None) :param basis: diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/embedding_block/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/embedding_block/index.rst index e62bd67619..6f89ffa62d 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/embedding_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/embedding_block/index.rst @@ -34,6 +34,12 @@ Module Contents :type emb_size: int + .. py:attribute:: emb_size + + + .. py:attribute:: embeddings + + .. py:method:: forward(Z) -> torch.Tensor :returns: **h** -- Atom embeddings. @@ -59,6 +65,12 @@ Module Contents :type activation: str + .. py:attribute:: in_features + + + .. py:attribute:: dense + + .. py:method:: forward(h: torch.Tensor, m: torch.Tensor, edge_index) -> torch.Tensor :param h: Atom embeddings. diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/force_scaler/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/force_scaler/index.rst index d4195994ec..f67f56d2f2 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/force_scaler/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/force_scaler/index.rst @@ -29,6 +29,29 @@ Module Contents Inspired by torch.cuda.amp.GradScaler. + .. py:attribute:: scale_factor + + + .. py:attribute:: growth_factor + + + .. py:attribute:: backoff_factor + + + .. py:attribute:: growth_interval + + + .. py:attribute:: max_force_iters + + + .. py:attribute:: enabled + + + .. py:attribute:: finite_force_results + :value: 0 + + + .. py:method:: scale(energy) diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/interaction_block/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/interaction_block/index.rst index a563178582..3a19e9c94a 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/interaction_block/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/interaction_block/index.rst @@ -80,6 +80,45 @@ Module Contents :type activation: str + .. py:attribute:: dense_ca + + + .. py:attribute:: trip_interaction + + + .. py:attribute:: layers_before_skip + + + .. py:attribute:: layers_after_skip + + + .. py:attribute:: atom_emb_layers + + + .. py:attribute:: atom_update + + + .. py:attribute:: concat_layer + + + .. py:attribute:: residual_m + + + .. py:attribute:: inv_sqrt_2 + + + .. py:attribute:: num_eint + + + .. py:attribute:: inv_sqrt_num_eint + + + .. py:attribute:: num_aint + + + .. py:attribute:: inv_sqrt_num_aint + + .. py:method:: forward(h, m, bases_qint, bases_e2e, bases_a2e, bases_e2a, basis_a2a_rad, basis_atom_update, edge_index_main, a2ee2a_graph, a2a_graph, id_swap, trip_idx_e2e, trip_idx_a2e, trip_idx_e2a, quad_idx) :returns: * **h** (*torch.Tensor, shape=(nEdges, emb_size_atom)*) -- Atom embeddings. @@ -115,6 +154,39 @@ Module Contents :type activation: str + .. py:attribute:: symmetric_mp + + + .. py:attribute:: dense_db + + + .. py:attribute:: mlp_rbf + + + .. py:attribute:: scale_rbf + + + .. py:attribute:: mlp_cbf + + + .. py:attribute:: scale_cbf + + + .. py:attribute:: mlp_sbf + + + .. py:attribute:: scale_sbf_sum + + + .. py:attribute:: down_projection + + + .. py:attribute:: up_projection_ca + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(m, bases, idx, id_swap) :returns: **m** -- Edge embeddings (c->a). @@ -153,6 +225,36 @@ Module Contents :type activation: str + .. py:attribute:: symmetric_mp + + + .. py:attribute:: swap_output + + + .. py:attribute:: dense_ba + + + .. py:attribute:: mlp_rbf + + + .. py:attribute:: scale_rbf + + + .. py:attribute:: mlp_cbf + + + .. py:attribute:: scale_cbf_sum + + + .. py:attribute:: down_projection + + + .. py:attribute:: up_projection_ca + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(m, bases, idx, id_swap, expand_idx=None, idx_agg2=None, idx_agg2_inner=None, agg2_out_size=None) :returns: **m** -- Edge embeddings. @@ -179,6 +281,21 @@ Module Contents :type activation: str + .. py:attribute:: bilinear + + + .. py:attribute:: scale_rbf_sum + + + .. py:attribute:: down_projection + + + .. py:attribute:: up_projection + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: forward(h, rad_basis, edge_index, target_neighbor_idx) :returns: **h** -- Atom embeddings. diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/radial_basis/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/radial_basis/index.rst index de5b708613..b023020b47 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/radial_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/radial_basis/index.rst @@ -38,6 +38,21 @@ Module Contents :type exponent: int + .. py:attribute:: p + + + .. py:attribute:: a + :type: float + + + .. py:attribute:: b + :type: float + + + .. py:attribute:: c + :type: float + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -92,6 +107,12 @@ Module Contents :vartype training: bool + .. py:attribute:: offset + + + .. py:attribute:: coeff + + .. py:method:: forward(dist: torch.Tensor) -> torch.Tensor @@ -108,6 +129,12 @@ Module Contents :type cutoff: float + .. py:attribute:: norm_const + + + .. py:attribute:: frequencies + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -129,6 +156,21 @@ Module Contents :type pregamma_initial: float + .. py:attribute:: prefactor + + + .. py:attribute:: pregamma + + + .. py:attribute:: softplus + + + .. py:attribute:: exp1 + + + .. py:attribute:: exp2 + + .. py:method:: forward(d_scaled: torch.Tensor) -> torch.Tensor @@ -149,6 +191,24 @@ Module Contents :type scale_basis: bool + .. py:attribute:: inv_cutoff + + + .. py:attribute:: scale_basis + + + .. py:attribute:: env_name + + + .. py:attribute:: env_hparams + + + .. py:attribute:: rbf_name + + + .. py:attribute:: rbf_hparams + + .. py:method:: forward(d: torch.Tensor) -> torch.Tensor diff --git a/_sources/autoapi/core/models/gemnet_oc/layers/spherical_basis/index.rst b/_sources/autoapi/core/models/gemnet_oc/layers/spherical_basis/index.rst index 16f22a58cb..5cfd361a56 100644 --- a/_sources/autoapi/core/models/gemnet_oc/layers/spherical_basis/index.rst +++ b/_sources/autoapi/core/models/gemnet_oc/layers/spherical_basis/index.rst @@ -40,6 +40,18 @@ Module Contents :type scale_basis: bool + .. py:attribute:: radial_basis + + + .. py:attribute:: scale_basis + + + .. py:attribute:: cbf_name + + + .. py:attribute:: cbf_hparams + + .. py:method:: forward(D_ca, cosφ_cab) @@ -60,6 +72,21 @@ Module Contents :type scale_basis: bool + .. py:attribute:: num_spherical + + + .. py:attribute:: radial_basis + + + .. py:attribute:: scale_basis + + + .. py:attribute:: sbf_name + + + .. py:attribute:: sbf_hparams + + .. py:method:: forward(D_ca, cosφ_cab, θ_cabd) diff --git a/_sources/autoapi/core/models/painn/index.rst b/_sources/autoapi/core/models/painn/index.rst index 8461daa351..2c1f3791e2 100644 --- a/_sources/autoapi/core/models/painn/index.rst +++ b/_sources/autoapi/core/models/painn/index.rst @@ -25,9 +25,9 @@ Classes Package Contents ---------------- -.. py:class:: PaiNN(num_atoms: int, bond_feat_dim: int, num_targets: int, hidden_channels: int = 512, num_layers: int = 6, num_rbf: int = 128, cutoff: float = 12.0, max_neighbors: int = 50, rbf: dict[str, str] | None = None, envelope: dict[str, str | int] | None = None, regress_forces: bool = True, direct_forces: bool = True, use_pbc: bool = True, otf_graph: bool = True, num_elements: int = 83, scale_file: str | None = None) +.. py:class:: PaiNN(hidden_channels: int = 512, num_layers: int = 6, num_rbf: int = 128, cutoff: float = 12.0, max_neighbors: int = 50, rbf: dict[str, str] | None = None, envelope: dict[str, str | int] | None = None, regress_forces: bool = True, direct_forces: bool = True, use_pbc: bool = True, otf_graph: bool = True, num_elements: int = 83, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` PaiNN model based on the description in Schütt et al. (2021): @@ -35,6 +35,56 @@ Package Contents and molecular spectra, https://arxiv.org/abs/2102.03150. + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_layers + + + .. py:attribute:: num_rbf + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: direct_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: symmetric_edge_symmetrization + :value: False + + + + .. py:attribute:: atom_emb + + + .. py:attribute:: radial_basis + + + .. py:attribute:: message_layers + + + .. py:attribute:: update_layers + + + .. py:attribute:: out_energy + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: reset_parameters() -> None diff --git a/_sources/autoapi/core/models/painn/painn/index.rst b/_sources/autoapi/core/models/painn/painn/index.rst index 151abaac46..9d5c550699 100644 --- a/_sources/autoapi/core/models/painn/painn/index.rst +++ b/_sources/autoapi/core/models/painn/painn/index.rst @@ -42,18 +42,21 @@ Classes .. autoapisummary:: core.models.painn.painn.PaiNN + core.models.painn.painn.PaiNNBackbone core.models.painn.painn.PaiNNMessage core.models.painn.painn.PaiNNUpdate core.models.painn.painn.PaiNNOutput core.models.painn.painn.GatedEquivariantBlock + core.models.painn.painn.PaiNNEnergyHead + core.models.painn.painn.PaiNNForceHead Module Contents --------------- -.. py:class:: PaiNN(num_atoms: int, bond_feat_dim: int, num_targets: int, hidden_channels: int = 512, num_layers: int = 6, num_rbf: int = 128, cutoff: float = 12.0, max_neighbors: int = 50, rbf: dict[str, str] | None = None, envelope: dict[str, str | int] | None = None, regress_forces: bool = True, direct_forces: bool = True, use_pbc: bool = True, otf_graph: bool = True, num_elements: int = 83, scale_file: str | None = None) +.. py:class:: PaiNN(hidden_channels: int = 512, num_layers: int = 6, num_rbf: int = 128, cutoff: float = 12.0, max_neighbors: int = 50, rbf: dict[str, str] | None = None, envelope: dict[str, str | int] | None = None, regress_forces: bool = True, direct_forces: bool = True, use_pbc: bool = True, otf_graph: bool = True, num_elements: int = 83, scale_file: str | None = None) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` PaiNN model based on the description in Schütt et al. (2021): @@ -61,6 +64,56 @@ Module Contents and molecular spectra, https://arxiv.org/abs/2102.03150. + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_layers + + + .. py:attribute:: num_rbf + + + .. py:attribute:: cutoff + + + .. py:attribute:: max_neighbors + + + .. py:attribute:: regress_forces + + + .. py:attribute:: direct_forces + + + .. py:attribute:: otf_graph + + + .. py:attribute:: use_pbc + + + .. py:attribute:: symmetric_edge_symmetrization + :value: False + + + + .. py:attribute:: atom_emb + + + .. py:attribute:: radial_basis + + + .. py:attribute:: message_layers + + + .. py:attribute:: update_layers + + + .. py:attribute:: out_energy + + + .. py:attribute:: inv_sqrt_2 + + .. py:method:: reset_parameters() -> None @@ -98,6 +151,28 @@ Module Contents +.. py:class:: PaiNNBackbone(hidden_channels: int = 512, num_layers: int = 6, num_rbf: int = 128, cutoff: float = 12.0, max_neighbors: int = 50, rbf: dict[str, str] | None = None, envelope: dict[str, str | int] | None = None, regress_forces: bool = True, direct_forces: bool = True, use_pbc: bool = True, otf_graph: bool = True, num_elements: int = 83, scale_file: str | None = None) + + Bases: :py:obj:`PaiNN`, :py:obj:`fairchem.core.models.base.BackboneInterface` + + + PaiNN model based on the description in Schütt et al. (2021): + Equivariant message passing for the prediction of tensorial properties + and molecular spectra, https://arxiv.org/abs/2102.03150. + + + .. py:method:: forward(data) -> dict[str, torch.Tensor] + + Backbone forward. + + :param data: Atomic systems as input + :type data: DataBatch + + :returns: **embedding** -- Return backbone embeddings for the given input + :rtype: dict[str->torch.Tensor] + + + .. py:class:: PaiNNMessage(hidden_channels, num_rbf) Bases: :py:obj:`torch_geometric.nn.MessagePassing` @@ -166,6 +241,24 @@ Module Contents :type decomposed_layers: int, optional + .. py:attribute:: hidden_channels + + + .. py:attribute:: x_proj + + + .. py:attribute:: rbf_proj + + + .. py:attribute:: inv_sqrt_3 + + + .. py:attribute:: inv_sqrt_h + + + .. py:attribute:: x_layernorm + + .. py:method:: reset_parameters() -> None Resets all learnable parameters of the module. @@ -252,6 +345,21 @@ Module Contents :vartype training: bool + .. py:attribute:: hidden_channels + + + .. py:attribute:: vec_proj + + + .. py:attribute:: xvec_proj + + + .. py:attribute:: inv_sqrt_2 + + + .. py:attribute:: inv_sqrt_h + + .. py:method:: reset_parameters() -> None @@ -295,6 +403,12 @@ Module Contents :vartype training: bool + .. py:attribute:: hidden_channels + + + .. py:attribute:: output_network + + .. py:method:: reset_parameters() -> None @@ -310,9 +424,132 @@ Module Contents Equivariant message passing for the prediction of tensorial properties and molecular spectra + .. py:attribute:: out_channels + + + .. py:attribute:: vec1_proj + + + .. py:attribute:: vec2_proj + + + .. py:attribute:: update_net + + + .. py:attribute:: act + + .. py:method:: reset_parameters() -> None .. py:method:: forward(x, v) +.. py:class:: PaiNNEnergyHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: out_energy + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + +.. py:class:: PaiNNForceHead(backbone) + + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.HeadInterface` + + + Base class for all neural network modules. + + Your models should also subclass this class. + + Modules can also contain other Modules, allowing to nest them in + a tree structure. You can assign the submodules as regular attributes:: + + import torch.nn as nn + import torch.nn.functional as F + + class Model(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 20, 5) + self.conv2 = nn.Conv2d(20, 20, 5) + + def forward(self, x): + x = F.relu(self.conv1(x)) + return F.relu(self.conv2(x)) + + Submodules assigned in this way will be registered, and will have their + parameters converted too when you call :meth:`to`, etc. + + .. note:: + As per the example above, an ``__init__()`` call to the parent class + must be made before assignment on the child. + + :ivar training: Boolean represents whether this module is in training or + evaluation mode. + :vartype training: bool + + + .. py:attribute:: direct_forces + + + .. py:method:: forward(data: torch_geometric.data.batch.Batch, emb: dict[str, torch.Tensor]) -> dict[str, torch.Tensor] + + Head forward. + + :param data: Atomic systems as input + :type data: DataBatch + :param emb: Embeddings of the input as generated by the backbone + :type emb: dict[str->torch.Tensor] + + :returns: **outputs** -- Return one or more targets generated by this head + :rtype: dict[str->torch.Tensor] + + + diff --git a/_sources/autoapi/core/models/schnet/index.rst b/_sources/autoapi/core/models/schnet/index.rst index c3ca27360f..b25ccdc7e0 100644 --- a/_sources/autoapi/core/models/schnet/index.rst +++ b/_sources/autoapi/core/models/schnet/index.rst @@ -23,9 +23,9 @@ Classes Module Contents --------------- -.. py:class:: SchNetWrap(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, hidden_channels: int = 128, num_filters: int = 128, num_interactions: int = 6, num_gaussians: int = 50, cutoff: float = 10.0, readout: str = 'add') +.. py:class:: SchNetWrap(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, hidden_channels: int = 128, num_filters: int = 128, num_interactions: int = 6, num_gaussians: int = 50, cutoff: float = 10.0, readout: str = 'add') - Bases: :py:obj:`torch_geometric.nn.SchNet`, :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch_geometric.nn.SchNet`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Wrapper around the continuous-filter convolutional neural network SchNet from the @@ -37,12 +37,6 @@ Module Contents \mathbf{x}^{\prime}_i = \sum_{j \in \mathcal{N}(i)} \mathbf{x}_j \odot h_{\mathbf{\Theta}} ( \exp(-\gamma(\mathbf{e}_{j,i} - \mathbf{\mu}))), - :param num_atoms: Unused argument - :type num_atoms: int - :param bond_feat_dim: Unused argument - :type bond_feat_dim: int - :param num_targets: Number of targets to predict. - :type num_targets: int :param use_pbc: If set to :obj:`True`, account for periodic boundary conditions. (default: :obj:`True`) :type use_pbc: bool, optional @@ -73,6 +67,31 @@ Module Contents :type readout: string, optional + .. py:attribute:: num_targets + :value: 1 + + + + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: max_neighbors + :value: 50 + + + + .. py:attribute:: reduce + + .. py:method:: _forward(data) diff --git a/_sources/autoapi/core/models/scn/index.rst b/_sources/autoapi/core/models/scn/index.rst index c2b25df438..31ca3f6cf4 100644 --- a/_sources/autoapi/core/models/scn/index.rst +++ b/_sources/autoapi/core/models/scn/index.rst @@ -27,9 +27,9 @@ Classes Package Contents ---------------- -.. py:class:: SphericalChannelNetwork(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_num_neighbors: int = 20, cutoff: float = 8.0, max_num_elements: int = 90, num_interactions: int = 8, lmax: int = 6, mmax: int = 1, num_resolutions: int = 2, sphere_channels: int = 128, sphere_channels_reduce: int = 128, hidden_channels: int = 256, num_taps: int = -1, use_grid: bool = True, num_bands: int = 1, num_sphere_samples: int = 128, num_basis_functions: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False, direct_forces: bool = True) +.. py:class:: SphericalChannelNetwork(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_num_neighbors: int = 20, cutoff: float = 8.0, max_num_elements: int = 90, num_interactions: int = 8, lmax: int = 6, mmax: int = 1, num_resolutions: int = 2, sphere_channels: int = 128, sphere_channels_reduce: int = 128, hidden_channels: int = 256, num_taps: int = -1, use_grid: bool = True, num_bands: int = 1, num_sphere_samples: int = 128, num_basis_functions: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False, direct_forces: bool = True) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Spherical Channel Network @@ -105,6 +105,95 @@ Package Contents :type: torch.nn.Linear + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: show_timing_info + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_interactions + + + .. py:attribute:: num_atoms + :value: 0 + + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: sphere_channels_reduce + + + .. py:attribute:: num_basis_functions + + + .. py:attribute:: distance_resolution + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: basis_width_scalar + + + .. py:attribute:: sphere_basis + + + .. py:attribute:: use_grid + + + .. py:attribute:: distance_function + + + .. py:attribute:: counter + :value: 0 + + + + .. py:attribute:: act + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: num_gaussians + + + .. py:attribute:: sphharm_list + :value: [] + + + + .. py:attribute:: edge_blocks + + .. py:method:: forward(data) diff --git a/_sources/autoapi/core/models/scn/scn/index.rst b/_sources/autoapi/core/models/scn/scn/index.rst index f48f2e0b6b..fc45235087 100644 --- a/_sources/autoapi/core/models/scn/scn/index.rst +++ b/_sources/autoapi/core/models/scn/scn/index.rst @@ -26,9 +26,9 @@ Classes Module Contents --------------- -.. py:class:: SphericalChannelNetwork(num_atoms: int, bond_feat_dim: int, num_targets: int, use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_num_neighbors: int = 20, cutoff: float = 8.0, max_num_elements: int = 90, num_interactions: int = 8, lmax: int = 6, mmax: int = 1, num_resolutions: int = 2, sphere_channels: int = 128, sphere_channels_reduce: int = 128, hidden_channels: int = 256, num_taps: int = -1, use_grid: bool = True, num_bands: int = 1, num_sphere_samples: int = 128, num_basis_functions: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False, direct_forces: bool = True) +.. py:class:: SphericalChannelNetwork(use_pbc: bool = True, regress_forces: bool = True, otf_graph: bool = False, max_num_neighbors: int = 20, cutoff: float = 8.0, max_num_elements: int = 90, num_interactions: int = 8, lmax: int = 6, mmax: int = 1, num_resolutions: int = 2, sphere_channels: int = 128, sphere_channels_reduce: int = 128, hidden_channels: int = 256, num_taps: int = -1, use_grid: bool = True, num_bands: int = 1, num_sphere_samples: int = 128, num_basis_functions: int = 128, distance_function: str = 'gaussian', basis_width_scalar: float = 1.0, distance_resolution: float = 0.02, show_timing_info: bool = False, direct_forces: bool = True) - Bases: :py:obj:`fairchem.core.models.base.BaseModel` + Bases: :py:obj:`torch.nn.Module`, :py:obj:`fairchem.core.models.base.GraphModelMixin` Spherical Channel Network @@ -104,6 +104,95 @@ Module Contents :type: torch.nn.Linear + .. py:attribute:: regress_forces + + + .. py:attribute:: use_pbc + + + .. py:attribute:: cutoff + + + .. py:attribute:: otf_graph + + + .. py:attribute:: show_timing_info + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: num_interactions + + + .. py:attribute:: num_atoms + :value: 0 + + + + .. py:attribute:: num_sphere_samples + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: sphere_channels_reduce + + + .. py:attribute:: num_basis_functions + + + .. py:attribute:: distance_resolution + + + .. py:attribute:: grad_forces + :value: False + + + + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: basis_width_scalar + + + .. py:attribute:: sphere_basis + + + .. py:attribute:: use_grid + + + .. py:attribute:: distance_function + + + .. py:attribute:: counter + :value: 0 + + + + .. py:attribute:: act + + + .. py:attribute:: sphere_embedding + + + .. py:attribute:: num_gaussians + + + .. py:attribute:: sphharm_list + :value: [] + + + + .. py:attribute:: edge_blocks + + .. py:method:: forward(data) @@ -158,6 +247,48 @@ Module Contents :vartype training: bool + .. py:attribute:: num_resolutions + + + .. py:attribute:: act + + + .. py:attribute:: hidden_channels_list + + + .. py:attribute:: sphere_channels + + + .. py:attribute:: sphere_channels_reduce + + + .. py:attribute:: distance_expansion + + + .. py:attribute:: cutoff_list + + + .. py:attribute:: sphharm_list + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: num_basis_functions + + + .. py:attribute:: use_grid + + + .. py:attribute:: num_gaussians + + + .. py:attribute:: dist_block + + + .. py:attribute:: message_blocks + + .. py:method:: forward(x, atomic_numbers, edge_distance, edge_index, cutoff_index) @@ -198,6 +329,30 @@ Module Contents :vartype training: bool + .. py:attribute:: act + + + .. py:attribute:: hidden_channels + + + .. py:attribute:: sphere_channels_reduce + + + .. py:attribute:: sphharm + + + .. py:attribute:: fc1_dist + + + .. py:attribute:: fc1_edge_proj + + + .. py:attribute:: fc1_edge + + + .. py:attribute:: fc2_edge + + .. py:method:: forward(x, x_edge, edge_index) @@ -238,6 +393,36 @@ Module Contents :vartype training: bool + .. py:attribute:: in_channels + + + .. py:attribute:: distance_expansion + + + .. py:attribute:: act + + + .. py:attribute:: num_basis_functions + + + .. py:attribute:: max_num_elements + + + .. py:attribute:: num_edge_channels + + + .. py:attribute:: fc1_dist + + + .. py:attribute:: source_embedding + + + .. py:attribute:: target_embedding + + + .. py:attribute:: fc1_edge_attr + + .. py:method:: forward(edge_distance, source_element, target_element) diff --git a/_sources/autoapi/core/models/scn/smearing/index.rst b/_sources/autoapi/core/models/scn/smearing/index.rst index e6762b9248..3e90689321 100644 --- a/_sources/autoapi/core/models/scn/smearing/index.rst +++ b/_sources/autoapi/core/models/scn/smearing/index.rst @@ -63,6 +63,15 @@ Module Contents :vartype training: bool + .. py:attribute:: num_output + + + .. py:attribute:: offset + + + .. py:attribute:: coeff + + .. py:method:: forward(dist) -> torch.Tensor @@ -103,6 +112,15 @@ Module Contents :vartype training: bool + .. py:attribute:: num_output + + + .. py:attribute:: offset + + + .. py:attribute:: coeff + + .. py:method:: forward(dist) -> torch.Tensor @@ -143,6 +161,15 @@ Module Contents :vartype training: bool + .. py:attribute:: num_output + + + .. py:attribute:: offset + + + .. py:attribute:: coeff + + .. py:method:: forward(dist) -> torch.Tensor @@ -183,6 +210,15 @@ Module Contents :vartype training: bool + .. py:attribute:: num_output + + + .. py:attribute:: fc1 + + + .. py:attribute:: act + + .. py:method:: forward(dist) diff --git a/_sources/autoapi/core/models/scn/spherical_harmonics/index.rst b/_sources/autoapi/core/models/scn/spherical_harmonics/index.rst index 3a387b2a5d..f8d93e39fd 100644 --- a/_sources/autoapi/core/models/scn/spherical_harmonics/index.rst +++ b/_sources/autoapi/core/models/scn/spherical_harmonics/index.rst @@ -56,6 +56,24 @@ Module Contents :type num_bands: int + .. py:attribute:: lmax + + + .. py:attribute:: mmax + + + .. py:attribute:: num_taps + + + .. py:attribute:: num_bands + + + .. py:attribute:: sphere_basis + + + .. py:attribute:: sphere_basis_reduce + + .. py:method:: InitWignerDMatrix(edge_rot_mat) -> None diff --git a/_sources/autoapi/core/models/utils/activations/index.rst b/_sources/autoapi/core/models/utils/activations/index.rst index 07ea490fed..4bdd0269c9 100644 --- a/_sources/autoapi/core/models/utils/activations/index.rst +++ b/_sources/autoapi/core/models/utils/activations/index.rst @@ -60,6 +60,15 @@ Module Contents :vartype training: bool + .. py:attribute:: act + + + .. py:attribute:: slope + + + .. py:attribute:: shift + + .. py:method:: forward(input: torch.Tensor) -> torch.Tensor diff --git a/_sources/autoapi/core/models/utils/basis/index.rst b/_sources/autoapi/core/models/utils/basis/index.rst index 2a4c74171d..db63d8a361 100644 --- a/_sources/autoapi/core/models/utils/basis/index.rst +++ b/_sources/autoapi/core/models/utils/basis/index.rst @@ -66,6 +66,9 @@ Module Contents :vartype training: bool + .. py:attribute:: w0 + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -106,6 +109,12 @@ Module Contents :vartype training: bool + .. py:attribute:: layers + + + .. py:attribute:: network + + .. py:method:: forward(X: torch.Tensor) -> torch.Tensor @@ -146,6 +155,22 @@ Module Contents :vartype training: bool + .. py:attribute:: num_freqs + + + .. py:attribute:: out_dim + :type: int + + + .. py:attribute:: use_cosine + + + .. py:attribute:: freq + + + .. py:attribute:: freq_filter + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -186,6 +211,16 @@ Module Contents :vartype training: bool + .. py:attribute:: num_freqs + + + .. py:attribute:: offset + + + .. py:attribute:: coeff + :type: float + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -226,6 +261,22 @@ Module Contents :vartype training: bool + .. py:attribute:: num_freqs + + + .. py:attribute:: out_dim + :type: int + + + .. py:attribute:: use_cosine + + + .. py:attribute:: freq + + + .. py:attribute:: freq_filter + + .. py:method:: forward(x: torch.Tensor) -> torch.Tensor @@ -270,6 +321,12 @@ Module Contents :type: SINESmearing | FourierSmearing | GaussianSmearing | torch.nn.Sequential + .. py:attribute:: num_freqs + + + .. py:attribute:: basis_type + + .. py:method:: forward(x: torch.Tensor, edge_attr_sph: torch.Tensor | None = None) @@ -318,6 +375,24 @@ Module Contents :type: numpy.typing.NDArray[numpy.int_] + .. py:attribute:: max_n + + + .. py:attribute:: m_list + :type: list[int] + :value: [] + + + + .. py:attribute:: n_list + :type: list[int] + :value: [] + + + + .. py:attribute:: out_dim + + .. py:method:: forward(xyz: torch.Tensor) -> torch.Tensor diff --git a/_sources/autoapi/core/modules/evaluator/index.rst b/_sources/autoapi/core/modules/evaluator/index.rst index f3f9252254..68e8a9d68e 100644 --- a/_sources/autoapi/core/modules/evaluator/index.rst +++ b/_sources/autoapi/core/modules/evaluator/index.rst @@ -64,6 +64,12 @@ Module Contents :type: ClassVar[dict[str, str | None]] + .. py:attribute:: task + + + .. py:attribute:: target_metrics + + .. py:method:: eval(prediction: dict[str, torch.Tensor], target: dict[str, torch.Tensor], prev_metrics=None) diff --git a/_sources/autoapi/core/modules/exponential_moving_average/index.rst b/_sources/autoapi/core/modules/exponential_moving_average/index.rst index a0c90bb2e0..a7a1855f2f 100644 --- a/_sources/autoapi/core/modules/exponential_moving_average/index.rst +++ b/_sources/autoapi/core/modules/exponential_moving_average/index.rst @@ -32,6 +32,28 @@ Module Contents averages. + .. py:attribute:: decay + + + .. py:attribute:: num_updates + :type: int | None + + + .. py:attribute:: parameters + + + .. py:attribute:: shadow_params + + + .. py:attribute:: collected_params + :type: list[torch.nn.Parameter] + :value: [] + + + + .. py:attribute:: _params_refs + + .. py:method:: _get_parameters(parameters: collections.abc.Iterable[torch.nn.Parameter] | None) -> collections.abc.Iterable[torch.nn.Parameter] diff --git a/_sources/autoapi/core/modules/loss/index.rst b/_sources/autoapi/core/modules/loss/index.rst index 62a572829d..fd75d0d7c0 100644 --- a/_sources/autoapi/core/modules/loss/index.rst +++ b/_sources/autoapi/core/modules/loss/index.rst @@ -54,6 +54,9 @@ Module Contents :vartype training: bool + .. py:attribute:: reduction + + .. py:method:: forward(input: torch.Tensor, target: torch.Tensor) @@ -94,6 +97,9 @@ Module Contents :vartype training: bool + .. py:attribute:: reduction + + .. py:method:: forward(input: torch.Tensor, target: torch.Tensor, natoms: torch.Tensor) @@ -134,6 +140,15 @@ Module Contents :vartype training: bool + .. py:attribute:: loss_fn + + + .. py:attribute:: loss_name + + + .. py:attribute:: reduction + + .. py:method:: forward(input: torch.Tensor, target: torch.Tensor, natoms: torch.Tensor | None = None, batch_size: int | None = None) diff --git a/_sources/autoapi/core/modules/normalizer/index.rst b/_sources/autoapi/core/modules/normalizer/index.rst index 13b903dc36..5dae6fb437 100644 --- a/_sources/autoapi/core/modules/normalizer/index.rst +++ b/_sources/autoapi/core/modules/normalizer/index.rst @@ -28,6 +28,14 @@ Module Contents Normalize a Tensor and restore it later. + .. py:attribute:: mean + :type: torch.Tensor + + + .. py:attribute:: std + :type: torch.Tensor + + .. py:method:: to(device) -> None diff --git a/_sources/autoapi/core/modules/scheduler/index.rst b/_sources/autoapi/core/modules/scheduler/index.rst index 701e3455f4..3dfced6e78 100644 --- a/_sources/autoapi/core/modules/scheduler/index.rst +++ b/_sources/autoapi/core/modules/scheduler/index.rst @@ -32,6 +32,12 @@ Module Contents :type config: dict + .. py:attribute:: optimizer + + + .. py:attribute:: config + + .. py:method:: step(metrics=None, epoch=None) -> None diff --git a/_sources/autoapi/core/modules/transforms/index.rst b/_sources/autoapi/core/modules/transforms/index.rst index e3d61265df..b14c9f8828 100644 --- a/_sources/autoapi/core/modules/transforms/index.rst +++ b/_sources/autoapi/core/modules/transforms/index.rst @@ -25,6 +25,9 @@ Module Contents .. py:class:: DataTransforms(config) + .. py:attribute:: config + + .. py:method:: __call__(data_object) diff --git a/_sources/autoapi/core/preprocessing/atoms_to_graphs/index.rst b/_sources/autoapi/core/preprocessing/atoms_to_graphs/index.rst index 8b2f592893..8fb3e41712 100644 --- a/_sources/autoapi/core/preprocessing/atoms_to_graphs/index.rst +++ b/_sources/autoapi/core/preprocessing/atoms_to_graphs/index.rst @@ -154,6 +154,36 @@ Module Contents + .. py:attribute:: max_neigh + + + .. py:attribute:: radius + + + .. py:attribute:: r_energy + + + .. py:attribute:: r_forces + + + .. py:attribute:: r_stress + + + .. py:attribute:: r_distances + + + .. py:attribute:: r_fixed + + + .. py:attribute:: r_edges + + + .. py:attribute:: r_pbc + + + .. py:attribute:: r_data_keys + + .. py:method:: _get_neighbors_pymatgen(atoms: ase.Atoms) Preforms nearest neighbor search and returns edge index, distances, diff --git a/_sources/autoapi/core/preprocessing/index.rst b/_sources/autoapi/core/preprocessing/index.rst index 98cf6f1f5b..fc2b7c8172 100644 --- a/_sources/autoapi/core/preprocessing/index.rst +++ b/_sources/autoapi/core/preprocessing/index.rst @@ -148,6 +148,36 @@ Package Contents + .. py:attribute:: max_neigh + + + .. py:attribute:: radius + + + .. py:attribute:: r_energy + + + .. py:attribute:: r_forces + + + .. py:attribute:: r_stress + + + .. py:attribute:: r_distances + + + .. py:attribute:: r_fixed + + + .. py:attribute:: r_edges + + + .. py:attribute:: r_pbc + + + .. py:attribute:: r_data_keys + + .. py:method:: _get_neighbors_pymatgen(atoms: ase.Atoms) Preforms nearest neighbor search and returns edge index, distances, diff --git a/_sources/autoapi/core/scripts/download_large_files/index.rst b/_sources/autoapi/core/scripts/download_large_files/index.rst new file mode 100644 index 0000000000..ec7645e621 --- /dev/null +++ b/_sources/autoapi/core/scripts/download_large_files/index.rst @@ -0,0 +1,40 @@ +core.scripts.download_large_files +================================= + +.. py:module:: core.scripts.download_large_files + + +Attributes +---------- + +.. autoapisummary:: + + core.scripts.download_large_files.S3_ROOT + core.scripts.download_large_files.FILE_GROUPS + core.scripts.download_large_files.args + + +Functions +--------- + +.. autoapisummary:: + + core.scripts.download_large_files.parse_args + core.scripts.download_large_files.download_file_group + + +Module Contents +--------------- + +.. py:data:: S3_ROOT + :value: 'https://dl.fbaipublicfiles.com/opencatalystproject/data/large_files/' + + +.. py:data:: FILE_GROUPS + +.. py:function:: parse_args() + +.. py:function:: download_file_group(file_group) + +.. py:data:: args + diff --git a/_sources/autoapi/core/scripts/index.rst b/_sources/autoapi/core/scripts/index.rst index a6206517f0..f74f19c0d9 100644 --- a/_sources/autoapi/core/scripts/index.rst +++ b/_sources/autoapi/core/scripts/index.rst @@ -28,6 +28,7 @@ Submodules :maxdepth: 1 /autoapi/core/scripts/download_data/index + /autoapi/core/scripts/download_large_files/index /autoapi/core/scripts/gif_maker_parallelized/index /autoapi/core/scripts/make_challenge_submission_file/index /autoapi/core/scripts/make_lmdb_sizes/index diff --git a/_sources/autoapi/core/scripts/make_lmdb_sizes/index.rst b/_sources/autoapi/core/scripts/make_lmdb_sizes/index.rst index 509b6a8a5f..ed3eb1c78b 100644 --- a/_sources/autoapi/core/scripts/make_lmdb_sizes/index.rst +++ b/_sources/autoapi/core/scripts/make_lmdb_sizes/index.rst @@ -24,7 +24,8 @@ Functions .. autoapisummary:: core.scripts.make_lmdb_sizes.get_data - core.scripts.make_lmdb_sizes.main + core.scripts.make_lmdb_sizes.make_lmdb_sizes + core.scripts.make_lmdb_sizes.get_lmdb_sizes_parser Module Contents @@ -32,7 +33,9 @@ Module Contents .. py:function:: get_data(index) -.. py:function:: main(args) -> None +.. py:function:: make_lmdb_sizes(args) -> None + +.. py:function:: get_lmdb_sizes_parser() .. py:data:: parser diff --git a/_sources/autoapi/core/tasks/task/index.rst b/_sources/autoapi/core/tasks/task/index.rst index 624d49b4f0..a966fde2e1 100644 --- a/_sources/autoapi/core/tasks/task/index.rst +++ b/_sources/autoapi/core/tasks/task/index.rst @@ -29,6 +29,9 @@ Module Contents .. py:class:: BaseTask(config) + .. py:attribute:: config + + .. py:method:: setup(trainer) -> None diff --git a/_sources/autoapi/core/trainers/base_trainer/index.rst b/_sources/autoapi/core/trainers/base_trainer/index.rst index fc00fba3f6..f0b299f53a 100644 --- a/_sources/autoapi/core/trainers/base_trainer/index.rst +++ b/_sources/autoapi/core/trainers/base_trainer/index.rst @@ -32,6 +32,41 @@ Module Contents inheritance. + .. py:attribute:: name + + + .. py:attribute:: is_debug + + + .. py:attribute:: cpu + + + .. py:attribute:: epoch + :value: 0 + + + + .. py:attribute:: step + :value: 0 + + + + .. py:attribute:: timestamp_id + :type: str + + + .. py:attribute:: commit_hash + + + .. py:attribute:: logger_name + + + .. py:attribute:: config + + + .. py:attribute:: scaler + + .. py:method:: train(disable_eval_tqdm: bool = False) -> None :abstractmethod: diff --git a/_sources/autoapi/core/trainers/index.rst b/_sources/autoapi/core/trainers/index.rst index 4ff5b010e4..95c8989727 100644 --- a/_sources/autoapi/core/trainers/index.rst +++ b/_sources/autoapi/core/trainers/index.rst @@ -35,6 +35,41 @@ Package Contents inheritance. + .. py:attribute:: name + + + .. py:attribute:: is_debug + + + .. py:attribute:: cpu + + + .. py:attribute:: epoch + :value: 0 + + + + .. py:attribute:: step + :value: 0 + + + + .. py:attribute:: timestamp_id + :type: str + + + .. py:attribute:: commit_hash + + + .. py:attribute:: logger_name + + + .. py:attribute:: config + + + .. py:attribute:: scaler + + .. py:method:: train(disable_eval_tqdm: bool = False) -> None :abstractmethod: diff --git a/_sources/autoapi/data/oc/core/adsorbate/index.rst b/_sources/autoapi/data/oc/core/adsorbate/index.rst index 8df811f63f..bd89aaa290 100644 --- a/_sources/autoapi/data/oc/core/adsorbate/index.rst +++ b/_sources/autoapi/data/oc/core/adsorbate/index.rst @@ -44,6 +44,12 @@ Module Contents :type adsorbate_binding_indices: list + .. py:attribute:: adsorbate_id_from_db + + + .. py:attribute:: adsorbate_db_path + + .. py:method:: __len__() diff --git a/_sources/autoapi/data/oc/core/adsorbate_slab_config/index.rst b/_sources/autoapi/data/oc/core/adsorbate_slab_config/index.rst index eee759052d..122adb5abd 100644 --- a/_sources/autoapi/data/oc/core/adsorbate_slab_config/index.rst +++ b/_sources/autoapi/data/oc/core/adsorbate_slab_config/index.rst @@ -66,6 +66,27 @@ Module Contents :type mode: str + .. py:attribute:: slab + + + .. py:attribute:: adsorbate + + + .. py:attribute:: num_sites + + + .. py:attribute:: num_augmentations_per_site + + + .. py:attribute:: interstitial_gap + + + .. py:attribute:: mode + + + .. py:attribute:: sites + + .. py:method:: get_binding_sites(num_sites: int) Returns up to `num_sites` sites given the surface atoms' positions. diff --git a/_sources/autoapi/data/oc/core/bulk/index.rst b/_sources/autoapi/data/oc/core/bulk/index.rst index bc70d9dbda..f6a3614806 100644 --- a/_sources/autoapi/data/oc/core/bulk/index.rst +++ b/_sources/autoapi/data/oc/core/bulk/index.rst @@ -35,6 +35,12 @@ Module Contents :type bulk_db: List[Dict[str, Any]] + .. py:attribute:: bulk_id_from_db + + + .. py:attribute:: bulk_db_path + + .. py:method:: _get_bulk_from_random(bulk_db) diff --git a/_sources/autoapi/data/oc/core/index.rst b/_sources/autoapi/data/oc/core/index.rst index 993d84a916..353a09352a 100644 --- a/_sources/autoapi/data/oc/core/index.rst +++ b/_sources/autoapi/data/oc/core/index.rst @@ -53,6 +53,12 @@ Package Contents :type adsorbate_binding_indices: list + .. py:attribute:: adsorbate_id_from_db + + + .. py:attribute:: adsorbate_db_path + + .. py:method:: __len__() @@ -119,6 +125,27 @@ Package Contents :type mode: str + .. py:attribute:: slab + + + .. py:attribute:: adsorbate + + + .. py:attribute:: num_sites + + + .. py:attribute:: num_augmentations_per_site + + + .. py:attribute:: interstitial_gap + + + .. py:attribute:: mode + + + .. py:attribute:: sites + + .. py:method:: get_binding_sites(num_sites: int) Returns up to `num_sites` sites given the surface atoms' positions. @@ -241,6 +268,12 @@ Package Contents :type bulk_db: List[Dict[str, Any]] + .. py:attribute:: bulk_id_from_db + + + .. py:attribute:: bulk_db_path + + .. py:method:: _get_bulk_from_random(bulk_db) @@ -325,6 +358,24 @@ Package Contents :type mode: str + .. py:attribute:: slab + + + .. py:attribute:: adsorbates + + + .. py:attribute:: num_sites + + + .. py:attribute:: interstitial_gap + + + .. py:attribute:: mode + + + .. py:attribute:: sites + + .. py:method:: place_adsorbates_on_sites(sites: list, num_configurations: int = 1, interstitial_gap: float = 0.1) Place the adsorbate at the given binding sites. @@ -367,6 +418,24 @@ Package Contents :type min_ab: float + .. py:attribute:: bulk + + + .. py:attribute:: atoms + + + .. py:attribute:: millers + + + .. py:attribute:: shift + + + .. py:attribute:: top + + + .. py:attribute:: oriented_bulk + + .. py:method:: from_bulk_get_random_slab(bulk=None, max_miller=2, min_ab=8.0, save_path=None) :classmethod: diff --git a/_sources/autoapi/data/oc/core/multi_adsorbate_slab_config/index.rst b/_sources/autoapi/data/oc/core/multi_adsorbate_slab_config/index.rst index 5e27e2ba76..236c7c4a74 100644 --- a/_sources/autoapi/data/oc/core/multi_adsorbate_slab_config/index.rst +++ b/_sources/autoapi/data/oc/core/multi_adsorbate_slab_config/index.rst @@ -71,6 +71,24 @@ Module Contents :type mode: str + .. py:attribute:: slab + + + .. py:attribute:: adsorbates + + + .. py:attribute:: num_sites + + + .. py:attribute:: interstitial_gap + + + .. py:attribute:: mode + + + .. py:attribute:: sites + + .. py:method:: place_adsorbates_on_sites(sites: list, num_configurations: int = 1, interstitial_gap: float = 0.1) Place the adsorbate at the given binding sites. diff --git a/_sources/autoapi/data/oc/core/slab/index.rst b/_sources/autoapi/data/oc/core/slab/index.rst index 67567af8c4..ed8ccddf37 100644 --- a/_sources/autoapi/data/oc/core/slab/index.rst +++ b/_sources/autoapi/data/oc/core/slab/index.rst @@ -56,6 +56,24 @@ Module Contents :type min_ab: float + .. py:attribute:: bulk + + + .. py:attribute:: atoms + + + .. py:attribute:: millers + + + .. py:attribute:: shift + + + .. py:attribute:: top + + + .. py:attribute:: oriented_bulk + + .. py:method:: from_bulk_get_random_slab(bulk=None, max_miller=2, min_ab=8.0, save_path=None) :classmethod: diff --git a/_sources/autoapi/data/oc/structure_generator/index.rst b/_sources/autoapi/data/oc/structure_generator/index.rst index 1e5b636c0a..2322866f01 100644 --- a/_sources/autoapi/data/oc/structure_generator/index.rst +++ b/_sources/autoapi/data/oc/structure_generator/index.rst @@ -71,6 +71,21 @@ Module Contents :type adsorbate_index: int + .. py:attribute:: args + + + .. py:attribute:: bulk_index + + + .. py:attribute:: surface_index + + + .. py:attribute:: adsorbate_index + + + .. py:attribute:: logger + + .. py:method:: run() Create adsorbate/bulk/surface objects, generate adslab placements, diff --git a/_sources/autoapi/data/oc/utils/flag_anomaly/index.rst b/_sources/autoapi/data/oc/utils/flag_anomaly/index.rst index 0e71f1b14d..80366126c5 100644 --- a/_sources/autoapi/data/oc/utils/flag_anomaly/index.rst +++ b/_sources/autoapi/data/oc/utils/flag_anomaly/index.rst @@ -17,6 +17,24 @@ Module Contents .. py:class:: DetectTrajAnomaly(init_atoms, final_atoms, atoms_tag, final_slab_atoms=None, surface_change_cutoff_multiplier=1.5, desorption_cutoff_multiplier=1.5) + .. py:attribute:: init_atoms + + + .. py:attribute:: final_atoms + + + .. py:attribute:: final_slab_atoms + + + .. py:attribute:: atoms_tag + + + .. py:attribute:: surface_change_cutoff_multiplier + + + .. py:attribute:: desorption_cutoff_multiplier + + .. py:method:: is_adsorbate_dissociated() Tests if the initial adsorbate connectivity is maintained. diff --git a/_sources/autoapi/data/oc/utils/index.rst b/_sources/autoapi/data/oc/utils/index.rst index f15262ca64..ab6cafa544 100644 --- a/_sources/autoapi/data/oc/utils/index.rst +++ b/_sources/autoapi/data/oc/utils/index.rst @@ -27,6 +27,24 @@ Package Contents .. py:class:: DetectTrajAnomaly(init_atoms, final_atoms, atoms_tag, final_slab_atoms=None, surface_change_cutoff_multiplier=1.5, desorption_cutoff_multiplier=1.5) + .. py:attribute:: init_atoms + + + .. py:attribute:: final_atoms + + + .. py:attribute:: final_slab_atoms + + + .. py:attribute:: atoms_tag + + + .. py:attribute:: surface_change_cutoff_multiplier + + + .. py:attribute:: desorption_cutoff_multiplier + + .. py:method:: is_adsorbate_dissociated() Tests if the initial adsorbate connectivity is maintained. diff --git a/_sources/autoapi/ocpapi/client/client/index.rst b/_sources/autoapi/ocpapi/client/client/index.rst index 1861923d45..34f0856aca 100644 --- a/_sources/autoapi/ocpapi/client/client/index.rst +++ b/_sources/autoapi/ocpapi/client/client/index.rst @@ -57,11 +57,21 @@ Module Contents call the API should be made. + .. py:attribute:: retry_after + :type: datetime.timedelta | None + + .. py:class:: Client(host: str = 'open-catalyst-api.metademolab.com', scheme: str = 'https') Exposes each route in the OCP API as a method. + .. py:attribute:: _host + + + .. py:attribute:: _base_url + + .. py:property:: host :type: str diff --git a/_sources/autoapi/ocpapi/client/index.rst b/_sources/autoapi/ocpapi/client/index.rst index 0ab491515d..7c67a7c936 100644 --- a/_sources/autoapi/ocpapi/client/index.rst +++ b/_sources/autoapi/ocpapi/client/index.rst @@ -64,6 +64,12 @@ Package Contents Exposes each route in the OCP API as a method. + .. py:attribute:: _host + + + .. py:attribute:: _base_url + + .. py:property:: host :type: str @@ -300,6 +306,10 @@ Package Contents call the API should be made. + .. py:attribute:: retry_after + :type: datetime.timedelta | None + + .. py:exception:: RequestException(method: str, url: str, cause: str) Bases: :py:obj:`Exception` diff --git a/_sources/autoapi/ocpapi/index.rst b/_sources/autoapi/ocpapi/index.rst index 35cce3d0b3..81c2c334b2 100644 --- a/_sources/autoapi/ocpapi/index.rst +++ b/_sources/autoapi/ocpapi/index.rst @@ -106,6 +106,12 @@ Package Contents Exposes each route in the OCP API as a method. + .. py:attribute:: _host + + + .. py:attribute:: _base_url + + .. py:property:: host :type: str @@ -342,6 +348,10 @@ Package Contents call the API should be made. + .. py:attribute:: retry_after + :type: datetime.timedelta | None + + .. py:exception:: RequestException(method: str, url: str, cause: str) Bases: :py:obj:`Exception` @@ -1045,6 +1055,10 @@ Package Contents Slabs with other miller indices will be ignored. + .. py:attribute:: _unique_millers + :type: set[tuple[int, int, int]] + + .. py:method:: __call__(adslabs: list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs]) -> list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs] :async: diff --git a/_sources/autoapi/ocpapi/workflows/filter/index.rst b/_sources/autoapi/ocpapi/workflows/filter/index.rst index 2e4678fb30..ee33da7a51 100644 --- a/_sources/autoapi/ocpapi/workflows/filter/index.rst +++ b/_sources/autoapi/ocpapi/workflows/filter/index.rst @@ -33,6 +33,10 @@ Module Contents Slabs with other miller indices will be ignored. + .. py:attribute:: _unique_millers + :type: set[tuple[int, int, int]] + + .. py:method:: __call__(adslabs: list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs]) -> list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs] :async: diff --git a/_sources/autoapi/ocpapi/workflows/index.rst b/_sources/autoapi/ocpapi/workflows/index.rst index 38b47bb99d..9f4e1ecee7 100644 --- a/_sources/autoapi/ocpapi/workflows/index.rst +++ b/_sources/autoapi/ocpapi/workflows/index.rst @@ -284,6 +284,10 @@ Package Contents Slabs with other miller indices will be ignored. + .. py:attribute:: _unique_millers + :type: set[tuple[int, int, int]] + + .. py:method:: __call__(adslabs: list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs]) -> list[fairchem.demo.ocpapi.client.AdsorbateSlabConfigs] :async: diff --git a/_sources/autoapi/ocpapi/workflows/retry/index.rst b/_sources/autoapi/ocpapi/workflows/retry/index.rst index 45b31ddef6..cd01cbaa0f 100644 --- a/_sources/autoapi/ocpapi/workflows/retry/index.rst +++ b/_sources/autoapi/ocpapi/workflows/retry/index.rst @@ -60,6 +60,12 @@ Module Contents amount of time. Otherwise, fall back to the provided default strategy. + .. py:attribute:: _default_wait + + + .. py:attribute:: _rate_limit_logging + + .. py:method:: __call__(retry_state: tenacity.RetryCallState) -> float If a RateLimitExceededException was raised and has a retry_after value, diff --git a/_sources/core/datasets/oc20dense.md b/_sources/core/datasets/oc20dense.md index fb07a09ad0..64639889cc 100644 --- a/_sources/core/datasets/oc20dense.md +++ b/_sources/core/datasets/oc20dense.md @@ -11,7 +11,7 @@ The OC20Dense dataset is a validation dataset which was used to assess model per |ASE Trajectories |29G |112G | [ee937e5290f8f720c914dc9a56e0281f](https://dl.fbaipublicfiles.com/opencatalystproject/data/adsorbml/oc20_dense_trajectories.tar.gz) | The following files are also provided to be used for evaluation and general information: -* `oc20dense_mapping.pkl` : Mapping of the LMDB `sid` to general metadata information - +* `oc20dense_mapping.pkl` : Mapping of the LMDB `sid` to general metadata information. If this file is not present, run the command `python src/fairchem/core/scripts/download_large_files.py adsorbml` from the root of the fairchem repo to download it. - * `system_id`: Unique system identifier for an adsorbate, bulk, surface combination. * `config_id`: Unique configuration identifier, where `rand` and `heur` correspond to random and heuristic initial configurations, respectively. * `mpid`: Materials Project bulk identifier. diff --git a/_sources/core/fine-tuning/fine-tuning-oxides.md b/_sources/core/fine-tuning/fine-tuning-oxides.md index 77a9350d3b..39c39cad40 100644 --- a/_sources/core/fine-tuning/fine-tuning-oxides.md +++ b/_sources/core/fine-tuning/fine-tuning-oxides.md @@ -205,6 +205,7 @@ from fairchem.core.common.tutorial_utils import generate_yml_config yml = generate_yml_config(checkpoint_path, 'config.yml', delete=['slurm', 'cmd', 'logger', 'task', 'model_attributes', 'optim.loss_force', # the checkpoint setting causes an error + 'optim.load_balancing', 'dataset', 'test_dataset', 'val_dataset'], update={'gpus': 1, 'optim.eval_every': 10, diff --git a/_sources/core/install.md b/_sources/core/install.md index 8ad523f326..5eb4569f82 100644 --- a/_sources/core/install.md +++ b/_sources/core/install.md @@ -44,28 +44,28 @@ You can also install `pytorch` and `torch_geometric` dependencies from PyPI to s similarly by selecting the appropriate versions in the official [PyG docs](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html) -## Install fairchem-core +## Standard installation of fairchem-core Install `fairchem-core` from PyPi ```bash pip install fairchem-core ``` -## Additional packages - +### Additional packages `fairchem` is a namespace package, meaning all packages are installed seperately. If you need to install other packages you can do so by: ```bash pip install fairchem-{package-to-install} ``` +Available `fairchem` packages are `fairchem-core`,`fairchem-data-oc`,`fairchem-demo-ocpapi`,`fairchem-applications-cattsunami` -## Development install - +## Development installation If you plan to make contributions you will need to fork and clone (for windows user please see next section) the repo, set up the environment, and install fairchem-core from source in editable mode with dev dependencies, ```bash git clone https://github.com/FAIR-Chem/fairchem.git cd fairchem pip install -e packages/fairchem-core[dev] +pytest tests/core ``` And similarly for any other namespace package: diff --git a/_sources/legacy_tutorials/OCP_Tutorial.md b/_sources/legacy_tutorials/OCP_Tutorial.md index 8b5d4d522a..19fd93f6bc 100644 --- a/_sources/legacy_tutorials/OCP_Tutorial.md +++ b/_sources/legacy_tutorials/OCP_Tutorial.md @@ -1807,7 +1807,7 @@ Similarly, to predict forces, we pass edge features through a fully-connected la @registry.register_model("simple") class SimpleAtomEdgeModel(torch.nn.Module): - def __init__(self, num_atoms, bond_feat_dim, num_targets, emb_size=64, num_radial=64, cutoff=6.0, env_exponent=5): + def __init__(self, emb_size=64, num_radial=64, cutoff=6.0, env_exponent=5): super().__init__() self.radial_basis = RadialBasis( diff --git a/_sources/tutorials/NRR/NRR_example.md b/_sources/tutorials/NRR/NRR_example.md index b69e078d1a..cc5ab6d074 100644 --- a/_sources/tutorials/NRR/NRR_example.md +++ b/_sources/tutorials/NRR/NRR_example.md @@ -62,7 +62,7 @@ To do this, we will enumerate adsorbate-slab configurations and run ML relaxatio +++ -Be sure to set the path in `fairchem/data/oc/configs/paths.py` to point to the correct place or pass the paths as an argument. The database pickles can be found in `fairchem/data/oc/databases/pkls`. We will show one explicitly here as an example and then run all of them in an automated fashion for brevity. +Be sure to set the path in `fairchem/data/oc/configs/paths.py` to point to the correct place or pass the paths as an argument. The database pickles can be found in `fairchem/data/oc/databases/pkls` (some pkl files are only downloaded by running the command `python src/fairchem/core/scripts/download_large_files.py oc` from the root of the fairchem repo). We will show one explicitly here as an example and then run all of them in an automated fashion for brevity. ```{code-cell} ipython3 import fairchem.data.oc diff --git a/_sources/tutorials/advanced/fine-tuning-in-python.md b/_sources/tutorials/advanced/fine-tuning-in-python.md index 1d14219c88..0eeb8e5485 100644 --- a/_sources/tutorials/advanced/fine-tuning-in-python.md +++ b/_sources/tutorials/advanced/fine-tuning-in-python.md @@ -75,7 +75,7 @@ We start by making the config.yml. We build this from the calculator checkpoint. from fairchem.core.common.tutorial_utils import generate_yml_config yml = generate_yml_config(checkpoint_path, 'config.yml', - delete=['slurm', 'cmd', 'logger', 'task', 'model_attributes', + delete=['slurm', 'cmd', 'logger', 'task', 'model_attributes','optim.load_balancing', 'optim.loss_force', # the checkpoint setting causes an error 'dataset', 'test_dataset', 'val_dataset'], update={'gpus': 1, diff --git a/_sphinx_design_static/sphinx-design.min.css b/_sphinx_design_static/sphinx-design.min.css index a325746f2e..860c36da0f 100644 --- a/_sphinx_design_static/sphinx-design.min.css +++ b/_sphinx_design_static/sphinx-design.min.css @@ -1 +1 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em .6em .5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/_static/sphinx-design.min.css b/_static/sphinx-design.min.css index a325746f2e..860c36da0f 100644 --- a/_static/sphinx-design.min.css +++ b/_static/sphinx-design.min.css @@ -1 +1 @@ -.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em .6em .5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/autoapi/adsorbml/2023_neurips_challenge/challenge_eval/index.html b/autoapi/adsorbml/2023_neurips_challenge/challenge_eval/index.html index 271409b267..7551c88879 100644 --- a/autoapi/adsorbml/2023_neurips_challenge/challenge_eval/index.html +++ b/autoapi/adsorbml/2023_neurips_challenge/challenge_eval/index.html @@ -35,7 +35,7 @@ - + @@ -316,6 +316,7 @@
  • core.datasets.embeddings
  • core.datasets._utils
  • core.datasets.ase_datasets
  • +
  • core.datasets.base_dataset
  • core.datasets.lmdb_database
  • core.datasets.lmdb_dataset
  • core.datasets.oc22_lmdb_dataset
  • @@ -354,6 +355,7 @@
  • core.scripts