The first sub-package, molscore, handles how to score de novo molecules. It is a collection of scoring functions, diversity filters, transformation functions and aggregation functions that can be used interchangeably, all managed by a central module manager.py (see Figure ). This module contains a python class called MolScore that is initialised with a configuration file defining how to score molecules. Once initialised, it takes as input a list of molecules (in SMILES representation) and returns a list of their respective scores as output, designed to be repeated in an iterative fashion (e.g., steps/epochs) over the course of a run. During each iteration, several intermediate steps are taken, as visualised in Figure . First, molecules are parsed to check for validity (by parsing with RDKit), their SMILES are canonicalized and intrabatch uniqueness is checked. Inter-batch molecule uniqueness is then cross-referenced with previously generated molecules within the run and if the molecule was previously generated its previous score can be reused. This can save valuable time if long-running scoring functions are being used (for example, molecular docking) and if a generative model is susceptible to generating the same molecules multiple times. User-defined scoring function(s) are run only for valid and unique molecules with invalid molecules being assigned scores of 0 and duplicated molecules being assigned their score from a single unique representative. Scores returned by any scoring functions run are then transformed and aggregated according to the user definition and diversity filters applied to penalise the final score of non-diverse molecules, if chosen. The final results are then added to the run record. In addition, a CSV file is output for each iteration in the run, allowing a GUI to analyse intermediate results during the course of a run. Finally, when the run has concluded, a CSV file is written to the output directory with a full record of molecules generated and their respective scores.