"""Native SSL class loading extracted from the fully validated preparation code.""" import ast import os import pickle def native_ssl_class(resources): import abc import gc import importlib.util import typing import lightning.pytorch as pl import numpy as np import torch import torch.nn as nn import torch.nn.functional as functional from torchmetrics import ExplainedVariance, MeanSquaredError, MetricCollection base_file = resources / 'ssl-source/base.py' spec = importlib.util.spec_from_file_location('pinned_ssl_base', base_file) base = importlib.util.module_from_spec(spec) spec.loader.exec_module(base) autoencoder_file = resources / 'ssl-source/cellnet_autoencoder.py' parsed = ast.parse(autoencoder_file.read_text()) classes = {node.name: node for node in parsed.body if isinstance(node, ast.ClassDef)} namespace = {'__name__': 'pinned_ssl_autoencoder', '__file__': str(autoencoder_file), 'abc': abc, 'gc': gc, 'os': os, 'pickle': pickle, 'np': np, 'torch': torch, 'nn': nn, 'F': functional, 'pl': pl, 'MLP': base.MLP, 'ExplainedVariance': ExplainedVariance, 'MeanSquaredError': MeanSquaredError, 'MetricCollection': MetricCollection} namespace.update({name: getattr(typing, name) for name in ('Callable', 'Dict', 'List', 'Optional', 'Tuple')}) executable = ast.Module(body=[classes['BaseAutoEncoder'], classes['MLPAutoEncoder']], type_ignores=[]) exec(compile(executable, str(autoencoder_file), 'exec'), namespace) return namespace['MLPAutoEncoder']