scFM-dataselection / tools /_native_ssl.py
lcrawford's picture
Copilot
Add paper checkpoints and PCA components
189e0ad verified
Raw History Blame Contribute Delete
1.55 kB
"""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']