|
from abc import ABC, abstractmethod |
|
from typing import TypeAlias |
|
|
|
import numpy as np |
|
import torch |
|
|
|
from tianshou.highlevel.env import Environments |
|
|
|
TDevice: TypeAlias = str | torch.device |
|
|
|
|
|
def init_linear_orthogonal(module: torch.nn.Module) -> None: |
|
"""Applies orthogonal initialization to linear layers of the given module and sets bias weights to 0. |
|
|
|
:param module: the module whose submodules are to be processed |
|
""" |
|
for m in module.modules(): |
|
if isinstance(m, torch.nn.Linear): |
|
torch.nn.init.orthogonal_(m.weight, gain=np.sqrt(2)) |
|
torch.nn.init.zeros_(m.bias) |
|
|
|
|
|
class ModuleFactory(ABC): |
|
"""Represents a factory for the creation of a torch module given an environment and target device.""" |
|
|
|
@abstractmethod |
|
def create_module(self, envs: Environments, device: TDevice) -> torch.nn.Module: |
|
pass |
|
|