From a031c32559a7b556e621332aadae8009db24147a Mon Sep 17 00:00:00 2001 From: richard gowers Date: Tue, 7 May 2024 11:06:18 +0100 Subject: [PATCH] remove AtomMappingScorer references for now will still ducktype fine this isn't in a released gufe, so can't use (yet) --- src/konnektor/network_planners/NetworkPlanner.py | 4 ++-- .../concatenator/_abstract_network_concatenator.py | 4 ++-- .../network_planners/concatenator/mst_concatenator.py | 4 ++-- .../generators/cyclic_network_planner.py | 4 ++-- .../generators/heuristic_maximal_network_planner.py | 4 ++-- .../generators/maximal_network_planner.py | 4 ++-- .../minimal_spanning_tree_network_planner.py | 4 ++-- .../generators/n_node_edges_network_planner.py | 4 ++-- ...redundant_minimal_spanning_tree_network_planner.py | 4 ++-- .../generators/star_network_planner.py | 4 ++-- .../generators/two_dimensional_network_planners.py | 6 +++--- src/konnektor/tests/test_toy_data.py | 6 +++--- src/konnektor/utils/toy_data.py | 11 +++++++---- 13 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/konnektor/network_planners/NetworkPlanner.py b/src/konnektor/network_planners/NetworkPlanner.py index 16deec3..f79255a 100644 --- a/src/konnektor/network_planners/NetworkPlanner.py +++ b/src/konnektor/network_planners/NetworkPlanner.py @@ -2,7 +2,7 @@ import logging from typing import Iterable -from gufe import AtomMapper, AtomMappingScorer +from gufe import AtomMapper from gufe import LigandNetwork, Component log = logging.getLogger(__name__) @@ -12,7 +12,7 @@ class NetworkPlanner(abc.ABC): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer): + def __init__(self, mapper: AtomMapper, scorer): """This class is an implementation for the LigandNetworkPlanner interface. It defines the std. class for a Konnektor LigandNetworkPlanner diff --git a/src/konnektor/network_planners/concatenator/_abstract_network_concatenator.py b/src/konnektor/network_planners/concatenator/_abstract_network_concatenator.py index 4735465..2654c80 100644 --- a/src/konnektor/network_planners/concatenator/_abstract_network_concatenator.py +++ b/src/konnektor/network_planners/concatenator/_abstract_network_concatenator.py @@ -2,7 +2,7 @@ import logging from typing import Iterable -from gufe import AtomMapper, AtomMappingScorer +from gufe import AtomMapper from gufe import LigandNetwork, Component from .._networkx_implementations._abstract_network_generator import _AbstractNetworkGenerator @@ -15,7 +15,7 @@ class NetworkConcatenator(NetworkPlanner): progress: bool = False nprocesses: int - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, + def __init__(self, mapper: AtomMapper, scorer, network_generator: _AbstractNetworkGenerator, nprocesses: int = 1, _initial_edge_lister=None): diff --git a/src/konnektor/network_planners/concatenator/mst_concatenator.py b/src/konnektor/network_planners/concatenator/mst_concatenator.py index 2e693e3..19454ae 100644 --- a/src/konnektor/network_planners/concatenator/mst_concatenator.py +++ b/src/konnektor/network_planners/concatenator/mst_concatenator.py @@ -2,7 +2,7 @@ import logging from typing import Iterable -from gufe import AtomMapper, AtomMappingScorer, LigandNetwork +from gufe import AtomMapper, LigandNetwork from ._abstract_network_concatenator import NetworkConcatenator from .._networkx_implementations import MstNetworkGenerator @@ -12,7 +12,7 @@ # Todo: check this algorithm again class MstConcatenate(NetworkConcatenator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, n_connecting_edges: int = 3, nprocesses: int = 1): + def __init__(self, mapper: AtomMapper, scorer, n_connecting_edges: int = 3, nprocesses: int = 1): """ This concatenator is connnecting two Networks with a kruskal like approach up to the number of connecting edges. diff --git a/src/konnektor/network_planners/generators/cyclic_network_planner.py b/src/konnektor/network_planners/generators/cyclic_network_planner.py index d4daaff..a7338c5 100644 --- a/src/konnektor/network_planners/generators/cyclic_network_planner.py +++ b/src/konnektor/network_planners/generators/cyclic_network_planner.py @@ -1,6 +1,6 @@ from typing import Union, List, Iterable -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper from konnektor.network_planners._networkx_implementations import CyclicNetworkGenerator as nx_CNG from ._abstract_network_generator import NetworkGenerator @@ -11,7 +11,7 @@ class CyclicNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, + def __init__(self, mapper: AtomMapper, scorer, node_present_in_cycles: int = 2, cycle_sizes: Union[int, List[int]] = 3, nprocesses: int = 1, _initial_edge_lister: NetworkGenerator = None): """ diff --git a/src/konnektor/network_planners/generators/heuristic_maximal_network_planner.py b/src/konnektor/network_planners/generators/heuristic_maximal_network_planner.py index 14b19dc..506c423 100644 --- a/src/konnektor/network_planners/generators/heuristic_maximal_network_planner.py +++ b/src/konnektor/network_planners/generators/heuristic_maximal_network_planner.py @@ -3,7 +3,7 @@ from typing import Iterable import numpy as np -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper from tqdm.auto import tqdm from ._abstract_network_generator import NetworkGenerator @@ -12,7 +12,7 @@ #Todo: is graph connectivity ensured? class HeuristicMaximalNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, n_samples: int = 100, progress: bool = False, + def __init__(self, mapper: AtomMapper, scorer, n_samples: int = 100, progress: bool = False, nprocesses: int = 1): """ The Heuristic Maximal Network planner builds for given set of compounds a set of edges per node build graph under the assumption each component can be connected to another. diff --git a/src/konnektor/network_planners/generators/maximal_network_planner.py b/src/konnektor/network_planners/generators/maximal_network_planner.py index 501b6dd..9a55861 100644 --- a/src/konnektor/network_planners/generators/maximal_network_planner.py +++ b/src/konnektor/network_planners/generators/maximal_network_planner.py @@ -2,7 +2,7 @@ import itertools from typing import Iterable -from gufe import AtomMapper, AtomMappingScorer +from gufe import AtomMapper from gufe import LigandNetwork, Component from tqdm.auto import tqdm @@ -11,7 +11,7 @@ class MaximalNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, progress: bool = False, nprocesses: int = 1): + def __init__(self, mapper: AtomMapper, scorer, progress: bool = False, nprocesses: int = 1): """ The Maximal Network planner builds for given set of compounds a fully connected graph under the assumption each component can be connected to another. The edges of this graph are realized as atom mappings of pairwise components. If not all mappings can be created, it will ignore the mapping failure, and return a nearly fully connected graph. diff --git a/src/konnektor/network_planners/generators/minimal_spanning_tree_network_planner.py b/src/konnektor/network_planners/generators/minimal_spanning_tree_network_planner.py index 0bf43a0..871a5f3 100644 --- a/src/konnektor/network_planners/generators/minimal_spanning_tree_network_planner.py +++ b/src/konnektor/network_planners/generators/minimal_spanning_tree_network_planner.py @@ -1,6 +1,6 @@ from typing import Iterable -from gufe import LigandNetwork, Component, AtomMapper, AtomMappingScorer +from gufe import LigandNetwork, Component, AtomMapper from konnektor.network_planners._networkx_implementations import MstNetworkGenerator from ._abstract_network_generator import NetworkGenerator @@ -9,7 +9,7 @@ class MinimalSpanningTreeNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, + def __init__(self, mapper: AtomMapper, scorer, nprocesses: int = 1, _initial_edge_lister: NetworkGenerator = None): """ The minimal spanning tree ligand network planner, builds an MST for a given set of ligands. The edges of the the graph, diff --git a/src/konnektor/network_planners/generators/n_node_edges_network_planner.py b/src/konnektor/network_planners/generators/n_node_edges_network_planner.py index c4abc23..5e07d77 100644 --- a/src/konnektor/network_planners/generators/n_node_edges_network_planner.py +++ b/src/konnektor/network_planners/generators/n_node_edges_network_planner.py @@ -1,6 +1,6 @@ from typing import Iterable -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper from konnektor.network_planners._networkx_implementations import NNodeEdgesNetworkGenerator from ._abstract_network_generator import NetworkGenerator @@ -9,7 +9,7 @@ class NNodeEdgesNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, + def __init__(self, mapper: AtomMapper, scorer, target_node_connectivity: int = 3, nprocesses: int = 1, _initial_edge_lister: NetworkGenerator = None): diff --git a/src/konnektor/network_planners/generators/redundant_minimal_spanning_tree_network_planner.py b/src/konnektor/network_planners/generators/redundant_minimal_spanning_tree_network_planner.py index df1e061..5c6329c 100644 --- a/src/konnektor/network_planners/generators/redundant_minimal_spanning_tree_network_planner.py +++ b/src/konnektor/network_planners/generators/redundant_minimal_spanning_tree_network_planner.py @@ -1,6 +1,6 @@ from typing import Iterable -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper from konnektor.network_planners._networkx_implementations import MstNetworkGenerator from ._abstract_network_generator import NetworkGenerator @@ -9,7 +9,7 @@ class RedundantMinimalSpanningTreeNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, n_redundancy: int = 2, nprocesses: int = 1, + def __init__(self, mapper: AtomMapper, scorer, n_redundancy: int = 2, nprocesses: int = 1, _initial_edge_lister: NetworkGenerator = None): """Plan a Network which connects all ligands n times with minimal cost. This planner uses n_redundancy times the MST algorithm on the full diff --git a/src/konnektor/network_planners/generators/star_network_planner.py b/src/konnektor/network_planners/generators/star_network_planner.py index c7c6753..ffc3a05 100644 --- a/src/konnektor/network_planners/generators/star_network_planner.py +++ b/src/konnektor/network_planners/generators/star_network_planner.py @@ -1,6 +1,6 @@ from typing import Iterable -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper from konnektor.network_planners._networkx_implementations import RadialNetworkGenerator from ._abstract_network_generator import NetworkGenerator @@ -9,7 +9,7 @@ class StarNetworkGenerator(NetworkGenerator): - def __init__(self, mapper: AtomMapper, scorer: AtomMappingScorer, + def __init__(self, mapper: AtomMapper, scorer, nprocesses: int = 1, _initial_edge_lister: NetworkGenerator = None): """ The Star Ligand Network Planner or Radial Ligand Network Planner, set's one ligand into the center of a graph and connects all other ligands to it. diff --git a/src/konnektor/network_planners/generators/two_dimensional_network_planners.py b/src/konnektor/network_planners/generators/two_dimensional_network_planners.py index 1fac48f..6bfa41e 100644 --- a/src/konnektor/network_planners/generators/two_dimensional_network_planners.py +++ b/src/konnektor/network_planners/generators/two_dimensional_network_planners.py @@ -4,7 +4,7 @@ from tqdm import tqdm from typing import Iterable -from gufe import Component, LigandNetwork, AtomMapper, AtomMappingScorer +from gufe import Component, LigandNetwork, AtomMapper # Clustering from scikit_mol.fingerprints import RDKitFingerprintTransformer, MorganFingerprintTransformer @@ -29,7 +29,7 @@ def __init__(self, concatenator: MstConcatenate = MstConcatenate, clusterer: ComponentsDiversityClustering = ComponentsDiversityClustering( featurize=RDKitFingerprintTransformer(), cluster=KMeans(n_clusters=3)), - mapper: AtomMapper = None, scorer: AtomMappingScorer = None, + mapper: AtomMapper = None, scorer = None, nprocesses: int = 1, progress: bool = False ): ''' Implements the general concept of multidimensional networks. @@ -150,7 +150,7 @@ def __init__(self, clusterer: ComponentsDiversityClustering = ComponentsDiversityClustering( featurize=MorganFingerprintTransformer(), cluster=HDBSCAN(metric="jaccard", min_cluster_size=3, alpha=1/2048)), mapper: AtomMapper = None, - scorer: AtomMappingScorer = None, + scorer = None, nprocesses: int = 1, progress: bool = False ): ''' The StarrySkyNetworkGenerator is an advanced network algorithm, diff --git a/src/konnektor/tests/test_toy_data.py b/src/konnektor/tests/test_toy_data.py index d7eedfa..4fa6f70 100644 --- a/src/konnektor/tests/test_toy_data.py +++ b/src/konnektor/tests/test_toy_data.py @@ -3,7 +3,7 @@ from rdkit import Chem from rdkit.Chem import AllChem -from gufe import AtomMapper, AtomMapping, AtomMappingScorer, SmallMoleculeComponent, LigandNetwork +from gufe import AtomMapper, AtomMapping, SmallMoleculeComponent, LigandNetwork from konnektor.utils.toy_data import genMapper, genScorer, build_random_dataset, build_random_mst_network, build_random_fully_connected_network def test_genMapper(): @@ -28,7 +28,7 @@ def test_genScorer(): n_scores = 10 scorer = genScorer(n_scores=n_scores, rand_seed=42) - assert isinstance(scorer, AtomMappingScorer) + # assert isinstance(scorer, AtomMappingScorer) assert len(scorer.vals) ==n_scores assert scorer.i == 0 @@ -67,7 +67,7 @@ def test_build_random_dataset(): assert len(compounds) == n_compounds assert all(isinstance(c, SmallMoleculeComponent) for c in compounds) assert isinstance(mapper, AtomMapper) - assert isinstance(scorer, AtomMappingScorer) + # assert isinstance(scorer, AtomMappingScorer) assert len(scorer.vals) == n_compounds def test_build_random_mst_network(): diff --git a/src/konnektor/utils/toy_data.py b/src/konnektor/utils/toy_data.py index 861bdc6..7229e44 100644 --- a/src/konnektor/utils/toy_data.py +++ b/src/konnektor/utils/toy_data.py @@ -4,7 +4,7 @@ from rdkit.Chem import AllChem from gufe import SmallMoleculeComponent, LigandNetwork -from gufe import LigandAtomMapping, AtomMapper, AtomMappingScorer, AtomMapping +from gufe import LigandAtomMapping, AtomMapper, AtomMapping import numpy as np @@ -32,7 +32,7 @@ def _to_dict(self): return vars(self) -class genScorer(AtomMappingScorer): +class genScorer: # (AtomMappingScorer): def __init__(self, n_scores: int, rand_seed: int = None): """ Builds a scorer that contains a predefined sequence of scores, n_scores long and each score is initially randomly uniformly picked between 1 and 0. @@ -54,6 +54,10 @@ def __init__(self, n_scores: int, rand_seed: int = None): self.n_scores = n_scores self.i = 0 + def __call__(self, mapping): + # todo: remove once subclassed from gufe + return self.get_score(mapping) + def get_score(self, mapping: AtomMapping) -> float: """ return the score, at position self.i @@ -74,8 +78,7 @@ def get_score(self, mapping: AtomMapping) -> float: return v -def build_random_dataset(n_compounds: int = 20, rand_seed: int = None) -> ( - Iterable[SmallMoleculeComponent], AtomMapper, AtomMappingScorer): +def build_random_dataset(n_compounds: int = 20, rand_seed: int = None): """ This function builds a random dataset of n_compounds artificial molecules. Additionally the generic scorer and mapper matching the compounds is returned.