diff --git a/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt b/_downloads/5fdddbed2260616231dbf7b0d94bb665/train.txt index b5f50493..4123fb3d 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 f75e6178..e0229873 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 7af3e28e..dd3a7168 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 a050e042..bbf9036f 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 ed87b0b1..764972c8 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 f7f52399..5eac3c95 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 1d3b1fb6..cd227b74 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 a08b4245..23028b09 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 81823ad9..869c9263 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 420bb15b..a41657e0 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 2b7c552e..c1d9af27 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 ab7212b9..975cde5f 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 8cfba4ec..52a7112a 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 00000000..1ddedcd0 --- /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 057404a2..34a7b2c5 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 8bb8e266..1c5f256c 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 49153c45..838e0ee7 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 191570ac..770cbff8 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 1560f650..c4257651 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 2e662dfa..09634fbd 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 902e99d3..20404a62 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 07e19be1..d6026b0f 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 00000000..418930d5 --- /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 7287a4c2..00000000 --- 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 0bea0d12..f2e361a3 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 a68c0554..6e37fd57 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 aa809544..298aedd8 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 9230d310..f0c2a24a 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 1b0d6167..b70be5dc 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 53ef0e49..3e7f63a3 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 9d33988b..743a7c13 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 5d10923e..8e628b2d 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 5c8c83e9..52931c69 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 f76a094c..8ea081b6 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 802e5d21..136fcbc3 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 8e4f0f2b..875e7791 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 93b0061d..1e85e54c 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 7355afe7..f09b49d1 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 fcb24cb9..70cbf598 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 98951275..492a56d5 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 6ecb05b7..0def6a7e 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 c35b1bdf..3beaad0f 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 46249b99..f5a3f2ad 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 e9211aad..6f670adc 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 d48c0d4c..682482ba 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 b842cdbb..8b122ad3 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 f994d528..bfe2f7cc 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 b41eb5aa..e5378365 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 eff4ac32..20f84a83 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 10814968..236fc089 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 c4c4fc4a..119f9625 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 611592f9..639a5044 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 3521b74f..9158a1c8 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 c0b2cf84..2df2df7d 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 6e2a117a..a10be21b 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 ba03b699..a3fedc04 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 e5bcf33e..5091731b 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 51a972e9..8aecd00f 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 88c9e018..778e5a21 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 e9790b9c..1953a18c 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 e62bd676..6f89ffa6 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 d4195994..f67f56d2 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 a5631785..3a19e9c9 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 de5b7086..b023020b 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 16f22a58..5cfd361a 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 8461daa3..2c1f3791 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 151abaac..9d5c5506 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 c3ca2736..b25ccdc7 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 c2b25df4..31ca3f6c 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 f48f2e0b..fc452350 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 e6762b92..3e906893 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 3a387b2a..f8d93e39 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 07ea490f..4bdd0269 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 2a4c7417..db63d8a3 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 f3f92522..68e8a9d6 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 a0c90bb2..a7a1855f 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 62a57282..fd75d0d7 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 13b903dc..5dae6fb4 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 701e3455..3dfced6e 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 e3d61265..b14c9f88 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 8b2f5928..8fb3e417 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 98cf6f1f..fc2b7c81 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 00000000..ec7645e6 --- /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 a6206517..f74f19c0 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 509b6a8a..ed3eb1c7 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 624d49b4..a966fde2 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 fc00fba3..f0b299f5 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 4ff5b010..95c89897 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 8df811f6..bd89aaa2 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 eee75905..122adb5a 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 bc70d9db..f6a36148 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 993d84a9..353a0935 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 5e27e2ba..236c7c4a 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 67567af8..ed8ccddf 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 1e5b636c..2322866f 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 0e71f1b1..80366126 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 f15262ca..ab6cafa5 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 1861923d..34f0856a 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 0ab49151..7c67a7c9 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 35cce3d0..81c2c334 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 2e4678fb..ee33da7a 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 38b47bb9..9f4e1ece 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 45b31dde..cd01cbaa 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 fb07a09a..64639889 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 77a9350d..39c39cad 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 8ad523f3..5eb4569f 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 8b5d4d52..19fd93f6 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 b69e078d..cc5ab6d0 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 1d14219c..0eeb8e54 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 a325746f..860c36da 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 a325746f..860c36da 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 271409b2..7551c888 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