File size: 1,550 Bytes
189e0ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
"""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']