diff --git a/CLAUDE.md b/CLAUDE.md index 453392f2..7de9cf8f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Project Overview -`tfscreen` is a Python library for simulating and analyzing high-throughput screens of transcription factor (TF) libraries. It models bacterial growth in plasmid-based libraries where TFs regulate selection markers (antibiotic resistance or pheS/4CP). The core analysis is a hierarchical Bayesian model (JAX/Numpyro) that infers per-genotype TF activity from growth data. +`tfscreen` is a Python library for simulating and analyzing high-throughput screens of transcription factor (TF) libraries. It models bacterial growth in plasmid-based libraries where TFs regulate selection markers (antibiotic resistance or pheS/4CP). The core analysis is a hierarchical Bayesian model (JAX/Numpyro) that infers per-genotype TF operator occupancy from growth data. ## Commands @@ -42,11 +42,12 @@ flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 ``` tfs-process-fastq # FASTQ → read counts tfs-process-counts # counts → ln_cfu DataFrames +tfs-process-presplit # Process pre-split count files tfs-configure-model # Generate YAML config template tfs-prefit-calibration # Pre-fit linking function via MAP tfs-fit-model # Main hierarchical Bayesian inference tfs-sample-posterior # Draw posterior samples from fitted model -tfs-param-quantiles # Summarize posterior parameter quantiles +tfs-sample-prior # Draw prior predictive samples tfs-extract-params # Extract parameters from checkpoint tfs-predict-growth # Predict growth from fitted model tfs-predict-theta # Predict operator occupancy @@ -56,6 +57,8 @@ tfs-simulate # Simulate a full experiment tfs-setup-sim-grid # Set up grid of simulation runs tfs-setup-grid # Set up grid of model configs tfs-summarize-grid # Summarize grid results +tfs-summarize-fit # Summarize a fitted model +tfs-summarize-sbc # Summarize simulation-based calibration runs tfs-subset-genotypes # Subset genotype data ``` @@ -65,10 +68,13 @@ tfs-subset-genotypes # Subset genotype data ``` FASTQ files → tfs-process-fastq → counts CSV - → tfs-process-counts → ln_cfu DataFrame - → tfs-fit-model (with run_config.yaml) → posteriors (HDF5 + pkl) - → tfs-summarize-posteriors → summary CSV - → tfs-predict → predictions CSV + → tfs-process-counts → ln_cfu DataFrame (CSV) + → tfs-fit-model (with config YAML) → checkpoint .pkl (MAP/SVI) + → tfs-sample-posterior → posterior samples .h5 + → tfs-predict-growth → growth predictions CSV + → tfs-predict-theta → theta predictions CSV + → tfs-extract-params → per-parameter CSVs + → tfs-summarize-fit → summary plots/CSVs ``` ### Source Layout (`src/tfscreen/`) @@ -76,13 +82,17 @@ FASTQ files | Module | Responsibility | |--------|---------------| | `tfmodel/` | Core hierarchical Bayesian inference engine (the heart of the package) | +| `tfmodel/generative/` | Numpyro model definition, component registry, pluggable components | +| `tfmodel/inference/` | JAX/Numpyro sampling, MAP estimation, checkpoint I/O, posteriors | +| `tfmodel/tensors/` | Ragged-tensor management, JAX array population | +| `tfmodel/analysis/` | Prediction, parameter extraction, error calibration, prior predictive | | `process_raw/` | FASTQ parsing, count normalization, ln_cfu calculation | | `simulate/` | Full experiment simulation from thermodynamics to read counts | -| `simulate/thermo/` | Thermodynamic models (lac, EEE) used by simulation | -| `simulate/growth/` | In-progress growth/growth-transition models for simulation | +| `simulate/growth/` | Growth/growth-transition linkage models for simulation | | `analysis/` | Downstream statistical analysis of inference outputs (cat_response, extract_epistasis) | | `mle/` | General-purpose MLE regression (FitManager, least squares, WLS, NLS) | | `mle/curve_models/` | Empirical curve-fitting functions and MODEL_LIBRARY used by cat_response | +| `mle/fitters/` | Low-level fitter implementations (least_squares, matrix_nls, matrix_wls) | | `genetics/` | Genotype library management, mutation effect combination | | `plot/` | Visualization (heatmaps, corner plots, error plots) | | `util/` | Shared IO, DataFrame ops, numerical helpers, validation, CLI | @@ -91,39 +101,42 @@ FASTQ files The hierarchical Bayesian inference engine. Key files: -- **`model.py`** — Numpyro probabilistic model definition. The generative model is: +- **`generative/model.py`** — Numpyro probabilistic model definition. The generative model is: `ln_cfu = ln_cfu0 + (k_pre + dk_geno + m_pre·A·θ)·t_pre + (k_sel + dk_geno + m_sel·A·θ)·t_sel` where θ = operator occupancy, A = per-genotype TF activity, dk_geno = pleiotropic growth effect. -- **`model_class.py`** — `TFModel`: top-level class orchestrating data loading, inference, and prediction. +- **`model_orchestrator.py`** — `ModelOrchestrator`: top-level class orchestrating data loading, inference, and prediction. -- **`run_inference.py`** — `RunInference`: coordinates JAX/Numpyro sampling (NUTS) and MAP estimation (optax). +- **`inference/run_inference.py`** — `RunInference`: coordinates JAX/Numpyro sampling (SVI or NUTS) and MAP estimation (optax). -- **`tensor_manager.py`** — `TensorManager`: maps ragged per-genotype observations into JAX-compatible tensors. +- **`tensors/tensor_manager.py`** — `TensorManager`: maps ragged per-genotype observations into JAX-compatible tensors. -- **`registry.py`** — `model_registry` dict mapping component names to module implementations. This is where all swappable components are registered. +- **`generative/registry.py`** — `model_registry` dict mapping component names to module implementations. This is where all swappable components are registered. -- **`components/`** — Pluggable model components selected via YAML config: - - `activity/`: `fixed`, `hierarchical`, `horseshoe` - - `growth/`: `linear`, `linear_independent`, `linear_fixed`, `power`, `saturation` - - `growth_transition/`: `instant`, `memory`, `baranyi` +- **`generative/components/`** — Pluggable model components selected via YAML config: + - `activity/`: `fixed`, `hierarchical_geno`, `hierarchical_mut`, `horseshoe_geno`, `horseshoe_mut` + - `growth/`: `linear`, `power`, `saturation` + - `growth_transition/`: `instant`, `memory`, `baranyi`, `baranyi_k`, `baranyi_tau`, `two_pop` - `transformation/`: `empirical`, `logit_norm`, `single` - - `theta/`: `categorical`, `hill` - - `dk_geno/`: `fixed`, `hierarchical` - - `noise/`: `zero`, `beta` + - `theta/`: `categorical_geno`, `hill_geno`, `hill_mut`; thermodynamic partition-function variants under `theta/thermo/` (lac dimer and MWC dimer, with/without unfolded state, PK/PnnC/PddG parameterizations) + - `theta_rescale/`: `passthrough`, `logit` + - `dk_geno/`: `fixed`, `hierarchical_geno` + - `noise/`: `zero`, `beta`, `logit_normal` (theta observation noise) + - `growth_noise/`: `zero`, `normal_kt` + - `ln_cfu0/`: `hierarchical`, `hierarchical_factored` + - `sample_offset/`: `zero`, `normal` + - `observe/`: `binding`, `growth` (observation likelihood layers) ### Adding a New Model Component -1. Create `src/tfscreen/tfmodel/components//myname.py` +1. Create `src/tfscreen/tfmodel/generative/components//myname.py` 2. Implement the required interface (follow an existing component as reference) -3. Register it in `registry.py` under the appropriate category key +3. Register it in `tfmodel/generative/registry.py` under the appropriate category key 4. Add a test in `tests/tfscreen/tfmodel/components//` ### Key Abstractions -**`FitManager`** (`mle/fit_manager.py`): General regression wrapper. Set parameter transformations, bounds, fixed vs. free parameters, and a model function via `set_model_func()`. - -**`TensorManager`** (`tfmodel/tensor_manager.py`): Handles ragged tensors. Genotypes have different numbers of observations; this class pads and indexes into JAX-compatible arrays. +**`TensorManager`** (`tfmodel/tensors/tensor_manager.py`): Handles ragged tensors. Genotypes have different numbers of observations; this class pads and indexes into JAX-compatible arrays. **`DataClass` / `PriorsClass`** (`tfmodel/data_class.py`): Flax pytree dataclasses holding structured experimental data and prior specifications for JAX compilation. @@ -193,6 +206,9 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/binding_params.py` | CSV reading (with theta clipping), per-component override builders, binding theta assemblers | | `simulate/sample_theta.py` | `sample_theta_prior` (prior-predictive) and `sample_theta_stratified` (greedy maximin) | | `simulate/sim_data_class.py` | `SimData` container and `build_sim_data` factory | +| `simulate/build_sample_dataframes.py` | Constructs sample/timepoint DataFrames from simulation config | +| `simulate/selection_experiment.py` | Models the selection experiment (growth + sequencing) | +| `simulate/run_simulation.py` | End-to-end simulation runner called by `tfs-simulate` | ## YAML Standards @@ -263,23 +279,26 @@ Both grid CLIs import from `tfscreen.util.grid_utils` for run-name generation, J | `simulate/simulate_config.yaml` | Canonical well-commented simulate config reference | | `simulate/simulate_grid.yaml` | Example simulate grid for `tfs-setup-sim-grid` | | `simulate/run.sh` | Jinja2 shell template rendered into each simulate grid run subdir | +| `simulate-and-analyze/simulate_config.yaml` | Combined simulate + analyze workflow config | +| `simulate-and-analyze/hill_params.csv` | Example Hill parameter CSV for binding data input | +| `simulate-and-analyze/run.sh` | Jinja2 shell template for simulate-and-analyze runs | | `tfmodel/grid.yaml` | Example tfmodel grid for `tfs-setup-grid` | | `tfmodel/run.srun` | Jinja2 SLURM template rendered into each tfmodel grid run subdir | | `process_raw/library_config.yaml` | Minimal library genetics config for `tfs-process-fastq` | ### `process_raw` YAML -`tfs-process-fastq` accepts a `run_config` argument that is passed to `LibraryManager`. It reads only the library genetics keys: `reading_frame`, `wt_seq`, `degen_sites`, `sub_libraries`, `expected_5p`, `expected_3p`, `library_combos`, `spiked_seqs`. All other keys are ignored. +`tfs-process-fastq` accepts a `run_config` argument that is passed to `LibraryManager`. It reads only the library genetics keys: `reading_frame`, `wt_seq`, `degen_sites`, `tiles`, `expected_5p`, `expected_3p`, `tile_combos`, `spiked_seqs`. All other keys are ignored. **Recommended practice**: maintain one `run_config.yaml` per experiment and pass it to both `tfs-simulate` and `tfs-process-fastq` — no need for a separate file. Use `examples/process_raw/library_config.yaml` only when you need a minimal standalone library config (e.g. for processing real data without a matching simulation). ### Terminology -- **Condition**: unique growth setting (marker + selection + IPTG concentration) — same avg growth rate for same genotype +- **Condition**: unique growth setting (marker + selection) — same avg growth rate for same genotype - **Sample**: one experimental tube (replicate + condition) - **Timepoint**: one aliquot (replicate + condition + time) - **theta (θ)**: operator occupancy — fraction of operators bound by TF -- **A**: per-genotype TF activity (the primary output of inference) +- **A**: per-genotype TF activity (multiplied by theta to scale occupancy) - **dk_geno**: pleiotropic growth effect of mutation independent of TF activity ### Testing Notes diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 92cb9a75..c4be7e75 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.17%coverage96.17% \ No newline at end of file +coverage: 96.23%coverage96.23% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index c9b16aaa..73b48077 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3491tests3491 \ No newline at end of file +tests: 3633tests3633 \ No newline at end of file diff --git a/docs/source/process-raw.rst b/docs/source/process-raw.rst index 773388c7..10591f0b 100644 --- a/docs/source/process-raw.rst +++ b/docs/source/process-raw.rst @@ -2,23 +2,34 @@ Processing Raw Data =================== -This section describes how to process raw sequencing reads into genotype -counts, and how to combine those counts into final values suitable for -downstream statistical modelling. - -There are two primary scripts for processing raw data: +A typical TF screen involves growing bacteria transformed with a plasmid-encoded +library of TF variants under one or more selection conditions (e.g. antibiotic resistance +driven by a TF-regulated promoter). At each time-point an aliquot is +plated to measure total colony-forming units (CFU) and deep-sequenced so +that the absolute abundance of every genotype can be determined. The raw +inputs to the pipeline are paired-end FASTQ files (one pair per sample) and +a sample metadata table (``sample_df``) that links each sequenced tube to its +biological context and its measured CFU count. The pipeline converts read +counts into per-genotype log-CFU estimates (``ln_cfu``) that feed the +hierarchical Bayesian growth model. + +There are three primary scripts for processing raw data: 1. ``tfs-process-fastq``: Analyses paired-end FASTQ files to count the occurrence of each genotype. 2. ``tfs-process-counts``: Aggregates counts across multiple samples and - computes adjusted log-counts (``ln_cfu``) for analysis. + computes adjusted log-counts (``ln_cfu``) for downstream modelling. +3. ``tfs-process-presplit``: Like ``tfs-process-counts``, but for the + pre-split time-point (before the library is divided into separate + selection conditions). The output anchors the initial genotype + abundances used by the growth model. Configuration File (run_config.yaml) ------------------------------------- ``tfs-process-fastq`` requires a ``run_config.yaml`` file describing the library of expected sequences. You can view or download an -:download:`example run_config.yaml ` file. Expected fields: +:download:`example run_config.yaml <../../examples/process_raw/library_config.yaml>` file. Expected fields: * ``reading_frame``: Amino acid reading frame offset (0, 1, or 2). * ``first_amplicon_residue``: Amino acid residue number for the first in-frame @@ -26,15 +37,15 @@ library of expected sequences. You can view or download an * ``wt_seq``: The wildtype nucleic acid sequence. * ``degen_sites``: Degenerate codon pattern the same length as ``wt_seq`` (e.g. ``NNT``, ``NNK``, or ``.`` for wildtype). -* ``sub_libraries``: Contiguous blocks of library components cloned together. +* ``tiles``: Contiguous blocks of library components cloned together. ``.`` indicates wildtype; each unique character besides ``.`` defines a - sub-library (blocks must be contiguous). + tile (blocks must be contiguous). * ``expected_5p`` / ``expected_3p``: Flanking sequences immediately upstream and downstream of the amplicon. -* ``library_combos``: List of strings such as ``single-x`` or ``double-x-y``, - where ``x`` and ``y`` match characters in ``sub_libraries``. ``single-x`` - specifies all single-mutation variants in sub-library ``x``; ``double-x-y`` - specifies all pairwise combinations between sub-libraries ``x`` and ``y``. +* ``tile_combos``: List of strings such as ``single-x`` or ``double-x-y``, + where ``x`` and ``y`` match characters in ``tiles``. ``single-x`` + specifies all single-mutation variants in tile ``x``; ``double-x-y`` + specifies all pairwise combinations between tiles ``x`` and ``y``. * ``spiked_seqs``: Specific nucleic acid sequences (not part of the combinatorial library) that should be identified as controls. @@ -96,9 +107,31 @@ genotype across all samples, ready for hierarchical modelling. **Positional arguments:** * ``sample_df``: Path to a CSV file describing samples. Must contain a unique - ``sample`` column (used as the row index) plus ``sample_cfu`` and - ``sample_cfu_std`` columns giving the total CFU and its standard deviation - for each sample tube. + ``sample`` column (used as the row index). Required columns: + + * ``sample`` *(index)* — unique identifier for each sequenced tube; used + to match this row to a counts CSV file. + * ``library`` — name of the physical library this sample belongs to. Genotypes + are filtered and frequency-normalised within each library. + * ``sample_cfu`` — total colony-forming units (CFU) measured for this tube. + * ``sample_cfu_std`` — standard deviation of ``sample_cfu``. + + The following columns are not used by ``tfs-process-counts`` itself but are + carried through into the ``ln_cfu`` output and are **required by the growth + model** (``tfs-fit-model``): + + * ``replicate`` — integer replicate index distinguishing biological + replicates that share the same condition. + * ``condition_pre`` — name of the pre-selection growth condition (e.g. + ``-kan``). Identifies the baseline growth arm. + * ``condition_sel`` — name of the selection condition (e.g. ``+kan``). + * ``titrant_name`` — name of the chemical titrant applied (e.g. + ``IPTG``). Use a constant placeholder (e.g. ``none``) when no titrant + is present. + * ``titrant_conc`` — concentration of the titrant (float; 0 for no titrant). + * ``t_pre`` — duration (minutes) of pre-selection growth. + * ``t_sel`` — duration (minutes) of selection growth. + * ``counts_csv_path``: Directory containing the per-sample count CSV files. Each file is found by globbing ``{counts_glob_prefix}*{sample}*.csv`` within this directory. @@ -113,3 +146,50 @@ genotype across all samples, ready for hierarchical modelling. * ``--pseudocount``: Pseudocount added to zero counts before log transformation (default: 1). * ``--verbose``: If set, prints a summary of matched samples and file paths. + +tfs-process-presplit +-------------------- + +Processes count files from the pre-split time-point — the single pooled +sample collected **before** the library is divided into separate selection +arms. These abundances anchor the initial per-genotype CFU values (``ln_cfu0``) +in the growth model. The output CSV is passed to ``tfs-fit-model`` via the +``presplit_df`` argument. + +The interface is identical to ``tfs-process-counts``, but ``sample_df`` must +also include ``replicate`` and ``condition_pre`` columns so that the output +can be matched to the correct growth conditions. + +**Output:** A single CSV file (``output_file``) with columns ``replicate``, +``condition_pre``, ``genotype``, ``ln_cfu``, and ``ln_cfu_std``. + +**Usage:** + +.. code-block:: bash + + tfs-process-presplit [options] + +**Positional arguments:** + +* ``sample_df``: Path to a CSV file describing the pre-split samples. Must + contain a unique ``sample`` column plus: + + * ``library`` — physical library name (optional; defaults to ``default`` when + absent, but must be consistent with the growth ``sample_df``). + * ``replicate`` — replicate index; matched to the growth data. + * ``condition_pre`` — pre-selection condition name; matched to the growth + data. + * ``sample_cfu`` — total CFU for this tube. + * ``sample_cfu_std`` — standard deviation of ``sample_cfu``. + +* ``counts_csv_path``: Directory containing the per-sample count CSV files. +* ``output_file``: Path for the output presplit CSV. + +**Optional arguments:** + +* ``--counts_glob_prefix``: File prefix for globbing count files (default: + ``counts``). +* ``--min_genotype_obs``: Minimum total counts for a genotype to be retained + (default: 10). +* ``--pseudocount``: Pseudocount added before log transformation (default: 1). +* ``--verbose``: If set, prints a summary of matched samples and file paths. diff --git a/docs/source/quickstart.rst b/docs/source/quickstart.rst index 6d8483fc..d1fa59ae 100644 --- a/docs/source/quickstart.rst +++ b/docs/source/quickstart.rst @@ -8,7 +8,7 @@ will have simulated a synthetic high-throughput TF-library screen, fitted the hierarchical Bayesian model, and produced a full set of diagnostic plots and statistics. -The example uses a small library (~600 genotypes across three sub-libraries) +The example uses a small library (~600 genotypes across three tiles) so the full pipeline finishes in roughly 20–60 minutes on a laptop CPU or a few minutes on a GPU. diff --git a/docs/source/run_config.yaml b/docs/source/run_config.yaml deleted file mode 100644 index d7f3e8c3..00000000 --- a/docs/source/run_config.yaml +++ /dev/null @@ -1,39 +0,0 @@ - -# Reading frame 0, 1, 2. no reverse (negative) allowed. -reading_frame: 0 - -# amino acid residue number for first in-frame residue -first_amplicon_residue: 27 - -# wildtype sequence (nucleic acids) -wt_seq: - gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctgcacgcgccgtcgcaaattgtcgcggcgattaaatctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg - -# degenerate codons defining the library -degen_sites: - ......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt - -# sub_libraries defines blocks of contiguous library components cloned in -# together. '.' indicates wildtype sequence; each unique character beside '.' -# defines a unique sub-library. These must be contiguous (...111... is okay, -# ...11.1... is not) -sub_libraries: - ......111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111......222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 - -# Flanking sequences just upstream and just downstream of the amplicon -expected_5p: cgcgtggtgaaccag -expected_3p: gtagaacgaagcggc - -# library_combos should be formatted like 'single-x' or 'double-x-y' where 'x' -# and 'y' are library characters in sub_libraries. 'single-x' specifies all -# individual degenerate codons in x. 'double-x-x' specifies doubles between -# degenerate codons in x. 'double-x-y' specifies doubles between sub-libraries -# x and y but not internal doubles. -library_combos: ["single-1","single-2","double-1-2"] - -# These are sequences that are not part of the library that we include as controls -# etc. -spiked_seqs: -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctggcggcgccgtcgcaaattgtcgcggcgattctgtctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgattgcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctggcggcgccgtcgcaaattgtcgcggcgattctgtctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctgcacgcgccgtcgcaaattgtcgcggcgattaaatctcgcgccgcccaactgggtgccagcgtggtggtgtcgatg diff --git a/docs/source/simulation.rst b/docs/source/simulation.rst index 0894aaa5..5ab2b0a2 100644 --- a/docs/source/simulation.rst +++ b/docs/source/simulation.rst @@ -19,7 +19,7 @@ is provided in ``examples/simulate/``. The top-level sections are: **Library genetics** — same keys as the ``run_config.yaml`` used by ``tfs-process-fastq`` (``reading_frame``, ``wt_seq``, ``degen_sites``, -``sub_libraries``, ``expected_5p``, ``expected_3p``, ``library_combos``, +``tiles``, ``expected_5p``, ``expected_3p``, ``tile_combos``, ``spiked_seqs``). This means a single config file can drive both simulation and raw-data processing. diff --git a/examples/process_raw/library_config.yaml b/examples/process_raw/library_config.yaml index 9bed4776..c31bd62f 100644 --- a/examples/process_raw/library_config.yaml +++ b/examples/process_raw/library_config.yaml @@ -25,18 +25,18 @@ wt_seq: gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaac # Must be the same length as wt_seq. degen_sites: ......nntnnt.............................................................................................nntnnt......................................................................................................... -# sub_libraries groups contiguous degenerate positions that were cloned together. -# '.' = wildtype; any other character defines a sub-library block. Blocks must +# tiles groups contiguous degenerate positions that were cloned together. +# '.' = wildtype; any other character defines a tile block. Blocks must # be contiguous (......111... ok; ....11.1... not ok). -sub_libraries: ......111111.............................................................................................222222......................................................................................................... +tiles: ......111111.............................................................................................222222......................................................................................................... # Flanking sequences immediately upstream and downstream of the amplicon. expected_5p: cgcgtggtgaaccag expected_3p: gtagaacgaagcggc # Which genotype classes to include. 'single-x' = all single-mutation variants -# in sub-library x. 'double-x-y' = all pairwise combinations between x and y. -library_combos: ["single-1", "single-2", "double-1-2"] +# in tile x. 'double-x-y' = all pairwise combinations between tiles x and y. +tile_combos: ["single-1", "single-2", "double-1-2"] # Control sequences added as spikes. Must be the same length as wt_seq. spiked_seqs: diff --git a/examples/simulate-and-analyze/simulate_config.yaml b/examples/simulate-and-analyze/simulate_config.yaml index a0ea8afa..fe30f93f 100644 --- a/examples/simulate-and-analyze/simulate_config.yaml +++ b/examples/simulate-and-analyze/simulate_config.yaml @@ -20,10 +20,10 @@ degen_sites: | # ......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt -# sub_libraries groups contiguous degenerate positions that were cloned together. -# '.' = wildtype; any other character defines a sub-library block. Blocks must +# tiles groups contiguous degenerate positions that were cloned together. +# '.' = wildtype; any other character defines a tile block. Blocks must # be contiguous (......111... ok; ....11.1... not ok). -sub_libraries: | +tiles: | ......111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111......222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 # Flanking sequences immediately upstream and downstream of the amplicon. @@ -31,10 +31,10 @@ expected_5p: cgcgtggtgaaccag expected_3p: gtagaacgaagcggc # Which genotype classes to include in the library. 'single-x' = all -# single-mutation variants in sub-library x. 'double-x-y' = all pairwise -# combinations between sub-libraries x and y. 'double-x-x' = internal -# doubles within sub-library x. -library_combos: ["single-1", "single-2", "double-1-2"] +# single-mutation variants in tile x. 'double-x-y' = all pairwise +# combinations between tiles x and y. 'double-x-x' = internal +# doubles within tile x. +tile_combos: ["single-1", "single-2", "double-1-2"] # Control sequences (e.g. known variants) added as spikes. Must be the same # length as wt_seq. @@ -156,15 +156,15 @@ activity_mut_scale: 0.0 # Experimental simulation parameters # --------------------------------------------------------------------------- -# Number of transformants per sub-library. Keys must match the characters in -# library_combos (e.g. 'single-1', 'double-1-2') plus 'spiked'. +# Number of transformants per tile combo. Keys must match the entries in +# tile_combos (e.g. 'single-1', 'double-1-2') plus 'spiked'. transform_sizes: single-1: 100_000 single-2: 100_000 double-1-2: 300_000 spiked: 1000 -# Mixing ratio of sub-libraries in the pooled library. Only the ratio matters. +# Mixing ratio of tile combos in the pooled library. Only the ratio matters. library_mixture: single-1: 100 single-2: 100 @@ -234,7 +234,7 @@ seed: 12345 # --------------------------------------------------------------------------- # If present, tfs-simulate also writes a binding CSV with per-genotype theta -# curves. titrant_name must match e_name in observable_calc_kwargs. +# curves. binding_data: genotype_params_file: hill_params.csv diff --git a/examples/simulate/simulate_config.yaml b/examples/simulate/simulate_config.yaml index 33362a67..91eae1c5 100644 --- a/examples/simulate/simulate_config.yaml +++ b/examples/simulate/simulate_config.yaml @@ -17,20 +17,20 @@ wt_seq: gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaac # Must be the same length as wt_seq. degen_sites: ......nntnnt.............................................................................................nntnnt......................................................................................................... -# sub_libraries groups contiguous degenerate positions that were cloned together. -# '.' = wildtype; any other character defines a sub-library block. Blocks must +# tiles groups contiguous degenerate positions that were cloned together. +# '.' = wildtype; any other character defines a tile block. Blocks must # be contiguous (......111... ok; ....11.1... not ok). -sub_libraries: ......111111.............................................................................................222222......................................................................................................... +tiles: ......111111.............................................................................................222222......................................................................................................... # Flanking sequences immediately upstream and downstream of the amplicon. expected_5p: cgcgtggtgaaccag expected_3p: gtagaacgaagcggc # Which genotype classes to include in the library. 'single-x' = all -# single-mutation variants in sub-library x. 'double-x-y' = all pairwise -# combinations between sub-libraries x and y. 'double-x-x' = internal -# doubles within sub-library x. -library_combos: ["single-1", "single-2", "double-1-2"] +# single-mutation variants in tile x. 'double-x-y' = all pairwise +# combinations between tiles x and y. 'double-x-x' = internal +# doubles within tile x. +tile_combos: ["single-1", "single-2", "double-1-2"] # Control sequences (e.g. known variants) added as spikes. Must be the same # length as wt_seq. @@ -198,15 +198,15 @@ activity_mut_scale: 0.0 # Experimental simulation parameters # --------------------------------------------------------------------------- -# Number of transformants per sub-library. Keys must match the characters in -# library_combos (e.g. 'single-1', 'double-1-2') plus 'spiked'. +# Number of transformants per tile combo. Keys must match the entries in +# tile_combos (e.g. 'single-1', 'double-1-2') plus 'spiked'. transform_sizes: single-1: 100_000 single-2: 100_000 double-1-2: 300_000 spiked: 1_000 -# Mixing ratio of sub-libraries in the pooled library. Only the ratio matters. +# Mixing ratio of tile combos in the pooled library. Only the ratio matters. library_mixture: single-1: 100 single-2: 100 diff --git a/pyproject.toml b/pyproject.toml index 7c12e73e..edc2997f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,6 +72,7 @@ docs = ["pydata-sphinx-theme"] [project.scripts] tfs-process-fastq = "tfscreen.process_raw.scripts.process_fastq_cli:main" tfs-process-counts = "tfscreen.process_raw.scripts.process_counts_cli:main" +tfs-process-presplit = "tfscreen.process_raw.scripts.process_presplit_cli:main" tfs-configure-model = "tfscreen.tfmodel.scripts.configure_model_cli:main" tfs-prefit-calibration = "tfscreen.tfmodel.scripts.prefit_calibration_cli:main" tfs-fit-model = "tfscreen.tfmodel.scripts.fit_model_cli:main" diff --git a/reports/flake.txt b/reports/flake.txt index b653ba9c..b7c078e1 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -234,7 +234,6 @@ ./src/tfscreen/genetics/library_manager.py:82:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:91:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:94:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:124:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:158:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:159:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/genetics/library_manager.py:169:22: E231 missing whitespace after ',' @@ -250,23 +249,11 @@ ./src/tfscreen/genetics/library_manager.py:254:36: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:258:32: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:258:46: E231 missing whitespace after ',' -./src/tfscreen/genetics/library_manager.py:264:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:268:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:269:82: W291 trailing whitespace -./src/tfscreen/genetics/library_manager.py:270:84: W291 trailing whitespace -./src/tfscreen/genetics/library_manager.py:271:26: W291 trailing whitespace -./src/tfscreen/genetics/library_manager.py:274:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:281:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:282:51: W291 trailing whitespace -./src/tfscreen/genetics/library_manager.py:286:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:288:51: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:288:58: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:288:70: E231 missing whitespace after ',' -./src/tfscreen/genetics/library_manager.py:291:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:296:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:298:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:300:51: E231 missing whitespace after ',' -./src/tfscreen/genetics/library_manager.py:300:100: E231 missing whitespace after ',' +./src/tfscreen/genetics/library_manager.py:300:48: E231 missing whitespace after ',' +./src/tfscreen/genetics/library_manager.py:300:94: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:307:35: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:309:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:310:49: W291 trailing whitespace @@ -277,9 +264,6 @@ ./src/tfscreen/genetics/library_manager.py:318:30: E701 multiple statements on one line (colon) ./src/tfscreen/genetics/library_manager.py:321:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:324:18: E128 continuation line under-indented for visual indent -./src/tfscreen/genetics/library_manager.py:357:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:361:1: W293 blank line contains whitespace -./src/tfscreen/genetics/library_manager.py:364:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:373:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:378:1: W293 blank line contains whitespace ./src/tfscreen/genetics/library_manager.py:380:1: W293 blank line contains whitespace @@ -358,6 +342,7 @@ ./src/tfscreen/genetics/library_manager.py:854:27: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:856:40: E231 missing whitespace after ',' ./src/tfscreen/genetics/library_manager.py:859:1: W391 blank line at end of file +./src/tfscreen/mle/__init__.py:16:1: W391 blank line at end of file ./src/tfscreen/mle/curve_models/__init__.py:4:77: W291 trailing whitespace ./src/tfscreen/mle/curve_models/__init__.py:5:42: W291 trailing whitespace ./src/tfscreen/mle/curve_models/__init__.py:11:77: W291 trailing whitespace @@ -580,36 +565,6 @@ ./src/tfscreen/mle/fitters/matrix_wls.py:52:40: W291 trailing whitespace ./src/tfscreen/mle/fitters/matrix_wls.py:54:1: W293 blank line contains whitespace ./src/tfscreen/mle/fitters/matrix_wls.py:55:52: W292 no newline at end of file -./src/tfscreen/mle/parse_patsy.py:7:1: C901 'parse_patsy' is too complex (14) -./src/tfscreen/mle/parse_patsy.py:7:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/mle/parse_patsy.py:49:35: E231 missing whitespace after ',' -./src/tfscreen/mle/parse_patsy.py:62:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:71:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:74:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:77:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:85:40: E231 missing whitespace after ',' -./src/tfscreen/mle/parse_patsy.py:88:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:93:49: E231 missing whitespace after ',' -./src/tfscreen/mle/parse_patsy.py:94:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:95:64: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:100:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:103:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:104:80: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:106:79: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:108:77: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:109:63: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:111:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:126:78: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:128:23: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:129:28: E231 missing whitespace after ':' -./src/tfscreen/mle/parse_patsy.py:129:59: E231 missing whitespace after ',' -./src/tfscreen/mle/parse_patsy.py:130:29: E231 missing whitespace after ':' -./src/tfscreen/mle/parse_patsy.py:131:30: E231 missing whitespace after ':' -./src/tfscreen/mle/parse_patsy.py:132:1: W293 blank line contains whitespace -./src/tfscreen/mle/parse_patsy.py:136:27: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:139:61: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:140:76: W291 trailing whitespace -./src/tfscreen/mle/parse_patsy.py:146:1: W293 blank line contains whitespace ./src/tfscreen/mle/predict_with_error.py:3:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/mle/predict_with_error.py:37:1: W293 blank line contains whitespace ./src/tfscreen/mle/predict_with_error.py:42:36: E231 missing whitespace after ',' @@ -1003,6 +958,7 @@ ./src/tfscreen/plot/xy_corr.py:93:23: E231 missing whitespace after ',' ./src/tfscreen/plot/xy_corr.py:94:23: E231 missing whitespace after ',' ./src/tfscreen/plot/xy_corr.py:97:14: W292 no newline at end of file +./src/tfscreen/process_raw/_counts_io.py:110:16: F541 f-string is missing placeholders ./src/tfscreen/process_raw/counts_to_lncfu.py:11:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/process_raw/counts_to_lncfu.py:30:69: E231 missing whitespace after ',' ./src/tfscreen/process_raw/counts_to_lncfu.py:37:1: E302 expected 2 blank lines, found 1 @@ -1044,7 +1000,6 @@ ./src/tfscreen/process_raw/fastq_to_counts.py:204:42: E127 continuation line over-indented for visual indent ./src/tfscreen/process_raw/fastq_to_counts.py:207:42: E127 continuation line over-indented for visual indent ./src/tfscreen/process_raw/fastq_to_counts.py:208:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/fastq_to_counts.py:214:78: W291 trailing whitespace ./src/tfscreen/process_raw/fastq_to_counts.py:216:70: W291 trailing whitespace ./src/tfscreen/process_raw/fastq_to_counts.py:219:76: W291 trailing whitespace ./src/tfscreen/process_raw/fastq_to_counts.py:220:40: W291 trailing whitespace @@ -1169,36 +1124,15 @@ ./src/tfscreen/process_raw/fastq_to_counts.py:652:50: W291 trailing whitespace ./src/tfscreen/process_raw/fastq_to_counts.py:653:50: E231 missing whitespace after ',' ./src/tfscreen/process_raw/fastq_to_counts.py:664:1: W391 blank line at end of file -./src/tfscreen/process_raw/scripts/process_counts_cli.py:6:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:55:75: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:56:14: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:57:58: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:59:56: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:71:32: E211 whitespace before '(' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:80:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:109:73: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:112:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:114:16: F541 f-string is missing placeholders -./src/tfscreen/process_raw/scripts/process_counts_cli.py:119:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:120:21: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:121:1: W293 blank line contains whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:122:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/process_raw/scripts/process_counts_cli.py:124:24: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:126:68: W291 trailing whitespace -./src/tfscreen/process_raw/scripts/process_counts_cli.py:143:41: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:145:26: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:145:37: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:149:37: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:153:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/process_raw/scripts/process_counts_cli.py:157:28: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:157:29: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:158:26: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:158:27: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:159:21: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:159:22: E252 missing whitespace around parameter equals -./src/tfscreen/process_raw/scripts/process_counts_cli.py:160:5: E125 continuation line with same indent as next logical line -./src/tfscreen/process_raw/scripts/process_counts_cli.py:217:33: E231 missing whitespace after ',' -./src/tfscreen/process_raw/scripts/process_counts_cli.py:221:44: W292 no newline at end of file +./src/tfscreen/process_raw/scripts/process_counts_cli.py:15:28: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:15:29: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:16:26: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:16:27: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:17:21: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:17:22: E252 missing whitespace around parameter equals +./src/tfscreen/process_raw/scripts/process_counts_cli.py:18:5: E125 continuation line with same indent as next logical line +./src/tfscreen/process_raw/scripts/process_counts_cli.py:75:33: E231 missing whitespace after ',' +./src/tfscreen/process_raw/scripts/process_counts_cli.py:79:44: W292 no newline at end of file ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:25:76: W291 trailing whitespace ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:26:39: W291 trailing whitespace @@ -1263,6 +1197,10 @@ ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:417:39: E231 missing whitespace after ',' ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:418:33: E231 missing whitespace after ',' ./src/tfscreen/process_raw/scripts/process_fastq_cli.py:420:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/process_raw/scripts/process_presplit_cli.py:77:34: E127 continuation line over-indented for visual indent +./src/tfscreen/process_raw/scripts/process_presplit_cli.py:78:34: E127 continuation line over-indented for visual indent +./src/tfscreen/process_raw/scripts/process_presplit_cli.py:79:34: E127 continuation line over-indented for visual indent +./src/tfscreen/process_raw/scripts/process_presplit_cli.py:86:31: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/__init__.py:29:2: W292 no newline at end of file ./src/tfscreen/simulate/binding_params.py:225:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) ./src/tfscreen/simulate/binding_params.py:289:17: E221 multiple spaces before operator @@ -1359,7 +1297,7 @@ ./src/tfscreen/simulate/scripts/simulate_cli.py:126:20: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/simulate_cli.py:127:22: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/simulate_cli.py:128:21: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:147:43: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/scripts/simulate_cli.py:147:48: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/scripts/simulate_cli.py:148:14: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/simulate_cli.py:149:16: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/simulate_cli.py:154:17: E221 multiple spaces before operator @@ -1547,21 +1485,21 @@ ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/prediction.py:12:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/analysis/prediction.py:71:1: C901 'copy_orchestrator' is too complex (11) -./src/tfscreen/tfmodel/analysis/prediction.py:196:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/prediction.py:242:1: C901 'predict' is too complex (22) -./src/tfscreen/tfmodel/analysis/prediction.py:303:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:369:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:372:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:377:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:380:67: W291 trailing whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:381:76: W291 trailing whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:385:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:392:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:401:58: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/analysis/prediction.py:404:26: E111 indentation is not a multiple of 4 -./src/tfscreen/tfmodel/analysis/prediction.py:404:26: E117 over-indented -./src/tfscreen/tfmodel/analysis/prediction.py:407:25: E122 continuation line missing indentation or outdented -./src/tfscreen/tfmodel/analysis/prediction.py:413:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:198:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/prediction.py:244:1: C901 'predict' is too complex (22) +./src/tfscreen/tfmodel/analysis/prediction.py:305:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:371:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:374:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:379:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:382:67: W291 trailing whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:383:76: W291 trailing whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:387:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:394:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:403:58: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/analysis/prediction.py:406:26: E111 indentation is not a multiple of 4 +./src/tfscreen/tfmodel/analysis/prediction.py:406:26: E117 over-indented +./src/tfscreen/tfmodel/analysis/prediction.py:409:25: E122 continuation line missing indentation or outdented +./src/tfscreen/tfmodel/analysis/prediction.py:415:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/analysis/prior_predictive.py:104:33: E203 whitespace before ':' ./src/tfscreen/tfmodel/configuration_io.py:19:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/configuration_io.py:37:1: E302 expected 2 blank lines, found 1 @@ -2173,46 +2111,41 @@ ./src/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1141:17: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1154:11: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1157:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:38:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:38:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:171:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:179:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:181:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:368:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:376:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:378:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:383:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:47:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:47:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:188:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:189:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:190:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:386:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:387:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:390:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:400:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:402:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:405:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:406:128: E501 line too long (128 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:407:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:408:128: E501 line too long (128 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:413:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:420:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:421:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:396:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:399:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:401:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:403:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:409:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:411:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:414:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:416:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:128: E501 line too long (128 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:422:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:423:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:435:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:437:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:438:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:464:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:465:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:481:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:487:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:488:128: E501 line too long (138 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:489:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:128: E501 line too long (138 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:492:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:424:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:426:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:429:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:430:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:431:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:432:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:444:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:446:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:447:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:473:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:474:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:15: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:496:27: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:497:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:498:27: E221 multiple spaces before operator @@ -2224,255 +2157,255 @@ ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:508:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:510:128: E501 line too long (128 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:514:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:516:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:520:128: E501 line too long (132 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:521:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:527:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (132 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:531:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:591:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:594:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:598:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:601:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:605:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:624:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:625:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:626:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:636:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:637:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:638:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:639:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:640:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:641:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:642:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:658:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:659:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (138 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:519:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:523:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:529:128: E501 line too long (132 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:533:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:534:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:535:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:536:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:539:128: E501 line too long (132 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:540:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:600:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:603:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:607:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:610:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:614:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:633:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:649:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:650:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:28: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:662:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:788:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:789:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:790:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:792:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:871:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:871:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:871:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:871:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:58:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:58:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:72:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:72:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:73:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:73:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:74:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:74:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:75:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:75:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:76:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:213:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:214:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:219:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:220:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:224:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:225:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:251:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:261:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:323:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:328:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:329:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:330:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:333:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:334:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:340:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:344:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:346:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:393:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:397:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:399:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:400:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:401:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:403:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:405:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:422:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:425:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:426:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:462:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:464:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:466:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:468:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:470:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:472:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:474:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:476:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:478:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:488:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:489:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:490:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:491:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:492:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:495:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:507:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:509:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:510:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:547:25: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:689:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:689:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:689:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:689:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:71:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:71:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:92:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:92:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:93:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:93:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:94:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:94:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:95:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:95:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:96:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:250:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:255:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:258:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:261:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:262:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:296:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:311:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:354:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:374:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:379:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:380:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:386:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:387:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:391:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:393:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:397:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:399:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:414:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:452:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:456:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:458:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:459:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:460:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:462:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:464:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:481:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:484:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:485:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:506:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:527:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:530:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:533:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:537:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:541:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:554:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:556:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:557:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:558:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:559:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:569:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:570:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:571:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:572:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:573:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:576:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:708:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:711:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:748:25: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:772:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:772:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:772:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:173:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:260:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:290:40: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:358:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:28:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:28:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:166:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:174:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:176:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:231:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:282:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:282:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:375:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:383:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:385:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:390:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:663:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:664:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:665:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:666:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:667:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:668:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:669:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:670:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:671:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:797:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:798:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:799:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:801:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:67:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:67:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:85:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:222:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:223:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:228:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:229:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:233:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:234:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:260:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:270:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:332:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:337:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:339:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:343:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:347:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:349:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:351:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:353:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:364:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:406:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:408:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:410:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:411:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:412:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:414:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:418:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:431:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:434:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:435:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:471:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:479:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:481:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:482:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:483:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:484:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:485:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:486:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:497:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:498:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:499:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:500:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:501:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:504:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:505:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:516:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:518:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:519:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:556:25: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:80:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:80:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:105:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:259:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:264:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:267:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:270:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:271:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:305:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:320:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:363:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:388:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:389:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:392:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:396:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:400:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:402:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:404:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:406:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:408:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:423:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:465:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:467:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:469:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:470:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:471:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:473:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:477:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:490:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:493:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:494:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:515:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:536:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:539:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:542:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:546:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:550:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:563:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:565:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:566:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:567:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:578:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:579:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:580:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:581:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:582:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:585:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:586:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:717:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:720:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:757:25: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:181:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:268:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:298:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:366:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:37:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:37:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:183:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:184:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:185:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:240:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:393:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:394:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:396:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:397:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:411:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:413:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:416:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:417:128: E501 line too long (128 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:418:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:419:128: E501 line too long (128 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:424:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:430:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:431:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:408:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:410:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:412:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:414:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:415:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:420:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:422:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:425:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:427:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:128: E501 line too long (128 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:433:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:434:128: E501 line too long (129 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:435:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:436:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:448:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:450:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:451:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:472:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:476:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:479:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:480:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:503:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:504:128: E501 line too long (138 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:505:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:128: E501 line too long (138 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:508:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:437:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:439:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:440:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:442:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:443:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:444:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:445:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:457:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:459:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:460:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:481:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:485:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:489:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:15: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:512:27: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:513:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:514:27: E221 multiple spaces before operator @@ -2484,688 +2417,693 @@ ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:524:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:526:128: E501 line too long (128 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:530:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (138 > 127 characters) ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:532:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:536:128: E501 line too long (132 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:537:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:543:128: E501 line too long (142 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (132 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:547:128: E501 line too long (129 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:609:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:612:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:616:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:619:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:623:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:626:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:627:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:644:36: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:646:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:647:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:648:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:658:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:659:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:660:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:661:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:662:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:663:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:664:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:683:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:684:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (138 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:535:128: E501 line too long (128 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:539:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:545:128: E501 line too long (132 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:549:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:550:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:551:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:552:128: E501 line too long (142 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:555:128: E501 line too long (132 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:556:128: E501 line too long (129 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:618:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:621:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:625:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:628:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:632:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:635:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:636:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:653:36: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:655:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:674:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:675:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:35: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:28: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:687:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:761:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:769:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:777:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:797:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:817:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:818:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:819:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:821:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:901:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:901:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:901:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:74:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:74:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:88:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:88:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:89:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:89:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:90:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:90:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:91:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:91:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:92:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:232:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:233:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:238:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:239:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:244:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:277:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:349:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:355:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:358:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:361:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:364:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:366:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:370:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:372:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:385:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:427:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:431:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:433:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:434:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:435:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:436:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:439:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:456:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:459:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:460:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:497:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:499:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:501:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:503:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:505:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:510:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:512:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:688:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:689:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:690:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:691:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:692:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:693:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:694:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:695:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:696:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:770:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:778:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:786:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:806:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:826:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:827:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:828:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:830:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:84:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:84:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:102:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:242:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:248:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:249:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:253:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:254:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:297:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:365:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:369:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:371:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:374:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:378:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:380:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:382:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:386:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:395:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:441:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:444:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:445:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:446:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:447:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:449:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:453:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:466:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:469:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:470:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:507:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:31: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:513:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:514:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:516:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:517:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:528:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:529:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:530:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:531:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:532:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:535:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:547:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:549:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:550:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:587:25: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:680:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:697:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:698:38: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:717:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:736:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:736:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:736:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:76:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:76:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:91:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:91:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:92:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:92:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:93:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:93:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:94:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:94:38: E202 whitespace before ']' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:95:6: E201 whitespace after '[' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:249:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:254:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:257:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:260:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:261:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:300:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:315:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:359:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:379:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:384:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:385:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:391:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:392:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:396:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:398:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:402:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:404:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:408:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:423:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:465:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:469:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:471:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:472:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:473:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:475:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:477:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:494:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:497:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:498:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:520:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:535:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:537:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:539:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:541:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:543:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:547:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:519:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:520:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:521:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:522:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:523:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:524:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:525:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:537:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:538:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:539:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:540:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:541:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:542:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:545:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:546:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:557:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:559:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:560:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:597:25: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:690:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:707:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:708:38: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:727:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:85:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:85:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:38: E202 whitespace before ']' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:104:6: E201 whitespace after '[' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:258:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:263:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:266:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:269:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:270:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:309:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:324:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:368:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:393:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:394:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:397:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:401:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:405:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:407:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:409:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:411:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:413:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:417:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:432:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:478:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:480:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:482:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:483:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:484:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:486:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:490:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:503:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:506:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:507:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:529:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:544:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:546:31: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:548:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:555:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:558:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:559:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:560:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:570:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:571:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:572:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:573:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:574:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:575:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:550:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:552:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:556:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:564:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:566:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:567:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:568:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:22: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:578:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:657:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:692:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:713:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:716:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:753:25: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:777:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:777:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:777:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:98:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:149:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:223:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:239:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:269:40: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:329:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:346:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:353:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:34:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:34:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:227:31: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:228:31: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:229:31: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:267:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:279:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:279:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:290:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:295:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:295:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:526:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:534:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:534:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:534:53: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:556:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:559:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:562:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:563:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:566:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:37: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:569:37: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:570:36: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:573:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:584:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:585:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:586:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:587:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:588:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:589:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:590:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:39: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:600:39: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:670:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:675:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:687:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:690:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:695:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:799:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:799:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:799:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:55:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:55:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:155:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:159:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:191:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:192:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:197:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:198:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:230:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:263:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:281:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:287:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:292:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:295:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:297:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:299:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:344:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:348:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:350:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:351:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:352:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:354:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:356:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:373:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:376:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:377:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:394:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:407:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:409:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:411:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:412:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:413:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:414:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:415:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:417:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:428:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:429:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:430:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:433:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:434:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:505:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:509:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:521:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:524:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:528:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:546:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:548:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:549:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:604:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:604:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:604:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:66:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:66:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:173:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:181:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:213:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:232:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:242:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:243:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:277:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:283:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:293:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:297:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:312:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:323:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:324:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:325:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:326:19: E225 missing whitespace around operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:326:59: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:327:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:328:19: E225 missing whitespace around operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:328:59: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:349:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:354:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:371:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:375:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:386:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:387:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:388:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:392:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:392:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:409:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:411:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:413:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:414:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:419:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:421:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:424:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:429:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:434:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:435:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:436:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:441:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:512:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:516:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:528:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:531:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:535:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:553:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:556:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:613:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:613:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:613:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:127:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:131:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:136:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:580:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:581:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:582:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:583:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:584:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:587:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:588:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:666:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:701:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:722:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:725:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:762:25: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:104:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:155:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:229:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:245:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:275:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:335:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:352:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:359:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:43:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:43:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:236:31: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:237:31: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:238:31: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:276:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:299:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:535:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:53: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:571:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:575:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:577:37: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:578:37: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:579:36: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:581:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:591:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:592:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:602:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:603:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:604:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:605:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:606:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:607:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:608:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:609:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:679:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:684:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:696:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:699:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:704:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:64:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:64:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:168:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:200:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:201:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:206:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:207:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:239:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:272:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:290:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:296:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:301:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:304:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:306:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:317:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:357:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:359:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:361:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:362:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:363:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:365:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:369:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:382:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:385:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:386:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:403:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:416:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:420:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:421:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:422:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:423:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:424:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:426:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:436:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:437:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:438:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:439:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:442:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:443:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:514:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:518:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:530:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:533:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:537:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:555:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:557:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:558:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:75:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:75:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:182:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:190:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:231:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:250:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:252:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:269:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:292:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:302:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:304:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:306:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:330:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:332:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:333:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:334:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:19: E225 missing whitespace around operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:59: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:336:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:19: E225 missing whitespace around operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:59: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:358:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:363:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:380:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:384:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:395:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:397:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:405:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:418:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:420:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:428:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:432:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:438:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:443:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:444:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:445:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:448:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:449:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:450:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:451:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:521:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:525:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:537:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:540:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:544:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:562:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:565:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U0_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:133:8: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:137:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:159:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:227:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:230:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:231:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:236:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:242:9: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:243:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:268:40: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:335:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:349:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:354:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:28:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:28:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:150:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:188:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:189:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:202:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:202:34: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:211:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:217:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:217:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:254:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:256:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:258:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:259:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:261:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:263:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:265:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:270:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:23: E225 missing whitespace around operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:274:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:279:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:293:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:294:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:296:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:297:128: E501 line too long (135 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:298:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:299:24: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:299:128: E501 line too long (135 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:300:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:128: E501 line too long (135 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:302:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:24: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:128: E501 line too long (135 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:305:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:305:128: E501 line too long (140 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:21: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (140 > 127 characters) -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:320:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:326:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:334:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:350:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:351:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:359:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:359:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:359:53: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:375:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:377:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:379:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:380:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:382:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:383:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:384:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:386:37: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:37: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:388:36: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:36: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:391:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:142:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:143:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:165:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:233:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:236:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:242:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:248:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:274:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:341:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:355:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:360:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:38:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:38:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:160:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:198:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:199:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:34: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:221:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:222:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:264:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:269:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:273:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:275:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:23: E225 missing whitespace around operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:284:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:286:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:288:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:289:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:290:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (135 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:308:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:24: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:128: E501 line too long (135 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:310:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:311:128: E501 line too long (135 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:312:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:24: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:128: E501 line too long (135 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:128: E501 line too long (140 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:316:21: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:128: E501 line too long (140 > 127 characters) +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:324:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:327:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:330:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:336:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:344:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:360:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:361:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:53: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:393:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:394:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:395:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:396:37: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:397:37: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:398:36: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:399:36: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:30: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:402:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:403:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:404:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:405:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:406:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:407:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:33: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:418:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:419:40: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:39: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:39: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:469:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:470:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:474:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:475:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:488:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:492:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:493:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:598:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:598:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:598:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:33:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:33:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:98:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:101:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:105:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:105:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:125:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:126:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:131:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:132:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:161:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:195:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:213:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:219:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:224:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:226:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:228:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:230:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:231:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:232:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:237:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:254:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:266:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:267:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:271:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:273:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:274:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:275:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:279:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:296:24: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:299:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:300:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:317:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:329:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:331:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:333:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:334:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:335:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:336:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:337:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:338:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:342:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:353:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:354:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:355:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:358:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:359:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:413:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:414:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:418:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:422:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:429:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:436:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:455:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:457:5: F841 local variable 'titrant_dim' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:509:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:509:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:509:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:40:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:40:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:114:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:122:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:155:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:164:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:166:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:185:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:186:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:187:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:204:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:221:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:227:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:230:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:236:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:238:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:18: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:241:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:242:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:47: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:264:47: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:268:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:281:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:284:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:286:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:287:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:288:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:289:19: E225 missing whitespace around operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:289:59: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:290:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:19: E225 missing whitespace around operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:59: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:308:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:309:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:320:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:321:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:326:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:326:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:342:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:344:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:346:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:347:31: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:348:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:349:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:412:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:413:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:33: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:424:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:425:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:426:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:427:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:428:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:429:40: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:430:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:431:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:484:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:489:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:490:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:495:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:498:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:502:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:503:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:43:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:43:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:108:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:111:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:135:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:136:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:141:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:142:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:171:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:205:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:223:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:229:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:234:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:236:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:238:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:240:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:241:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:242:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:247:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:264:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:281:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:284:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:285:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:286:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:287:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:289:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:293:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:306:24: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:309:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:310:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:327:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:343:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:344:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:345:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:346:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:347:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:348:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:349:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:361:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:362:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:363:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:364:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:365:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:368:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:369:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:423:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:428:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:434:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:439:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:442:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:446:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:465:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:467:5: F841 local variable 'titrant_dim' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:50:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.run_model' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:50:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.get_population_moments' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:124:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:132:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:165:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:174:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:176:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:196:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:197:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:214:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:231:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:237:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:246:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:248:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:250:18: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:251:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:272:47: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:274:47: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:278:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:296:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:297:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:298:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:19: E225 missing whitespace around operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:59: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:300:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:19: E225 missing whitespace around operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:59: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:314:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:318:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:319:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:331:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:340:14: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:352:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:353:29: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:354:30: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:355:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:22: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:367:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:368:27: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:369:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:372:29: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:373:28: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:374:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:32: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:427:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:428:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:432:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:436:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:439:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:444:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:447:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:451:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:470:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:473:5: F841 local variable 'titrant_names' is assigned to but never used -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:523:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:523:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:523:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:108:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:109:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:114:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:119:9: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:120:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:137:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:203:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:204:8: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:207:7: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:208:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:213:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:219:9: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:220:6: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:241:40: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:301:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:315:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:316:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:320:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:321:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:357:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:358:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:359:31: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:362:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:363:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:364:30: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:22: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:376:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:377:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:378:27: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:379:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:382:29: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:383:28: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:384:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:385:32: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:437:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:438:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:442:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:446:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:449:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:454:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:457:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:461:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:480:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:483:5: F841 local variable 'titrant_names' is assigned to but never used +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.build_calc_df' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C4_K3_U1_a.thermo.compute_theta_samples' imported but unused +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:115:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:116:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:121:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:126:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:127:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:144:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:210:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:211:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:214:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:220:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:226:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:248:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:308:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:322:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:323:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:327:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:328:15: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/features.py:99:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/features.py:110:40: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/features.py:111:48: E221 multiple spaces before operator @@ -3456,199 +3394,193 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:71:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:74:39: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:78:25: E222 multiple spaces after operator -./src/tfscreen/tfmodel/model_orchestrator.py:78:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:78:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:78:53: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:79:42: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:83:65: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:83:88: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:94:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:98:30: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:98:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:98:55: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:98:63: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:99:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:109:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:113:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:117:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:118:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:120:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/model_orchestrator.py:155:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:158:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:158:73: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:159:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:160:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:161:61: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:162:61: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:163:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:164:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:166:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:167:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:168:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:169:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:172:63: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:173:73: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:174:73: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:176:59: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:177:70: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:178:72: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:182:63: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:185:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:186:15: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:187:42: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:187:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:188:29: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:189:40: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:190:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:190:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:190:72: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:231:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:240:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:240:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:241:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:244:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:250:27: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:287:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/model_orchestrator.py:319:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:320:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:321:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:323:23: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:324:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:325:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:329:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:409:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:469:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:472:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:477:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:478:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:485:30: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:489:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:505:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:506:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/model_orchestrator.py:526:82: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:531:87: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:534:84: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:539:79: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:621:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) -./src/tfscreen/tfmodel/model_orchestrator.py:621:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:646:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:647:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:649:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:650:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:650:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:650:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:651:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:651:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:652:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:656:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:657:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:662:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:669:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:671:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:671:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:673:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:676:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:678:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:680:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:692:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:700:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:722:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:723:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:723:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:724:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:724:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:725:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:725:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:726:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:726:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:728:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:735:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:740:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:740:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:740:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:747:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:793:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:794:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:795:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:796:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:836:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:839:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:840:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:841:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:845:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:846:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:847:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:848:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:850:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:861:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:861:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:864:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:865:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:870:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:871:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:872:58: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:874:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:879:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:883:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:887:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:890:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:896:86: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:898:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:905:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:961:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:962:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:963:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:964:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:971:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:972:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:973:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1049:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1050:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1052:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1125:5: C901 'ModelOrchestrator._initialize_classes' is too complex (16) -./src/tfscreen/tfmodel/model_orchestrator.py:1145:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1147:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1148:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1150:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1151:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1152:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1153:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1170:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1171:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1172:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1172:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1172:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1172:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1172:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1229:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1232:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1236:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1238:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1248:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1250:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1303:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1308:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1322:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1332:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1342:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1356:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1359:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1388:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1400:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1412:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1418:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1419:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1420:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1421:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1422:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1423:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1424:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1425:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1426:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1427:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1428:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1429:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1430:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1431:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1432:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:103:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:103:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:103:55: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:103:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:104:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:118:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:122:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:123:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:125:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:208:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:211:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:211:73: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:213:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:214:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:215:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:216:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:217:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:219:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:220:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:221:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:222:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:225:63: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:226:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:227:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:237:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:242:42: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:242:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:242:68: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:243:29: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:244:40: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:245:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:245:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:245:72: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:286:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:295:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:295:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:296:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:299:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:305:27: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:342:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:374:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:375:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:376:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:378:23: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:379:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:380:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:384:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:464:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:529:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:532:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:537:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:538:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:545:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:549:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:565:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:566:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/model_orchestrator.py:586:82: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:591:87: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:594:84: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:599:79: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:681:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:681:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:706:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:707:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:709:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:710:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:710:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:710:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:711:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:711:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:712:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:716:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:717:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:722:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:729:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:731:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:731:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:733:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:736:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:738:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:740:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:752:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:760:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:782:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:783:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:783:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:784:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:784:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:785:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:785:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:786:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:786:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:788:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:795:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:800:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:800:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:800:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:807:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:853:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:854:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:855:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:856:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:896:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:899:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:900:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:901:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:905:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:906:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:907:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:908:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:910:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:921:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:921:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:924:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:925:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:931:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:932:58: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:934:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:939:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:943:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:947:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:950:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:956:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:958:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:965:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1021:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1022:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1023:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1024:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1031:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1032:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1033:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1109:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1110:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1112:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1185:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:1205:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1207:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1208:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1210:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1211:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1212:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1213:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1230:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1231:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1232:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1232:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1232:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1232:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1232:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1301:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1304:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1308:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1310:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1320:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1322:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1375:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1380:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1394:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1404:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1414:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1428:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1431:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1460:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1472:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1484:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1490:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1491:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1492:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1493:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1494:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1495:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1497:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1498:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1499:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1500:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1501:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1502:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1503:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1504:31: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:192:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:193:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:194:22: E128 continuation line under-indented for visual indent @@ -3995,9 +3927,9 @@ ./tests/smoke-tests/test_configure_run_smoke.py:10:1: E302 expected 2 blank lines, found 1 ./tests/smoke-tests/test_configure_run_smoke.py:33:31: E127 continuation line over-indented for visual indent ./tests/smoke-tests/test_configure_run_smoke.py:34:31: E127 continuation line over-indented for visual indent -./tests/smoke-tests/test_configure_run_smoke.py:101:31: E127 continuation line over-indented for visual indent ./tests/smoke-tests/test_configure_run_smoke.py:102:31: E127 continuation line over-indented for visual indent -./tests/smoke-tests/test_configure_run_smoke.py:175:16: E221 multiple spaces before operator +./tests/smoke-tests/test_configure_run_smoke.py:103:31: E127 continuation line over-indented for visual indent +./tests/smoke-tests/test_configure_run_smoke.py:177:16: E221 multiple spaces before operator ./tests/smoke-tests/test_model_smoke.py:3:1: F401 'shutil' imported but unused ./tests/smoke-tests/test_model_smoke.py:4:1: F401 'jax.numpy as jnp' imported but unused ./tests/smoke-tests/test_model_smoke.py:11:71: W291 trailing whitespace @@ -4350,6 +4282,7 @@ ./tests/tfscreen/genetics/test_combine_mutation_effects.py:101:17: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_combine_mutation_effects.py:108:1: W293 blank line contains whitespace ./tests/tfscreen/genetics/test_combine_mutation_effects.py:111:39: W292 no newline at end of file +./tests/tfscreen/genetics/test_data.py:8:1: F401 'pytest' imported but unused ./tests/tfscreen/genetics/test_expand_genotype_columns.py:4:1: F401 'pandas.testing.assert_frame_equal' imported but unused ./tests/tfscreen/genetics/test_expand_genotype_columns.py:11:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_expand_genotype_columns.py:26:1: E302 expected 2 blank lines, found 1 @@ -4444,13 +4377,12 @@ ./tests/tfscreen/genetics/test_library_manager.py:117:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:124:44: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:127:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/genetics/test_library_manager.py:144:52: E261 at least two spaces before inline comment +./tests/tfscreen/genetics/test_library_manager.py:144:45: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:153:1: W293 blank line contains whitespace -./tests/tfscreen/genetics/test_library_manager.py:169:24: E231 missing whitespace after ':' ./tests/tfscreen/genetics/test_library_manager.py:173:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:186:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:191:27: E221 multiple spaces before operator -./tests/tfscreen/genetics/test_library_manager.py:192:32: E221 multiple spaces before operator +./tests/tfscreen/genetics/test_library_manager.py:193:26: E221 multiple spaces before operator ./tests/tfscreen/genetics/test_library_manager.py:198:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:206:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:211:39: E261 at least two spaces before inline comment @@ -4458,7 +4390,7 @@ ./tests/tfscreen/genetics/test_library_manager.py:223:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:231:1: W293 blank line contains whitespace ./tests/tfscreen/genetics/test_library_manager.py:236:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/genetics/test_library_manager.py:241:50: E261 at least two spaces before inline comment +./tests/tfscreen/genetics/test_library_manager.py:241:47: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:245:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:257:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/genetics/test_library_manager.py:293:1: E302 expected 2 blank lines, found 1 @@ -4479,18 +4411,18 @@ ./tests/tfscreen/genetics/test_library_manager.py:384:35: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:385:36: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:387:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/genetics/test_library_manager.py:390:36: E261 at least two spaces before inline comment +./tests/tfscreen/genetics/test_library_manager.py:390:28: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:391:26: E222 multiple spaces after operator ./tests/tfscreen/genetics/test_library_manager.py:392:21: E222 multiple spaces after operator ./tests/tfscreen/genetics/test_library_manager.py:400:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/genetics/test_library_manager.py:403:38: E261 at least two spaces before inline comment +./tests/tfscreen/genetics/test_library_manager.py:403:30: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:404:36: E114 indentation is not a multiple of 4 (comment) ./tests/tfscreen/genetics/test_library_manager.py:404:36: E116 unexpected indentation (comment) ./tests/tfscreen/genetics/test_library_manager.py:405:36: E114 indentation is not a multiple of 4 (comment) ./tests/tfscreen/genetics/test_library_manager.py:405:36: E116 unexpected indentation (comment) ./tests/tfscreen/genetics/test_library_manager.py:406:36: E114 indentation is not a multiple of 4 (comment) ./tests/tfscreen/genetics/test_library_manager.py:406:36: E116 unexpected indentation (comment) -./tests/tfscreen/genetics/test_library_manager.py:407:39: E261 at least two spaces before inline comment +./tests/tfscreen/genetics/test_library_manager.py:407:31: E261 at least two spaces before inline comment ./tests/tfscreen/genetics/test_library_manager.py:408:26: E222 multiple spaces after operator ./tests/tfscreen/genetics/test_library_manager.py:409:21: E222 multiple spaces after operator ./tests/tfscreen/genetics/test_library_manager.py:417:1: E302 expected 2 blank lines, found 1 @@ -4730,31 +4662,6 @@ ./tests/tfscreen/mle/test_fit_manager.py:182:1: W293 blank line contains whitespace ./tests/tfscreen/mle/test_fit_manager.py:185:1: W293 blank line contains whitespace ./tests/tfscreen/mle/test_fit_manager.py:189:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:7:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:9:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:13:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:18:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:23:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:26:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:28:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:32:41: E261 at least two spaces before inline comment -./tests/tfscreen/mle/test_parse_patsy.py:35:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:40:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:42:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:47:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:49:39: E261 at least two spaces before inline comment -./tests/tfscreen/mle/test_parse_patsy.py:50:52: W291 trailing whitespace -./tests/tfscreen/mle/test_parse_patsy.py:52:57: W291 trailing whitespace -./tests/tfscreen/mle/test_parse_patsy.py:56:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:60:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:62:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:66:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:70:45: E261 at least two spaces before inline comment -./tests/tfscreen/mle/test_parse_patsy.py:71:1: W293 blank line contains whitespace -./tests/tfscreen/mle/test_parse_patsy.py:75:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/mle/test_parse_patsy.py:76:36: E261 at least two spaces before inline comment -./tests/tfscreen/mle/test_parse_patsy.py:77:35: E261 at least two spaces before inline comment -./tests/tfscreen/mle/test_parse_patsy.py:80:1: W293 blank line contains whitespace ./tests/tfscreen/mle/test_predict_with_error.py:2:1: F401 'pytest' imported but unused ./tests/tfscreen/mle/test_predict_with_error.py:6:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/mle/test_predict_with_error.py:11:1: E302 expected 2 blank lines, found 1 @@ -4851,30 +4758,30 @@ ./tests/tfscreen/plot/heatmap/test_heatmap_core.py:593:1: W293 blank line contains whitespace ./tests/tfscreen/plot/heatmap/test_heatmap_core.py:602:1: W293 blank line contains whitespace ./tests/tfscreen/plot/heatmap/test_heatmap_core.py:632:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:668:21: E128 continuation line under-indented for visual indent -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:680:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:684:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:687:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:690:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:703:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:706:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:710:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:713:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:715:46: E261 at least two spaces before inline comment +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:682:21: E128 continuation line under-indented for visual indent +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:694:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:698:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:701:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:704:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:717:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:720:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:724:1: W293 blank line contains whitespace ./tests/tfscreen/plot/heatmap/test_heatmap_core.py:727:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:730:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:736:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:740:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:746:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:768:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:771:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:777:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:786:10: E201 whitespace after '(' -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:787:10: E201 whitespace after '(' -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:788:10: E201 whitespace after '(' -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:789:10: E201 whitespace after '(' -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:800:1: W293 blank line contains whitespace -./tests/tfscreen/plot/heatmap/test_heatmap_core.py:803:30: W292 no newline at end of file +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:729:46: E261 at least two spaces before inline comment +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:741:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:744:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:750:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:754:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:760:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:782:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:785:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:791:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:800:10: E201 whitespace after '(' +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:801:10: E201 whitespace after '(' +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:802:10: E201 whitespace after '(' +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:803:10: E201 whitespace after '(' +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:814:1: W293 blank line contains whitespace +./tests/tfscreen/plot/heatmap/test_heatmap_core.py:817:30: W292 no newline at end of file ./tests/tfscreen/plot/heatmap/test_heatmaps.py:4:1: F401 'numpy as np' imported but unused ./tests/tfscreen/plot/heatmap/test_heatmaps.py:11:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/plot/heatmap/test_heatmaps.py:17:1: E302 expected 2 blank lines, found 1 @@ -5102,15 +5009,6 @@ ./tests/tfscreen/process_raw/test_fastq_to_counts.py:1091:1: W293 blank line contains whitespace ./tests/tfscreen/process_raw/test_fastq_to_counts.py:1099:1: W293 blank line contains whitespace ./tests/tfscreen/process_raw/test_fastq_to_counts.py:1104:45: W292 no newline at end of file -./tests/tfscreen/process_raw/test_process_counts_cli.py:16:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:25:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:44:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:68:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:82:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:89:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:96:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:102:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/process_raw/test_process_counts_cli.py:108:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/process_raw/test_process_fastq_cli.py:2:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/process_raw/test_process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/process_raw/test_process_fastq_cli.py:31:1: E302 expected 2 blank lines, found 1 @@ -5169,6 +5067,10 @@ ./tests/tfscreen/process_raw/test_process_fastq_cli.py:357:1: W293 blank line contains whitespace ./tests/tfscreen/process_raw/test_process_fastq_cli.py:360:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/process_raw/test_process_fastq_cli.py:368:78: W292 no newline at end of file +./tests/tfscreen/process_raw/test_process_presplit_cli.py:5:1: F401 'unittest.mock.MagicMock' imported but unused +./tests/tfscreen/process_raw/test_process_presplit_cli.py:80:41: E127 continuation line over-indented for visual indent +./tests/tfscreen/process_raw/test_process_presplit_cli.py:88:1: E303 too many blank lines (3) +./tests/tfscreen/process_raw/test_process_presplit_cli.py:113:37: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/growth/test_growth_linkage.py:50:16: E221 multiple spaces before operator ./tests/tfscreen/simulate/growth/test_growth_linkage.py:95:16: E221 multiple spaces before operator ./tests/tfscreen/simulate/growth/test_growth_linkage.py:154:16: E221 multiple spaces before operator @@ -5264,10 +5166,10 @@ ./tests/tfscreen/simulate/test_generate_presplit_data.py:162:36: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_generate_presplit_data.py:173:11: E221 multiple spaces before operator ./tests/tfscreen/simulate/test_generate_presplit_data.py:177:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:220:11: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_generate_presplit_data.py:225:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:227:31: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:229:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_generate_presplit_data.py:221:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_generate_presplit_data.py:226:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_generate_presplit_data.py:228:31: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_generate_presplit_data.py:230:33: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_library_prediction.py:47:41: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_library_prediction.py:290:5: F401 'numpy as np' imported but unused ./tests/tfscreen/simulate/test_library_prediction.py:439:16: E272 multiple spaces before keyword @@ -5463,6 +5365,136 @@ ./tests/tfscreen/simulate/test_thermo_to_growth.py:1525:9: F841 local variable 'G_out' is assigned to but never used ./tests/tfscreen/tfmodel/analysis/test_error_calibration.py:313:9: F401 'matplotlib.axes.Axes' imported but unused ./tests/tfscreen/tfmodel/analysis/test_error_calibration.py:355:9: F401 'matplotlib.axes.Axes' imported but unused +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:8:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:12:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:38:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:41:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:50:47: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:56:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:71:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:81:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:86:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:91:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:96:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py:117:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:8:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:30:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:37:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:50:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:53:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:57:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:63:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:69:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:75:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py:79:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:10:1: F401 'pytest' imported but unused +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:36:35: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:36:42: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:36:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:62:36: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:62:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:62:50: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:62:56: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:62:62: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:88:36: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:176:9: F841 local variable 'q_min' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extract_samples.py:373:9: F841 local variable 'rng' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:4:1: F401 'unittest.mock.call' imported but unused +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:11:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:16:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:30:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:38:71: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:43:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:46:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:65:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:71:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:73:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:79:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:86:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:88:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:93:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:99:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:101:57: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:102:35: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:103:10: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:103:10: E117 over-indented +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:105:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:115:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py:124:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:45:36: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:45:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:45:50: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:45:56: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:45:62: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:54:28: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:61:28: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:62:28: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:84:28: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:84:41: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:85:16: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:85:42: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:85:46: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:209:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:211:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:399:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:407:41: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:479:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:480:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:481:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py:482:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:6:1: F401 'unittest.mock.patch' imported but unused +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:9:24: W291 trailing whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:13:1: F401 'tfscreen.tfmodel.inference.posteriors.get_posterior_samples' imported but unused +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:15:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:26:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:52:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:65:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:76:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:97:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:144:51: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:164:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:182:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:206:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:209:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:215:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:224:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:268:5: F841 local variable 'first_param' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:270:5: F841 local variable 'param_name' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:282:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:285:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:288:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:294:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:299:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:312:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:316:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:335:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:375:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:381:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:388:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:391:9: F841 local variable 'ds' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:4:1: F401 'os' imported but unused +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:9:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:11:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:34:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:48:57: W291 trailing whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:50:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:51:43: W291 trailing whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:56:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:59:35: W291 trailing whitespace +./tests/tfscreen/tfmodel/analysis/test_h5_indexing.py:62:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:4:1: F401 'jax.numpy as jnp' imported but unused +./tests/tfscreen/tfmodel/analysis/test_prediction.py:6:1: F401 'unittest.mock.MagicMock' imported but unused +./tests/tfscreen/tfmodel/analysis/test_prediction.py:6:1: F401 'unittest.mock.patch' imported but unused +./tests/tfscreen/tfmodel/analysis/test_prediction.py:11:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:38:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:47:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:59:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:69:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:73:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:76:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:80:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:90:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/activity/test_fixed.py:23:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/activity/test_fixed.py:29:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/activity/test_fixed.py:36:1: E302 expected 2 blank lines, found 1 @@ -6486,6 +6518,21 @@ ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:166:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:169:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:185:1: W391 blank line at end of file +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:1:1: F401 'pytest' imported but unused +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:5:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:7:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:11:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:14:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:17:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:21:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:24:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:27:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:31:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:35:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:43:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:48:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py:54:1: E305 expected 2 blank lines after class or function definition, found 1 ./tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py:1:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py:1:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py:3:1: F401 'numpyro' imported but unused @@ -6580,10 +6627,487 @@ ./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:192:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:197:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:259:57: W292 no newline at end of file +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:16:1: F401 'numpy as np' imported but unused +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:18:1: F401 'pytest' imported but unused +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:21:1: F401 'numpyro.handlers.seed' imported but unused +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:54:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:61:15: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:61:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:61:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:62:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:62:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:62:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:63:18: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:63:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:63:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:64:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:76:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:81:18: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:81:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:81:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:82:18: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:82:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:82:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:83:18: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:83:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:83:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:84:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:104:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:105:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:127:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:128:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:130:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:136:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:141:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:150:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:151:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:178:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:179:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:190:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:212:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:227:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:228:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:230:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:231:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:235:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_loglikelihood.py:240:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_model.py:4:1: F401 'numpyro.handlers.seed' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.DataClass' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.PriorsClass' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.GrowthData' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.BindingData' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.GrowthPriors' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.BindingPriors' imported but unused +./tests/tfscreen/tfmodel/generative/test_model.py:11:53: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:29:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:36:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:41:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:58:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:65:47: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:66:61: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:67:53: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:68:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:73:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:76:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:79:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:80:61: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:81:49: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:82:48: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:83:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:84:67: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:85:82: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:86:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:117:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:130:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:137:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:141:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:144:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:147:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:152:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:155:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:158:76: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:161:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:166:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:172:25: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:176:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:182:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:184:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:186:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:189:42: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:198:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:201:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:210:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:213:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:219:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:224:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:226:35: W292 no newline at end of file +./tests/tfscreen/tfmodel/generative/test_model_math.py:16:1: F401 'numpyro.handlers.seed' imported but unused +./tests/tfscreen/tfmodel/generative/test_reference_math.py:29:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:32:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:75:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:76:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:77:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:78:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:79:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:80:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:81:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:148:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:148:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:148:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:149:27: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:149:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:149:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:150:29: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:150:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:151:26: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:151:26: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:151:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:160:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:160:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:160:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:161:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:161:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:162:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:162:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:163:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:163:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:163:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:175:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:179:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:179:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:179:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:180:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:180:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:181:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:181:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:182:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:182:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:182:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:186:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:196:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:196:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:196:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:197:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:197:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:198:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:198:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:199:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:199:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:199:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:218:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:218:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:218:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:219:27: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:219:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:219:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:220:29: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:220:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:221:26: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:221:26: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:221:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:225:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:225:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:225:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:226:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:226:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:227:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:227:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:228:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:228:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:228:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:232:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:248:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:248:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:248:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:249:27: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:249:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:249:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:250:29: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:250:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:251:26: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:251:26: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:251:31: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:254:22: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:254:22: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:254:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:255:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:255:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:256:23: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:256:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:257:19: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:257:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:257:25: E251 unexpected spaces around keyword / parameter equals +./tests/tfscreen/tfmodel/generative/test_reference_math.py:320:29: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/generative/test_reference_math.py:354:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:410:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:411:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:412:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:422:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:429:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/test_reference_math.py:432:13: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:5:1: F401 'numpyro.handlers' imported but unused +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.SVI' imported but unused +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.Trace_ELBO' imported but unused +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.Predictive' imported but unused +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:11:1: F401 'jax' imported but unused +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:14:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:20:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:26:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:30:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:34:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:37:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:45:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:61:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:65:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:74:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:78:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:81:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:83:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:85:50: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:86:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:86:49: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:87:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:87:46: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:88:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:89:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:92:48: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:94:53: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:106:63: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:107:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:107:49: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:108:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:108:46: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:109:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:110:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:118:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:126:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:176:5: F841 local variable 'num_titrants' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:179:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:184:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:187:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:190:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:192:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:193:50: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:194:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:194:48: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:195:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:195:46: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:196:24: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:197:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:199:54: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:201:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:205:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:210:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:217:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:223:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:225:5: F841 local variable 'svi' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:226:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:230:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:235:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:237:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:239:59: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:240:28: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:240:52: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:241:28: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:241:50: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:242:28: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:243:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py:247:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:6:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:16:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:20:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:22:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:27:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:32:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:37:14: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_posteriors.py:38:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:45:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:54:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:65:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:72:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:75:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:78:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:81:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_posteriors.py:86:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:95:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:101:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:108:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_posteriors.py:138:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:2:1: F401 'jax' imported but unused +./tests/tfscreen/tfmodel/inference/test_run_inference.py:5:1: F401 'pandas as pd' imported but unused +./tests/tfscreen/tfmodel/inference/test_run_inference.py:12:1: F401 'optax' imported but unused +./tests/tfscreen/tfmodel/inference/test_run_inference.py:13:1: F401 'numpyro.infer.autoguide.AutoLaplaceApproximation' imported but unused +./tests/tfscreen/tfmodel/inference/test_run_inference.py:16:1: F811 redefinition of unused 'SVIState' from line 14 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:19:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:23:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:30:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:33:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:39:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:44:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:54:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:58:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:61:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:62:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:65:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:67:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:72:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:77:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:80:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:82:18: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:83:27: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:90:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:97:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:108:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:112:128: E501 line too long (139 > 127 characters) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:115:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:123:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:126:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:131:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:134:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:139:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:144:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:146:18: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:147:28: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:154:75: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:158:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:161:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:164:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:168:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:172:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:176:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:180:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:184:70: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:185:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:187:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:189:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:192:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:196:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:200:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:208:35: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:209:37: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:210:35: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:211:37: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:215:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:217:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:221:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:225:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:228:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:234:71: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:234:80: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:235:36: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:236:36: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/inference/test_run_inference.py:238:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:240:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:241:78: W291 trailing whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:242:22: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_run_inference.py:245:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:249:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:254:5: E722 do not use bare 'except' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:256:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:259:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:262:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:267:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:269:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:271:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:279:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:320:32: E741 ambiguous variable name 'l' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:422:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:425:5: F841 local variable 'mock_seed' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_run_inference.py:426:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:434:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:439:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:443:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:447:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:451:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:455:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:458:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:466:1: E303 too many blank lines (3) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:475:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:482:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:555:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:903:25: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_run_inference.py:903:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:904:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:2:1: F401 'os' imported but unused +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:6:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:14:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:18:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:24:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:25:5: E303 too many blank lines (2) +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:27:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:42:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:62:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py:78:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:21:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:25:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:28:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:33:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:43:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:53:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:56:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:59:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:64:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:70:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:79:39: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:80:40: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:81:42: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:83:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:85:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:89:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:92:45: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:93:48: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:94:44: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:95:41: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:97:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:101:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:110:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:118:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:122:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:124:71: E203 whitespace before ',' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:125:1: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:126:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:133:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:135:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:138:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:146:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:149:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:149:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:149:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:149:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:155:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:155:49: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:163:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:163:54: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:165:128: E501 line too long (142 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:166:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:169:76: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:175:128: E501 line too long (150 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:187:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:187:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:187:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:187:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:242:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:244:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:375:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:390:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:398:124: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:398:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:401:9: F841 local variable 'mock_ri_class' is assigned to but never used +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:404:44: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:420:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/scripts/test_diagnose_nan_cli.py:77:64: E203 whitespace before ',' ./tests/tfscreen/tfmodel/scripts/test_extract_params_cli.py:14:1: F401 'numpyro.infer.svi.SVIState' imported but unused ./tests/tfscreen/tfmodel/scripts/test_fit_model_cli.py:5:1: F401 'dill' imported but unused ./tests/tfscreen/tfmodel/scripts/test_fit_model_cli.py:6:1: F401 'jax.numpy as jnp' imported but unused +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:16:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:42:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:78:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:88:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:100:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py:135:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py:4:1: F401 'os' imported but unused ./tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py:7:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py:11:1: F401 'tfscreen.tfmodel.inference.checkpoint_io.resolve_param_file' imported but unused @@ -6639,559 +7163,200 @@ ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1751:21: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py:79:9: F841 local variable 'data' is assigned to but never used ./tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py:183:91: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_batch.py:3:1: F401 'numpy as np' imported but unused -./tests/tfscreen/tfmodel/test_batch.py:4:1: F401 'collections.namedtuple' imported but unused -./tests/tfscreen/tfmodel/test_batch.py:14:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:17:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:24:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:27:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:33:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:37:16: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_batch.py:42:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:47:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:53:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:58:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:61:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:75:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:80:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:85:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:88:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:91:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:95:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:97:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:101:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:105:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:109:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:111:73: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_batch.py:113:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:119:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:122:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:124:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:127:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:131:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch.py:133:71: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_batch.py:138:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:140:5: F841 local variable 'full_array' is assigned to but never used -./tests/tfscreen/tfmodel/test_batch.py:140:52: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_batch.py:141:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch.py:142:46: W292 no newline at end of file -./tests/tfscreen/tfmodel/test_batch_consistency.py:1:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/test_batch_consistency.py:3:1: F401 'numpy as np' imported but unused -./tests/tfscreen/tfmodel/test_batch_consistency.py:5:1: F401 'numpyro.distributions as dist' imported but unused -./tests/tfscreen/tfmodel/test_batch_consistency.py:6:1: F401 'tfscreen.tfmodel.data_class.BindingData' imported but unused -./tests/tfscreen/tfmodel/test_batch_consistency.py:10:1: F401 'tfscreen.tfmodel.model_orchestrator.ModelOrchestrator' imported but unused -./tests/tfscreen/tfmodel/test_batch_consistency.py:12:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_consistency.py:17:5: F841 local variable 'batch_size' is assigned to but never used -./tests/tfscreen/tfmodel/test_batch_consistency.py:19:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:25:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:30:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:71:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:75:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:82:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_consistency.py:89:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:120:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:125:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:138:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:143:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_consistency.py:149:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:189:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_consistency.py:192:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:1:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/test_batch_fix.py:5:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_fix.py:8:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:14:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_fix.py:17:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:22:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_batch_fix.py:28:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:45:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:47:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:51:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:54:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_batch_fix.py:57:56: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_batch_fix.py:60:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:2:1: F401 'os' imported but unused -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:6:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:14:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:18:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:24:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:25:5: E303 too many blank lines (2) -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:27:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:42:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:62:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_checkpoint_protection.py:78:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:21:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:25:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:28:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:33:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:43:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:53:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:56:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:59:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:64:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:70:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:79:39: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:80:40: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:81:42: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:83:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:85:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:89:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:92:45: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:93:48: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:94:44: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:95:41: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:97:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:101:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:110:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:118:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:122:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:124:71: E203 whitespace before ',' -./tests/tfscreen/tfmodel/test_configure_and_run.py:125:1: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_configure_and_run.py:126:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:133:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:135:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:138:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:143:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:143:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:143:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:143:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:146:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:149:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:149:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:149:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:149:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:155:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:155:49: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:14: E117 over-indented -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:157:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:163:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:163:54: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:14: E117 over-indented -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:165:128: E501 line too long (142 > 127 characters) -./tests/tfscreen/tfmodel/test_configure_and_run.py:166:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_configure_and_run.py:169:76: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:14: E117 over-indented -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:175:128: E501 line too long (150 > 127 characters) -./tests/tfscreen/tfmodel/test_configure_and_run.py:187:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:187:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:187:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:187:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:242:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:244:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/test_configure_and_run.py:247:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/test_configure_and_run.py:375:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:390:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_configure_and_run.py:398:124: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:398:128: E501 line too long (130 > 127 characters) -./tests/tfscreen/tfmodel/test_configure_and_run.py:401:9: F841 local variable 'mock_ri_class' is assigned to but never used -./tests/tfscreen/tfmodel/test_configure_and_run.py:404:44: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_configure_and_run.py:420:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_congression_mask.py:1:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/test_congression_mask.py:5:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_congression_mask.py:7:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:11:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:14:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:17:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:21:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:24:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:27:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:31:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:35:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:43:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_congression_mask.py:48:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:51:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_congression_mask.py:54:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:3:1: F401 'numpy as np' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch.py:4:1: F401 'collections.namedtuple' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch.py:14:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:17:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:24:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:27:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:33:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:37:16: W291 trailing whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:42:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:47:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:53:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:58:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:61:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:75:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:80:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:85:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:88:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:91:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:95:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:97:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:101:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:105:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:109:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:111:73: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_batch.py:113:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:119:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:122:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:124:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:127:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:131:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch.py:133:71: W291 trailing whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:138:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:140:5: F841 local variable 'full_array' is assigned to but never used +./tests/tfscreen/tfmodel/tensors/test_batch.py:140:52: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_batch.py:141:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch.py:142:46: W292 no newline at end of file +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:1:1: F401 'pytest' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:3:1: F401 'numpy as np' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:5:1: F401 'numpyro.distributions as dist' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:6:1: F401 'tfscreen.tfmodel.data_class.BindingData' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:10:1: F401 'tfscreen.tfmodel.model_orchestrator.ModelOrchestrator' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:12:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:17:5: F841 local variable 'batch_size' is assigned to but never used +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:19:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:25:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:30:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:71:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:75:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:82:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:89:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:120:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:125:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:138:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:143:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:149:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:189:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_consistency.py:192:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:1:1: F401 'pytest' imported but unused +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:5:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:8:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:14:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:17:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:22:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:28:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:45:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:47:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:54:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:57:56: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_batch_fix.py:60:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:11:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:25:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:32:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:41:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:62:28: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:65:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:79:38: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:81:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:83:46: F541 f-string is missing placeholders +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:133:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py:137:44: W292 no newline at end of file +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:3:1: F401 'numpy as np' imported but unused +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:7:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:17:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:23:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:42:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:46:37: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:49:77: W291 trailing whitespace +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:56:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:65:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:76:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:84:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:90:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:99:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:103:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:108:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:116:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:119:69: W291 trailing whitespace +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:125:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:131:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:137:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:141:44: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/tensors/test_tensor_manager.py:145:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_data_class.py:11:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/test_data_class_jit.py:5:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/test_data_class_jit.py:8:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/test_data_class_jit.py:14:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/test_data_class_jit.py:24:54: E261 at least two spaces before inline comment ./tests/tfscreen/tfmodel/test_data_class_jit.py:87:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/test_data_class_jit.py:109:1: E305 expected 2 blank lines after class or function definition, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:8:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:12:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:38:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:41:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:50:47: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:51:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:56:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:71:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:81:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:86:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:91:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:96:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_growth_predictions.py:117:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:8:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:30:128: E501 line too long (130 > 127 characters) -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:37:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:50:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:53:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:57:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:63:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:69:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:75:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_parameters_congression.py:79:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_samples.py:10:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/test_extract_samples.py:36:35: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:36:42: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:36:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:62:36: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:62:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:62:50: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:62:56: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:62:62: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:88:36: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extract_samples.py:176:9: F841 local variable 'q_min' is assigned to but never used -./tests/tfscreen/tfmodel/test_extract_samples.py:373:9: F841 local variable 'rng' is assigned to but never used -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:4:1: F401 'unittest.mock.call' imported but unused -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:11:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:16:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:30:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:38:71: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:43:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:46:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:65:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:71:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:73:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:79:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:86:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:88:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:93:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:99:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:101:57: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:102:35: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:103:10: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:103:10: E117 over-indented -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:105:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:115:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extract_theta_curves.py:124:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_new_models.py:45:36: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:45:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:45:50: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:45:56: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:45:62: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:54:28: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:61:28: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:62:28: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:84:28: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:84:41: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:85:16: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:85:42: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:85:46: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_extraction_new_models.py:209:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:211:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:399:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:407:41: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:479:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:480:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:481:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_new_models.py:482:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_extraction_robustness.py:6:1: F401 'unittest.mock.patch' imported but unused -./tests/tfscreen/tfmodel/test_extraction_robustness.py:9:24: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:13:1: F401 'tfscreen.tfmodel.inference.posteriors.get_posterior_samples' imported but unused -./tests/tfscreen/tfmodel/test_extraction_robustness.py:15:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:26:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:52:128: E501 line too long (130 > 127 characters) -./tests/tfscreen/tfmodel/test_extraction_robustness.py:65:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:76:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:97:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:144:51: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_extraction_robustness.py:164:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:182:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:206:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:209:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:215:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:224:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:268:5: F841 local variable 'first_param' is assigned to but never used -./tests/tfscreen/tfmodel/test_extraction_robustness.py:270:5: F841 local variable 'param_name' is assigned to but never used -./tests/tfscreen/tfmodel/test_extraction_robustness.py:282:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:285:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:288:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:294:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:299:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:312:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:316:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:335:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:375:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:381:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_extraction_robustness.py:388:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_extraction_robustness.py:391:9: F841 local variable 'ds' is assigned to but never used -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:16:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:42:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:78:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:88:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:100:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_fit_model_helpers.py:135:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:5:1: F401 'numpyro.handlers' imported but unused -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.SVI' imported but unused -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.Trace_ELBO' imported but unused -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:7:1: F401 'numpyro.infer.Predictive' imported but unused -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:11:1: F401 'jax' imported but unused -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:14:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:20:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:26:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:30:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:34:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:37:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:45:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:61:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:65:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:74:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:78:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:81:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:83:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:85:50: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:86:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:86:49: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:87:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:87:46: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:88:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:89:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:92:48: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:94:53: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:106:63: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:107:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:107:49: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:108:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:108:46: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:109:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:110:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:118:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:126:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:176:5: F841 local variable 'num_titrants' is assigned to but never used -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:179:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:184:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:187:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:190:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:192:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:193:50: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:194:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:194:48: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:195:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:195:46: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:196:24: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:197:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:199:54: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:201:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:205:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:210:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:217:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:223:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:225:5: F841 local variable 'svi' is assigned to but never used -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:226:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:230:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:235:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:237:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:239:59: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:240:28: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:240:52: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:241:28: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:241:50: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:242:28: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:243:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_get_posteriors_mapping.py:247:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_h5_indexing.py:4:1: F401 'os' imported but unused -./tests/tfscreen/tfmodel/test_h5_indexing.py:9:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_h5_indexing.py:11:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:33:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:47:57: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:49:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:50:43: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:55:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:58:35: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_h5_indexing.py:61:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_loglikelihood.py:16:1: F401 'numpy as np' imported but unused -./tests/tfscreen/tfmodel/test_loglikelihood.py:18:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/test_loglikelihood.py:21:1: F401 'numpyro.handlers.seed' imported but unused -./tests/tfscreen/tfmodel/test_loglikelihood.py:54:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:61:15: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:61:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:61:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:62:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:62:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:62:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:63:18: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:63:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:63:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:64:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:76:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:81:18: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:81:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:81:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:82:18: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:82:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:82:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:83:18: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:83:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:83:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:84:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_loglikelihood.py:104:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:105:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:127:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:128:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:130:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:136:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:141:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:150:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:151:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:178:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:179:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:190:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:212:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:227:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:228:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:230:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:231:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:235:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_loglikelihood.py:240:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model.py:4:1: F401 'numpyro.handlers.seed' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.DataClass' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.PriorsClass' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.GrowthData' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.BindingData' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.GrowthPriors' imported but unused -./tests/tfscreen/tfmodel/test_model.py:10:1: F401 'tfscreen.tfmodel.data_class.BindingPriors' imported but unused -./tests/tfscreen/tfmodel/test_model.py:11:53: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model.py:29:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model.py:36:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:41:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model.py:58:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model.py:65:47: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:66:61: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:67:53: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:68:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:73:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:76:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:79:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:80:61: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:81:49: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:82:48: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:83:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:84:67: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:85:82: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:86:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:117:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model.py:130:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:137:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:141:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:144:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:147:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:152:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:155:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:158:76: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model.py:161:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:166:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:172:25: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:176:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:182:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:184:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:186:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:189:42: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model.py:198:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:201:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model.py:210:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:213:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:219:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:224:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model.py:226:35: W292 no newline at end of file -./tests/tfscreen/tfmodel/test_model_math.py:16:1: F401 'numpyro.handlers.seed' imported but unused ./tests/tfscreen/tfmodel/test_model_orchestrator.py:6:1: F401 'yaml' imported but unused ./tests/tfscreen/tfmodel/test_model_orchestrator.py:8:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/tfmodel/test_model_orchestrator.py:8:1: F401 'unittest.mock.ANY' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:32:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:35:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:36:24: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:50:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:59:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:75:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:83:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:96:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:99:74: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:103:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:109:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:113:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:125:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:148:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:165:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:295:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:318:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:324:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:326:76: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:349:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:357:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:358:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:368:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:48: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:50: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:52: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:54: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:56: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:58: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:374:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:382:112: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:382:128: E501 line too long (191 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:387:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:390:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:394:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:401:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:420:128: E501 line too long (198 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:425:128: E501 line too long (167 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:473:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:474:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:477:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:485:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:491:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:491:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:491:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:491:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:492:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:494:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:508:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:33:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:52:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:61:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:77:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:85:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:98:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:108:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:114:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:118:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:130:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:153:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:170:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:300:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:323:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:329:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:331:76: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:354:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:362:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:363:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:373:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:48: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:50: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:52: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:54: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:56: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:58: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:379:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:387:112: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:387:128: E501 line too long (191 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:392:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:395:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:399:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:406:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:425:128: E501 line too long (198 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:430:128: E501 line too long (167 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:478:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:479:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:482:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:490:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:497:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:499:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:501:86: W291 trailing whitespace ./tests/tfscreen/tfmodel/test_model_orchestrator.py:513:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:521:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:529:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:540:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:543:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:550:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:557:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:565:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:518:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:526:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:534:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:545:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:548:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:555:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:562:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/test_model_orchestrator.py:570:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/test_model_orchestrator.py:575:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:581:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:590:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:594:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:604:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:605:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:607:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:608:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:622:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:635:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:636:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:639:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:642:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:899:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:969:72: W292 no newline at end of file +./tests/tfscreen/tfmodel/test_model_orchestrator.py:580:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:586:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:595:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:599:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:609:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:610:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:612:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:613:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:625:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:627:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:631:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:640:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:641:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:644:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:647:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:910:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1307:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1551:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1558:10: W292 no newline at end of file ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:30:16: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:30:31: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:31:16: E221 multiple spaces before operator @@ -7201,292 +7366,50 @@ ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:34:16: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:35:32: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/test_needs_mut_wiring.py:115:16: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_populate_dataclass.py:11:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_populate_dataclass.py:25:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_populate_dataclass.py:32:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_populate_dataclass.py:41:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_populate_dataclass.py:62:28: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_populate_dataclass.py:65:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_populate_dataclass.py:79:38: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_populate_dataclass.py:81:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_populate_dataclass.py:83:46: F541 f-string is missing placeholders -./tests/tfscreen/tfmodel/test_populate_dataclass.py:133:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_populate_dataclass.py:137:44: W292 no newline at end of file -./tests/tfscreen/tfmodel/test_posteriors.py:6:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:16:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:20:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:22:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:27:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:32:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:37:14: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_posteriors.py:38:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:45:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:54:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:65:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:72:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:75:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:78:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:81:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_posteriors.py:86:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:95:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:101:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:108:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_posteriors.py:138:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:4:1: F401 'jax.numpy as jnp' imported but unused -./tests/tfscreen/tfmodel/test_prediction.py:6:1: F401 'unittest.mock.MagicMock' imported but unused -./tests/tfscreen/tfmodel/test_prediction.py:6:1: F401 'unittest.mock.patch' imported but unused -./tests/tfscreen/tfmodel/test_prediction.py:11:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:37:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:46:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:58:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:68:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:72:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_prediction.py:75:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_prediction.py:79:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_prediction.py:89:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/test_presplit.py:12:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/test_presplit.py:15:1: F401 'numpyro' imported but unused ./tests/tfscreen/tfmodel/test_presplit.py:24:1: F401 'tfscreen.tfmodel.data_class.DataClass' imported but unused ./tests/tfscreen/tfmodel/test_presplit.py:25:1: F401 'tfscreen.tfmodel.tensors.populate_dataclass.populate_dataclass' imported but unused -./tests/tfscreen/tfmodel/test_presplit.py:93:52: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:96:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:126:35: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:139:48: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:173:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:199:28: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:217:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_presplit.py:229:28: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_reference_math.py:29:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:32:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:75:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:76:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:77:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:78:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:79:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:80:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:81:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:148:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:148:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:148:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:149:27: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:149:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:149:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:150:29: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:150:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:151:26: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:151:26: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:151:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:160:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:160:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:160:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:161:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:161:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:162:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:162:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:163:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:163:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:163:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:175:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:179:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:179:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:179:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:180:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:180:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:181:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:181:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:182:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:182:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:182:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:186:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:196:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:196:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:196:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:197:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:197:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:198:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:198:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:199:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:199:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:199:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:218:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:218:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:218:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:219:27: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:219:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:219:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:220:29: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:220:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:221:26: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:221:26: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:221:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:225:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:225:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:225:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:226:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:226:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:227:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:227:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:228:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:228:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:228:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:232:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:248:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:248:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:248:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:249:27: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:249:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:249:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:250:29: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:250:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:251:26: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:251:26: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:251:31: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:254:22: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:254:22: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:254:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:255:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:255:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:256:23: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:256:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:257:19: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:257:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:257:25: E251 unexpected spaces around keyword / parameter equals -./tests/tfscreen/tfmodel/test_reference_math.py:320:29: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_reference_math.py:354:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:410:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:411:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:412:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:422:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:429:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_reference_math.py:432:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_registry.py:111:5: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_run_inference.py:2:1: F401 'jax' imported but unused -./tests/tfscreen/tfmodel/test_run_inference.py:5:1: F401 'pandas as pd' imported but unused -./tests/tfscreen/tfmodel/test_run_inference.py:12:1: F401 'optax' imported but unused -./tests/tfscreen/tfmodel/test_run_inference.py:13:1: F401 'numpyro.infer.autoguide.AutoLaplaceApproximation' imported but unused -./tests/tfscreen/tfmodel/test_run_inference.py:16:1: F811 redefinition of unused 'SVIState' from line 14 -./tests/tfscreen/tfmodel/test_run_inference.py:19:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:23:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:30:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:33:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:39:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:44:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:54:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:58:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:61:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:62:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:65:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:67:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:72:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:77:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:80:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:82:18: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:83:27: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:90:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:97:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:108:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:112:128: E501 line too long (139 > 127 characters) -./tests/tfscreen/tfmodel/test_run_inference.py:115:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:123:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:126:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:131:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:134:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:139:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:144:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:146:18: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:147:28: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:154:75: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:158:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:161:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:164:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:168:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:172:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:176:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:180:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:184:70: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:185:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:187:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:189:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:192:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:196:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:200:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:208:35: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:209:37: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:210:35: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:211:37: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:215:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:217:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:221:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:225:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:228:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:234:71: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:234:80: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:235:36: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:236:36: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_run_inference.py:238:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:240:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:241:78: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:242:22: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_run_inference.py:245:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:249:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:254:5: E722 do not use bare 'except' -./tests/tfscreen/tfmodel/test_run_inference.py:256:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:259:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:262:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:267:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:269:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_run_inference.py:271:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:279:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:320:32: E741 ambiguous variable name 'l' -./tests/tfscreen/tfmodel/test_run_inference.py:422:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:425:5: F841 local variable 'mock_seed' is assigned to but never used -./tests/tfscreen/tfmodel/test_run_inference.py:426:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:434:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:439:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:443:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:447:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:451:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:455:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:458:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_run_inference.py:466:1: E303 too many blank lines (3) -./tests/tfscreen/tfmodel/test_run_inference.py:475:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:482:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:555:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_run_inference.py:903:25: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_run_inference.py:903:26: E201 whitespace after '[' -./tests/tfscreen/tfmodel/test_run_inference.py:904:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/test_presplit.py:95:52: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:98:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:128:35: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:141:48: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:175:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:201:28: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:219:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:231:28: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/test_share_replicates.py:1:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/test_share_replicates.py:3:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/test_share_replicates.py:7:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/test_share_replicates.py:10:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:32:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:35:78: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_share_replicates.py:40:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:42:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:45:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:50:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:53:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:57:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:61:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_share_replicates.py:65:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:33:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:36:78: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_share_replicates.py:41:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:43:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:46:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:54:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:58:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:62:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_share_replicates.py:66:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/test_spiked_genotypes.py:5:1: F401 'jax.numpy as jnp' imported but unused ./tests/tfscreen/tfmodel/test_spiked_genotypes.py:7:1: F401 'unittest.mock.MagicMock' imported but unused ./tests/tfscreen/tfmodel/test_spiked_genotypes.py:7:1: F401 'unittest.mock.patch' imported but unused ./tests/tfscreen/tfmodel/test_spiked_genotypes.py:9:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:42:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:46:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:50:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:52:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:56:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:65:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:71:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:75:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:78:28: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:79:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:82:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:87:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:91:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_spiked_genotypes.py:94:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:43:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:47:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:53:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:57:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:66:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:72:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:76:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:79:28: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:80:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:83:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:88:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:92:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_spiked_genotypes.py:95:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/test_struct_wiring.py:40:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/test_struct_wiring.py:58:30: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/test_struct_wiring.py:59:16: E221 multiple spaces before operator @@ -7513,28 +7436,6 @@ ./tests/tfscreen/tfmodel/test_struct_wiring.py:390:20: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/test_struct_wiring.py:401:13: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/test_struct_wiring.py:448:13: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_tensor_manager.py:3:1: F401 'numpy as np' imported but unused -./tests/tfscreen/tfmodel/test_tensor_manager.py:7:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:17:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:23:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:42:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:46:37: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_tensor_manager.py:49:77: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_tensor_manager.py:56:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:65:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:76:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:84:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:90:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_tensor_manager.py:99:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:103:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_tensor_manager.py:108:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:116:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:119:69: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_tensor_manager.py:125:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:131:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:137:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_tensor_manager.py:141:44: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_tensor_manager.py:145:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/util/cli/test_generalized_main.py:1:1: F401 'argparse' imported but unused ./tests/tfscreen/util/cli/test_generalized_main.py:7:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/util/cli/test_generalized_main.py:10:9: F841 local variable 'mock_fcn' is assigned to but never used @@ -7758,7 +7659,7 @@ ./tests/tfscreen/util/validation/test_check.py:8:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/util/validation/test_check.py:26:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/util/validation/test_check.py:75:70: W292 no newline at end of file -50 C901 'cat_fit' is too complex (19) +49 C901 'cat_fit' is too complex (19) 15 E111 indentation is not a multiple of 4 6 E114 indentation is not a multiple of 4 (comment) 6 E116 unexpected indentation (comment) @@ -7766,27 +7667,27 @@ 1 E122 continuation line missing indentation or outdented 2 E124 closing bracket does not match visual indentation 6 E125 continuation line with same indent as next logical line -180 E127 continuation line over-indented for visual indent -79 E128 continuation line under-indented for visual indent +186 E127 continuation line over-indented for visual indent +78 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' 28 E202 whitespace before ']' 6 E203 whitespace before ',' -5 E211 whitespace before '(' -1832 E221 multiple spaces before operator +4 E211 whitespace before '(' +1833 E221 multiple spaces before operator 26 E222 multiple spaces after operator 8 E225 missing whitespace around operator -1115 E231 missing whitespace after ',' +1102 E231 missing whitespace after ',' 103 E251 unexpected spaces around keyword / parameter equals 14 E252 missing whitespace around parameter equals -229 E261 at least two spaces before inline comment +225 E261 at least two spaces before inline comment 1 E262 inline comment should start with '# ' 2 E265 block comment should start with '# ' 2 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword 1 E301 expected 1 blank line, found 0 -801 E302 expected 2 blank lines, found 1 -50 E303 too many blank lines (2) +784 E302 expected 2 blank lines, found 1 +51 E303 too many blank lines (2) 16 E305 expected 2 blank lines after class or function definition, found 1 29 E306 expected 1 blank line before a nested definition, found 0 1 E401 multiple imports on one line @@ -7798,12 +7699,12 @@ 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def 20 E741 ambiguous variable name 'l' -231 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +234 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused 11 F541 f-string is missing placeholders 4 F811 redefinition of unused 'np' from line 1 41 F841 local variable 'e' is assigned to but never used -669 W291 trailing whitespace +638 W291 trailing whitespace 86 W292 no newline at end of file -1673 W293 blank line contains whitespace -29 W391 blank line at end of file -7760 +1630 W293 blank line contains whitespace +30 W391 blank line at end of file +7661 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index f9e68b49..895ef5b3 100644 --- a/reports/junit/junit.xml +++ b/reports/junit/junit.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/tfscreen/genetics/library_manager.py b/src/tfscreen/genetics/library_manager.py index e1a9c67c..7bd14277 100644 --- a/src/tfscreen/genetics/library_manager.py +++ b/src/tfscreen/genetics/library_manager.py @@ -84,8 +84,8 @@ def _check_contiguous_lib_blocks(s: str) -> None: # then its occurrences are not contiguous. if char in seen_chars: raise ValueError( - f"Sub-library '{char}' is not in a contiguous block. Each sub-" - f"library must (except filler '.') must be contiguous. For " + f"Tile '{char}' is not in a contiguous block. Each tile " + f"(except filler '.') must be contiguous. For " f"example, ..111..22.. is allowed but ..11.1..22.. is not." ) @@ -96,49 +96,49 @@ def _check_contiguous_lib_blocks(s: str) -> None: def _check_lib_key(lib_key: str, libraries_seen: Set[str]) -> None: """ - Validates the format of a library combination key. + Validates the format of a tile combination key. A valid key must be in the format 'single-x' or 'double-x-y', where - 'x' and 'y' are characters representing sub-libraries that have been + 'x' and 'y' are characters representing tiles that have been defined in the main configuration. Parameters ---------- lib_key : str - The library combination key string to validate (e.g., 'single-1', + The tile combination key string to validate (e.g., 'single-1', 'double-1-2'). libraries_seen : set[str] - A set of all valid sub-library characters found in the - 'sub_libraries' configuration string. + A set of all valid tile characters found in the + 'tiles' configuration string. Raises ------ ValueError If the key has an invalid format, specifies an unknown command, has - the wrong number of parts, or references a sub-library that does + the wrong number of parts, or references a tile that does not exist. """ parts = lib_key.strip().split("-") command = parts[0] - + # Generic help text for error messages help_text = ( "Keys must be 'single-x' or 'double-x-y', where x and y are " - "defined sub-libraries." + "defined tiles." ) if command == "single": if len(parts) != 2: raise ValueError( f"Invalid key '{lib_key}'. 'single' keys must have one " - f"sub-library part. {help_text}" + f"tile part. {help_text}" ) elif command == "double": if len(parts) != 3: raise ValueError( f"Invalid key '{lib_key}'. 'double' keys must have two " - f"sub-library parts. {help_text}" + f"tile parts. {help_text}" ) else: raise ValueError( @@ -146,13 +146,13 @@ def _check_lib_key(lib_key: str, f"Command must be 'single' or 'double'." ) - # Check if all specified sub-libraries are valid + # Check if all specified tiles are valid sub_libs = parts[1:] for lib_id in sub_libs: if lib_id not in libraries_seen: raise ValueError( - f"Unrecognized sub-library '{lib_id}' in key '{lib_key}'. " - f"Valid libraries are: {sorted(list(libraries_seen))}. " + f"Unrecognized tile '{lib_id}' in key '{lib_key}'. " + f"Valid tiles are: {sorted(list(libraries_seen))}. " f"{help_text}" ) @@ -163,8 +163,8 @@ class LibraryManager: "first_amplicon_residue", "wt_seq", "degen_sites", - "sub_libraries", - "library_combos"] + "tiles", + "tile_combos"] def __init__(self,run_config): @@ -208,9 +208,9 @@ def _parse_and_validate(self, - `first_amplicon_residue` - `wt_seq` - `degen_sites` - - `sub_libraries` + - `tiles` - `libraries_seen` - - `library_combos` + - `tile_combos` - `expected_length` - `aa_seq` - `degen_seq` @@ -257,55 +257,55 @@ def _parse_and_validate(self, degen_sites = "".join(str(run_config["degen_sites"]).split()) _check_char(degen_sites,"degen_sites",self.degen_plus_dot) - # Load sub-libraries - sub_libraries = "".join(str(run_config["sub_libraries"]).split()) - _check_contiguous_lib_blocks(sub_libraries) - libraries_seen = set(list(sub_libraries)) - {"."} - + # Load tiles + tiles = "".join(str(run_config["tiles"]).split()) + _check_contiguous_lib_blocks(tiles) + libraries_seen = set(list(tiles)) - {"."} + # Now do some cross-validation between seqs - if len(wt_seq) != len(degen_sites) or len(wt_seq) != len(sub_libraries): - raise ValueError("wt_seq, degen_sites, and sub_libraries must all be the same length") - - # Go through each column and makes sure that degenerate bases are only in - # sub-libraries. Build the error message on the fly by putting "!" in every - # problem column. + if len(wt_seq) != len(degen_sites) or len(wt_seq) != len(tiles): + raise ValueError("wt_seq, degen_sites, and tiles must all be the same length") + + # Go through each column and makes sure that degenerate bases are only in + # tiles. Build the error message on the fly by putting "!" in every + # problem column. status = [] for i in range(len(list(wt_seq))): - - # degen_sites must be standard bases unless they are part of a sub_library + + # degen_sites must be standard bases unless they are part of a tile if degen_sites[i] not in self.standard_plus_dot: - if sub_libraries[i] == ".": + if tiles[i] == ".": status.append("!") continue status.append(" ") - - # Problem. Build error message and return. + + # Problem. Build error message and return. if "!" in status: - err = "".join(["Degenerate bases are only allowed within sub_libraries.", + err = "".join(["Degenerate bases are only allowed within tiles.", "The problematic columns are indicated with '!' below:\n"]) - + final_err = "\n".join([err, - "".join(status),wt_seq,degen_sites,sub_libraries, + "".join(status),wt_seq,degen_sites,tiles, "\n"]) raise ValueError(final_err) - + self.wt_seq = wt_seq self.degen_sites = degen_sites - self.sub_libraries = sub_libraries + self.tiles = tiles self.libraries_seen = libraries_seen - - # -- Deal with library specification -- - - # Check library combos - if isinstance(run_config["library_combos"],str) or not hasattr(run_config["library_combos"],"__iter__"): + + # -- Deal with tile combination specification -- + + # Check tile combos + if isinstance(run_config["tile_combos"],str) or not hasattr(run_config["tile_combos"],"__iter__"): raise ValueError( - f"library_combos should be a list of strings of library combinations. " - f"library_combos '{run_config['library_combos']}' is not valid." + f"tile_combos should be a list of strings of tile combinations. " + f"tile_combos '{run_config['tile_combos']}' is not valid." ) - self.library_combos = [] - for lib_key in run_config["library_combos"]: + self.tile_combos = [] + for lib_key in run_config["tile_combos"]: _check_lib_key(lib_key,self.libraries_seen) - self.library_combos.append(lib_key) + self.tile_combos.append(lib_key) # -- Build sequences useful for later -- @@ -328,13 +328,13 @@ def _prepare_blocks(self) -> None: """ Processes sequence definitions to create combinatorial blocks. - This method iterates through the `self.sub_libraries` string and + This method iterates through the `self.tiles` string and constructs three parallel lists that represent the entire sequence as a series of blocks. These blocks are the fundamental units used for combinatorially generating mutant libraries. For wild-type regions (marked with '.'), each base is treated as a - separate, single-character block. For sub-library regions (e.g., '111'), + separate, single-character block. For tile regions (e.g., '111'), the entire contiguous region is processed at once by a helper method to generate blocks corresponding to codons. @@ -351,18 +351,18 @@ def _prepare_blocks(self) -> None: identical. For degenerate codon blocks, the inner list contains all possible codon sequences (e.g., `['gct', 'gcc', 'gca', 'gcg']`). self.lib_lookup : list[str] - A parallel list that maps each block index to its sub-library + A parallel list that maps each block index to its tile identifier (e.g., '.', '1', '2'). """ - + wt_blocks = [] mut_blocks = [] lib_lookup = [] - + current_sub_lib = None - for i in range(len(self.sub_libraries)): - - sub_lib = self.sub_libraries[i] + for i in range(len(self.tiles)): + + sub_lib = self.tiles[i] if sub_lib == ".": wt_blocks.append([self.wt_seq[i]]) mut_blocks.append([self.wt_seq[i]]) @@ -385,9 +385,9 @@ def _prepare_blocks(self) -> None: def _prepare_indiv_lib_blocks(self, lib_to_get: str) -> Tuple[List[List[str]], List[List[str]]]: """ - Generates wt and mut blocks for a single contiguous sub-library. + Generates wt and mut blocks for a single contiguous tile. - This method isolates a specific sub-library region (e.g., all '1's), + This method isolates a specific tile region (e.g., all '1's), aligns it to the instance's reading frame, and processes it into combinatorial blocks. It handles out-of-frame bases by separating them into non-combinatorial "flank" blocks and ensures these flanks do not @@ -396,7 +396,7 @@ def _prepare_indiv_lib_blocks(self, lib_to_get: str) -> Tuple[List[List[str]], L Parameters ---------- lib_to_get : str - The character identifier for the sub-library to process (e.g., '1'). + The character identifier for the tile to process (e.g., '1'). Returns ------- @@ -413,13 +413,13 @@ def _prepare_indiv_lib_blocks(self, lib_to_get: str) -> Tuple[List[List[str]], L not standard 'a', 'c', 'g', or 't' bases). """ - # Get list indexes for the sub library - indexes = [i for i in range(len(self.sub_libraries)) - if self.sub_libraries[i] == lib_to_get] + # Get list indexes for the tile + indexes = [i for i in range(len(self.tiles)) + if self.tiles[i] == lib_to_get] start_idx = indexes[0] end_idx = indexes[-1] + 1 - # Get the degenerate sites and wildtype sequences for this sub-library + # Get the degenerate sites and wildtype sequences for this tile lib_seq = "".join(d if d != '.' else w for d, w in zip(self.degen_sites[start_idx:end_idx], self.wt_seq[start_idx:end_idx])) @@ -459,7 +459,7 @@ def _prepare_indiv_lib_blocks(self, lib_to_get: str) -> Tuple[List[List[str]], L _check_char(flank, name, self.standard_bases) except ValueError as e: raise ValueError( - f"Degenerate bases must be within codons within a sub-library. " + f"Degenerate bases must be within codons within a tile. " f"Sequence '{flank}' is out of the main reading frame " f"({self.reading_frame}) but has non-standard bases." ) from e @@ -507,8 +507,8 @@ def _prepare_indexes(self): attributes: self.indexers : dict[str, list[int]] - A dictionary mapping each sub-library identifier (e.g., '1') to a - list of the integer indices where that library's blocks appear in + A dictionary mapping each tile identifier (e.g., '1') to a + list of the integer indices where that tile's blocks appear in the main block lists (`wt_blocks`, `mut_blocks`). self.residues : list[str] A list of strings, where each string is the amino acid residue @@ -570,17 +570,17 @@ def _convert_to_aa(self, lib_seqs: List[str]) -> List[str]: def _get_singles(self, target_lib: str) -> Tuple[List[str], List[str]]: """ - Generates all single mutants for a specific sub-library. + Generates all single mutants for a specific tile. This method iterates through each mutable block defined for the target - sub-library. For each block, it generates all possible full-length DNA + tile. For each block, it generates all possible full-length DNA sequences where only that single block is mutated. The results from all blocks are combined into a single list. Parameters ---------- target_lib : str - The identifier of the sub-library (e.g., '1') for which to + The identifier of the tile (e.g., '1') for which to generate single mutants. Returns @@ -597,7 +597,7 @@ def _get_singles(self, target_lib: str) -> Tuple[List[str], List[str]]: `self.wt_blocks`, and `self.mut_blocks`. It calls the helper method `self._convert_to_aa` for the final translation step. The wild-type sequence will be present in the output list once for - each mutable position in the sub-library. + each mutable position in the tile. """ @@ -616,16 +616,16 @@ def _get_singles(self, target_lib: str) -> Tuple[List[str], List[str]]: def _get_intra_doubles(self, target_lib: str) -> Tuple[List[str], List[str]]: """ - Generates all double-mutant combinations within a single sub-library. + Generates all double-mutant combinations within a single tile. This method iterates through all unique pairs of mutable blocks within the - target sub-library. For each pair, it generates all possible full-length + target tile. For each pair, it generates all possible full-length DNA sequences. Parameters ---------- target_lib : str - The identifier of the sub-library (e.g., '1') in which to + The identifier of the tile (e.g., '1') in which to generate double mutants. Returns @@ -665,18 +665,18 @@ def _get_intra_doubles(self, target_lib: str) -> Tuple[List[str], List[str]]: def _get_inter_doubles(self, target_lib_1: str, target_lib_2: str) -> Tuple[List[str], List[str]]: """ - Generates all double-mutant combinations between two sub-libraries. + Generates all double-mutant combinations between two tiles. This method iterates through all pairs of mutable blocks where one block - is from the first sub-library and the other is from the second. For + is from the first tile and the other is from the second. For each pair, it generates all possible full-length DNA sequences. Parameters ---------- target_lib_1 : str - The identifier of the first sub-library (e.g., '1'). + The identifier of the first tile (e.g., '1'). target_lib_2 : str - The identifier of the second sub-library (e.g., '2'). + The identifier of the second tile (e.g., '2'). Returns ------- @@ -755,9 +755,9 @@ def get_libraries(self) -> Tuple[Dict[str, List[str]], Dict[str, List[str]]]: Generates all libraries specified in the run configuration. This is the main method to generate the libraries after the class - has been initialized. It iterates through the `library_combos` list + has been initialized. It iterates through the `tile_combos` list from the configuration and calls the appropriate internal methods to - generate single, intra-library double, or inter-library double mutants. + generate single, intra-tile double, or inter-tile double mutants. It also grabs any spiked sequences defined in the input. Returns @@ -774,8 +774,8 @@ def get_libraries(self) -> Tuple[Dict[str, List[str]], Dict[str, List[str]]]: all_lib_seqs = {} all_aa_muts = {} - # Go through every library combo (single-1, double-1-2, etc.) - for k in self.library_combos: + # Go through every tile combo (single-1, double-1-2, etc.) + for k in self.tile_combos: cols = k.split("-") diff --git a/src/tfscreen/mle/__init__.py b/src/tfscreen/mle/__init__.py index ede64f9f..80c5e7c7 100644 --- a/src/tfscreen/mle/__init__.py +++ b/src/tfscreen/mle/__init__.py @@ -14,6 +14,3 @@ FitManager ) -from .parse_patsy import ( # noqa: F401 - parse_patsy -) diff --git a/src/tfscreen/mle/parse_patsy.py b/src/tfscreen/mle/parse_patsy.py deleted file mode 100644 index 324cbb39..00000000 --- a/src/tfscreen/mle/parse_patsy.py +++ /dev/null @@ -1,147 +0,0 @@ - -import numpy as np -import pandas as pd - -import re - -def parse_patsy(df, - patsy_param_names, - model_terms, - factor_terms): - """ - Parse Patsy parameter names to extract factor information. - - This function parses Patsy-generated parameter names to extract information - about the underlying factors and their values. It identifies categorical - variables encoded in the Patsy formula and extracts the corresponding - factor columns and values from the input DataFrame. - - Parameters - ---------- - df : pandas.DataFrame - The input DataFrame used in the Patsy model. This is used to coerce - the factor values to the correct datatype. - patsy_param_names : list of str - A list of Patsy-generated parameter names (e.g., from `design_info.column_names`). - model_terms : dict - A dictionary mapping pretty parameter names to unique Patsy gobbledygook. - factor_terms : dict - A dictionary mapping parameter classes to factor terms. - - Returns - ------- - pandas.DataFrame - A DataFrame containing parsed parameter information, with columns: - - 'param_idx': Integer index of the parameter. - - 'patsy_name': The original Patsy parameter name. - - 'param_class': The class of the parameter. - - [factor_column]: Additional columns for each factor column, - containing the factor value for each parameter (None if not applicable). - - Raises - ------ - RuntimeError - If there is a problem parsing the Patsy parameter names or extracting - factors, or if there is a problem coercing the factor values. - """ - - # Dictionary keys unique patsy gobblygook to pretty parameter names - patsy_to_pretty = dict([(value,key) - for key, value in model_terms.items()]) - - # Some regex we use in parsing - bracket_search = re.compile("\\[.*?\\]") - quote_search = re.compile("[\'\"]") - - # Lists will store output for each parameter as we generate it - raw_param_names = [] - param_classes = [] - factor_columns = [] - factor_values = [] - columns_seen = [] - - for param in patsy_param_names: - - # If we hit a parameter with [...], it's a real categorical variable - hit = bracket_search.search(param) - if hit: - - # Pop out match: red[stuff]blue -> redblue - key = "".join(bracket_search.split(param)) - - # Get the class of this parameter - param_class = patsy_to_pretty[key] - - # Get the factors associated with this parameter - param_factors = factor_terms[param_class] - - # Get everything inside [ ... ]: [stuff] -> stuff - specifier = hit.group()[1:-1].strip() - - # Get rid of T. level indicator - if specifier.startswith("T."): - specifier = specifier[2:] - - if isinstance(param_factors,str): - param_factors = [param_factors] - specifier = [specifier] - - # If this looks like a tuple, split it into individual values, stripping - # commas and spaces. - if specifier[0] == "(" and specifier[-1] == ")": - specifier = [s.strip() for s in specifier[1:-1].split(",")] - specifier = [quote_search.sub("",s) for s in specifier] - - # If this is true, we screwed up parsing somewhere. - if len(specifier) != len(param_factors): - err = "There was problem parsing the patsy paramter names and\n" - err += "extracting factors.\n" - raise RuntimeError(err) - - # Go through parameter factors - for i, col in enumerate(param_factors): - - # If the column is in the input dataframe, coerce the factor to - # the value of the data type. (There won't always be a column - # from the dataframe, but I think we're safe assuming that, if - # the factor shares a name with the column, it came from that - # column. This means the final dataframe will have the right - # types for lookups in the original dataframe. - if col in df: - - try: - specifier[i] = df[col].dtype.type(specifier[i]) - except Exception as e: - err = "There was a problem coercing the factor values\n" - err += "extracted from the patsy parameter names.\n" - raise RuntimeError(err) from e - - # Record information - raw_param_names.append(param.strip()) - param_classes.append(param_class) - factor_columns.append(param_factors) - factor_values.append(specifier) - columns_seen.extend(param_factors) - - # Generate a dataframe that lets us look up position parameters in params - # array (param_idx), the full patsy name of the parameter, and the - # parameter class. - out_dict = {"param_idx":np.arange(len(raw_param_names),dtype=int), - "patsy_name":raw_param_names, - "param_class":param_classes} - - # Create a unique list of all factor columns seen and append to the dataframe - columns_seen = list(set(columns_seen)) - columns_seen.sort() - for c in columns_seen: - out_dict[c] = [None for _ in range(len(param_classes))] - - # Populate the factor columns. After this operation, the - # param_class + factor_columns will uniquely define each parameter in a - # factorized pandas way - for i in range(len(factor_columns)): - col = factor_columns[i] - for j in range(len(col)): - out_dict[col[j]][i] = factor_values[i][j] - - return pd.DataFrame(out_dict) diff --git a/src/tfscreen/process_raw/__init__.py b/src/tfscreen/process_raw/__init__.py index c1b2d8f2..1c124ea8 100644 --- a/src/tfscreen/process_raw/__init__.py +++ b/src/tfscreen/process_raw/__init__.py @@ -2,3 +2,4 @@ from .counts_to_lncfu import counts_to_lncfu # noqa: F401 from .scripts.process_counts_cli import process_counts # noqa: F401 from .scripts.process_fastq_cli import process_fastq # noqa: F401 +from .scripts.process_presplit_cli import process_presplit # noqa: F401 diff --git a/src/tfscreen/process_raw/_counts_io.py b/src/tfscreen/process_raw/_counts_io.py new file mode 100644 index 00000000..5dc80ba2 --- /dev/null +++ b/src/tfscreen/process_raw/_counts_io.py @@ -0,0 +1,149 @@ +import tfscreen + +import glob +import os +from typing import Union + +import pandas as pd +from tqdm.auto import tqdm + + +def _prep_sample_df( + sample_df: Union[pd.DataFrame, str], + counts_csv_path: str, + counts_glob_prefix: str = "counts", + verbose: bool = True +) -> pd.DataFrame: + """ + Validate input paths and sample_df, matching samples to CSV files. + + This function reads a sample dataframe and cross-references it with files + in a specified directory. It ensures that exactly one observation CSV file + exists for each sample ID. If validation passes, it adds an 'obs_file' + column to the dataframe with the full path to each matched file. + + Parameters + ---------- + sample_df : pandas.DataFrame or str + The sample dataframe or a path to it. Must contain a 'sample' column. + counts_csv_path : str + The path to the directory containing the observation CSV files. + counts_glob_prefix : str, default "counts" + The prefix used for globbing to find observation files. + verbose : bool, default True + If True, print a summary of matched samples and files. + + Returns + ------- + pandas.DataFrame + The validated and updated sample dataframe, indexed by 'sample' and + containing an 'obs_file' column. + + Raises + ------ + FileNotFoundError + If `counts_csv_path` is not a valid directory. + ValueError + If the 'sample' column in `sample_df` is not unique, or if any sample + is missing a corresponding file or has multiple ambiguous file matches. + """ + + # Load sample_df, making sure the sample_df index is set to the sample + # column. + sample_df = tfscreen.util.io.read_dataframe(sample_df, index_column="sample") + + # Make sure that the sample_df is indexed by sample + if not sample_df.index.name == "sample": + raise ValueError("sample_df must be indexed by 'sample'") + + # Make sure the sample index is unique + if not sample_df.index.is_unique: + dups = (sample_df.index[sample_df.index.duplicated(keep=False)] + .unique().tolist()) + raise ValueError(f"samples must be unique. Duplicates: {dups}") + + # Make sure counts_csv_path is sane + if not os.path.isdir(counts_csv_path): + raise FileNotFoundError( + f"counts_csv_path '{counts_csv_path}' is not a directory." + ) + + # Make sure that exactly one expected csv file is in the counts_csv_path + # for each sample. + error_messages = [] + all_files_found = {} + for s in sample_df.index: + + # The glob pattern looks for files containing the sample ID. + # e.g., 'path/to/csvs/counts_sample1_data.csv' + file_pattern = os.path.join(counts_csv_path, f"{counts_glob_prefix}*{s}*.csv") + files_found = glob.glob(file_pattern) + + # No files were found for the sample. + if len(files_found) == 0: + error_messages.append( + f" - MISSING: No files found for sample '{s}'." + ) + # More than one file was found for the sample. + elif len(files_found) > 1: + error_messages.append( + f" - AMBIGUOUS: {len(files_found)} files found for sample '{s}'. Expected 1. (Found: {files_found})" + ) + # Correct number of files + else: + all_files_found[s] = files_found[0] + + # Load the obs files into the sample dataframe + sample_df["obs_file"] = sample_df.index.map(all_files_found) + + # If any errors, combine and raise + if error_messages: + header = f"File validation failed with {len(error_messages)} error(s):" + full_error_message = "\n".join([header] + error_messages) + raise ValueError(full_error_message) + + # Print out some information so the user gets a visual indication of + # what the processor saw + if verbose: + + msg = [f"Sample dataframe has {len(sample_df)} unique samples with", + f"matched observation csv files.\n"] + print(" ".join(msg)) + for sample in all_files_found: + print(f"{sample:40s} : {all_files_found[sample]}") + print() + + return sample_df + + +def _aggregate_counts( + sample_df: Union[pd.DataFrame, str], +) -> pd.DataFrame: + """ + Builds a combined dataframe holding all counts for all samples. + + Parameters + ---------- + sample_df : pandas.DataFrame or str + The sample dataframe or a path to it. Must contain a 'sample' column. + + Returns + ------- + pandas.DataFrame + Long-form counts DataFrame with columns 'sample', 'genotype', and + 'counts', concatenated across all samples. + """ + + counts_dfs = [] + for s in tqdm(sample_df.index): + + # Parse the input csv + df = pd.read_csv(sample_df.loc[s, "obs_file"]) + df["sample"] = s + df = df[["sample", "genotype", "counts"]] + + counts_dfs.append(df) + + counts_df = pd.concat(counts_dfs, ignore_index=True) + + return counts_df diff --git a/src/tfscreen/process_raw/fastq_to_counts.py b/src/tfscreen/process_raw/fastq_to_counts.py index dae3d460..d38889b9 100644 --- a/src/tfscreen/process_raw/fastq_to_counts.py +++ b/src/tfscreen/process_raw/fastq_to_counts.py @@ -211,7 +211,7 @@ def _initialize_expected_seq(self): self.expected_length = self._lm.expected_length # Get dna and amino acid sequences specified by library. These come out - # as dictionaries with sub-libraries as keys and sequences as values. + # as dictionaries with tile combo keys and sequences as values. # dna_lib will look like: # {"single-1":["atcga...","atccg...","atcgg...",...],...}. # aa_lib will look like: diff --git a/src/tfscreen/process_raw/scripts/process_counts_cli.py b/src/tfscreen/process_raw/scripts/process_counts_cli.py index 6a200b2e..18646491 100644 --- a/src/tfscreen/process_raw/scripts/process_counts_cli.py +++ b/src/tfscreen/process_raw/scripts/process_counts_cli.py @@ -1,154 +1,12 @@ -import tfscreen - from tfscreen.process_raw import counts_to_lncfu +from tfscreen.process_raw._counts_io import _prep_sample_df, _aggregate_counts from tfscreen.util.cli import generalized_main from tfscreen.util.dataframe import check_columns - -import glob -import os -from typing import Union, Tuple - -import pandas as pd -from tqdm.auto import tqdm - - -def _prep_sample_df( - sample_df: Union[pd.DataFrame, str], - counts_csv_path: str, - counts_glob_prefix: str = "obs", - verbose: bool = True -) -> pd.DataFrame: - """ - Validate input paths and sample_df, matching samples to CSV files. - - This function reads a sample dataframe and cross-references it with files - in a specified directory. It ensures that exactly one observation CSV file - exists for each sample ID. If validation passes, it adds an 'obs_file' - column to the dataframe with the full path to each matched file. - - Parameters - ---------- - sample_df : pandas.DataFrame or str - The sample dataframe or a path to it. Must contain a 'sample' column. - counts_csv_path : str - The path to the directory containing the observation CSV files. - counts_glob_prefix : str, default "obs" - The prefix used for globbing to find observation files. - verbose : bool, default True - If True, print a summary of matched samples and files. - - Returns - ------- - pandas.DataFrame - The validated and updated sample dataframe, indexed by 'sample' and - containing an 'obs_file' column. - - Raises - ------ - FileNotFoundError - If `counts_csv_path` is not a valid directory. - ValueError - If the 'sample' column in `sample_df` is not unique, or if any sample - is missing a corresponding file or has multiple ambiguous file matches. - """ - - # Load sample_df, making sure the sample_df index is set to the sample - # column. - sample_df = tfscreen.util.io.read_dataframe(sample_df,index_column="sample") - # Make sure that the sample_df is indexed by sample - if not sample_df.index.name == "sample": - raise ValueError("sample_df must be indexed by 'sample'") +from typing import Union - # Make sure the sample index is unique - if not sample_df.index.is_unique: - dups = (sample_df.index[sample_df.index.duplicated(keep=False)] - .unique().tolist()) - raise ValueError(f"samples must be unique. Duplicates: {dups}") - - # Make sure counts_csv_path is sane - if not os.path.isdir(counts_csv_path): - raise FileNotFoundError ( - f"counts_csv_path '{counts_csv_path}' is not a directory." - ) - - # Make sure that exactly one expected csv file is in the counts_csv_path for - # each sample. - error_messages = [] - all_files_found = {} - for s in sample_df.index: - - # The glob pattern looks for files containing the sample ID. - # e.g., 'path/to/csvs/obs_sample1_data.csv' - file_pattern = os.path.join(counts_csv_path, f"{counts_glob_prefix}*{s}*.csv") - files_found = glob.glob(file_pattern) - - # No files were found for the sample. - if len(files_found) == 0: - error_messages.append( - f" - MISSING: No files found for sample '{s}'." - ) - # More than one file was found for the sample. - elif len(files_found) > 1: - error_messages.append( - f" - AMBIGUOUS: {len(files_found)} files found for sample '{s}'. Expected 1. (Found: {files_found})" - ) - # Correct number of files - else: - all_files_found[s] = files_found[0] - - # Load the obs files into the sample dataframe - sample_df["obs_file"] = sample_df.index.map(all_files_found) - - # If any errors, combine and raise - if error_messages: - header = f"File validation failed with {len(error_messages)} error(s):" - full_error_message = "\n".join([header] + error_messages) - raise ValueError(full_error_message) - - # Print out some information so the user gets a visual indication of - # what the processor saw - if verbose: - - msg = [f"Sample dataframe has {len(sample_df)} unique samples with", - f"matched observation csv files.\n"] - print(" ".join(msg)) - for sample in all_files_found: - print(f"{sample:40s} : {all_files_found[sample]}") - print() - - return sample_df - -def _aggregate_counts( - sample_df: Union[pd.DataFrame, str], -) -> Tuple[pd.DataFrame,pd.DataFrame]: - """ - Builds a combined dataframe holding all counts for all samples. - - Parameters - ---------- - sample_df : pandas.DataFrame or str - The sample dataframe or a path to it. Must contain a 'sample' column. - Returns - ------- - pandas.DataFrame - Long-form counts DataFrame with columns 'sample', 'genotype', and - 'counts', concatenated across all samples. - """ - - counts_dfs = [] - for s in tqdm(sample_df.index): - - # Parse the input csv - df = pd.read_csv(sample_df.loc[s,"obs_file"]) - df["sample"] = s - df = df[["sample","genotype","counts"]] - - counts_dfs.append(df) - - counts_df = pd.concat(counts_dfs,ignore_index=True) +import pandas as pd - return counts_df def process_counts( sample_df: Union[pd.DataFrame, str], diff --git a/src/tfscreen/process_raw/scripts/process_presplit_cli.py b/src/tfscreen/process_raw/scripts/process_presplit_cli.py new file mode 100644 index 00000000..338c0292 --- /dev/null +++ b/src/tfscreen/process_raw/scripts/process_presplit_cli.py @@ -0,0 +1,106 @@ +from tfscreen.process_raw import counts_to_lncfu +from tfscreen.process_raw._counts_io import _prep_sample_df, _aggregate_counts +from tfscreen.util.cli import generalized_main +from tfscreen.util.dataframe import check_columns, get_scaled_cfu + +from typing import Union + +import pandas as pd + + +def process_presplit( + sample_df: Union[pd.DataFrame, str], + counts_csv_path: str, + output_file: str, + counts_glob_prefix: str = "counts", + min_genotype_obs: int = 10, + pseudocount: int = 1, + verbose: bool = True +): + """ + Convert per-sample genotype count CSVs into a presplit ln_cfu DataFrame. + + Reads sample metadata from sample_df, matches each sample to a counts + CSV file in counts_csv_path, aggregates all counts, converts to ln(CFU) + via counts_to_lncfu, and writes a presplit CSV to output_file. The + presplit CSV contains only the columns required by tfs-configure-model + (replicate, condition_pre, genotype, ln_cfu, ln_cfu_std). + + Parameters + ---------- + sample_df : str or pandas.DataFrame + Path to (or pre-loaded) sample metadata CSV. Must contain a unique + 'sample' column (used as the index) plus 'replicate', 'condition_pre', + 'sample_cfu', and 'sample_cfu_std' columns. An optional 'library' + column groups genotypes for the minimum-observation filter; defaults + to 'default' when absent. + counts_csv_path : str + Directory containing per-sample count CSV files. Each file must + match the glob pattern ``{counts_glob_prefix}*{sample}*.csv``. + output_file : str + Path to write the output presplit CSV (passed to tfs-configure-model + as the presplit_df argument). + counts_glob_prefix : str, optional + Prefix used when globbing for count files in counts_csv_path. + Default 'counts'. + min_genotype_obs : int, optional + Minimum total count across samples for a genotype to be retained. + Genotypes below this threshold are dropped before the ln_cfu + calculation. Default 10. + pseudocount : int, optional + Pseudocount added to each genotype count before the log transform, + to avoid log(0). Default 1. + verbose : bool, optional + If True, print a summary of matched samples and file paths. + Default True. + """ + + # After this call, sample_df will be indexed by sample name and have + # a column 'obs_file' that points to the csv file to read. + sample_df = _prep_sample_df(sample_df, + counts_csv_path, + counts_glob_prefix, + verbose) + + # Require the caller to supply the presplit-specific metadata columns. + check_columns(sample_df, required_columns=["sample_cfu", "sample_cfu_std", + "replicate", "condition_pre"]) + + # counts_to_lncfu requires a 'library' column for grouping; default when absent. + if "library" not in sample_df.columns: + sample_df = sample_df.copy() + sample_df["library"] = "default" + + counts_df = _aggregate_counts(sample_df) + + ln_cfu_df = counts_to_lncfu(sample_df, + counts_df, + min_genotype_obs=min_genotype_obs, + pseudocount=pseudocount) + + # counts_to_lncfu outputs ln_cfu_var; compute ln_cfu_std from it. + ln_cfu_df = get_scaled_cfu(ln_cfu_df, need_columns=["ln_cfu", "ln_cfu_std"]) + + # Keep only the columns expected by _read_presplit_df. + presplit_df = ln_cfu_df[["replicate", "condition_pre", "genotype", + "ln_cfu", "ln_cfu_std"]].copy() + + presplit_df = presplit_df.sort_values( + by=["replicate", "condition_pre", "genotype"], + ignore_index=True + ) + + presplit_df.to_csv(output_file, index=False) + + +def main(): + return generalized_main(process_presplit, + manual_arg_types={"sample_df": str, + "counts_csv_path": str, + "output_file": str, + "min_genotype_obs": int, + "pseudocount": int}) + + +if __name__ == "__main__": + main() diff --git a/src/tfscreen/simulate/scripts/example_config.yaml b/src/tfscreen/simulate/scripts/example_config.yaml deleted file mode 100644 index 1bba4a5d..00000000 --- a/src/tfscreen/simulate/scripts/example_config.yaml +++ /dev/null @@ -1,340 +0,0 @@ - -# ----------------------------------------------------------------------------- -# Library genetic information -# ----------------------------------------------------------------------------- - -# Reading frame 0, 1, 2. no reverse (negative) allowed. -reading_frame: 0 - -# amino acid residue number for first in-frame residue -first_amplicon_residue: 27 - -# wildtype sequence (nucleic acids) -wt_seq: gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctgcacgcgccgtcgcaaattgtcgcggcgattaaatctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg - -# degenerate codons defining the library -degen_sites: ......nntnnt.............................................................................................nntnnt......................................................................................................... -#......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt......nntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnntnnt - -# sub_libraries defines blocks of contiguous library components cloned in -# together. '.' indicates wildtype sequence; each unique character beside '.' -# defines a unique sub-library. These must be contiguous (...111... is okay, -# ...11.1... is not) -sub_libraries: ......111111.............................................................................................222222......................................................................................................... -#......111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111......222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 - -# Flanking sequences just upstream and just downstream of the amplicon -expected_5p: cgcgtggtgaaccag -expected_3p: gtagaacgaagcggc - -# library_combos should be formatted like 'single-x' or 'double-x-y' where 'x' -# and 'y' are library characters in sub_libraries. 'single-x' specifies all -# individual degenerate codons in x. 'double-x-x' specifies doubles between -# degenerate codons in x. 'double-x-y' specifies doubles between sub-libraries -# x and y but not internal doubles. -library_combos: ["single-1","single-2","double-1-2"] - -# These are sequences that are not part of the library that we include as controls -# etc. -spiked_seqs: -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctggcggcgccgtcgcaaattgtcgcggcgattctgtctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgattgcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctggcggcgccgtcgcaaattgtcgcggcgattctgtctcgcgccgatcaactgggtgccagcgtggtggtgtcgatg -- gccagccacgtttctgcgaaaacgcgggaaaaagtggaagcggcgatggcggagctgaattacattcccaaccgcgtggcacaacaactggcgggcaaacagtcgttgctgattggcgttgccacctccagtctggccctgcacgcgccgtcgcaaattgtcgcggcgattaaatctcgcgccgcccaactgggtgccagcgtggtggtgtcgatg - - -# ----------------------------------------------------------------------------- -# Phenotype calculation -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# Ensemble - -###### MWC microscopic dimer ######## -## BEST GUESS FOR MODEL -## lac repressor linkage model calculation -## r_total = 40 dimers per cell, 1.5 fL cell, 40% crowding -## o_total = 20 plasmids, 1.5 fL cell, 40% crowding -observable_calculator: "lac" -observable_calc_kwargs: - T: 310 # K - R: 0.001987 # kcal/mol/K - model_to_use: "microscopic_dimer" - wt_K_dict: - K_l_2u: 4.35E-08 - K_l_h: 20 - K_l_o: 1.83E-04 - K_h_o: 1.20E+08 - K_l_e: 1E+06 - K_le_e: 1E+06 - K_h_e: 5.60E+04 - K_he_e: 5.60E+04 - K_lo_e: 7.60e5 - K_loe_e: 7.60E+05 - K_ho_e: 1e4 - K_hoe_e: 1e4 - r_total: 3.3e-7 # molar, total *monomer* repressor concentration - o_total: 8.3e-8 # molar, total operator concentration - e_name: "iptg" # name of effector in conditions. (only one allowed) - -###### MWC dimer ######## -## SECOND BEST GUESS FOR MODEL -## lac repressor linkage model calculation -## r_total = 40 dimers per cell, 1.5 fL cell, 40% crowding -## o_total = 20 plasmids, 1.5 fL cell, 40% crowding -# observable_calculator: "lac" -# observable_calc_kwargs: -# T: 310 # K -# R: 0.001987 # kcal/mol/K -# model_to_use: "mwc_dimer" -# wt_K_dict: -# K_h_l: 0.4 #6.3 <- tweaked this and k_h_e to get observe mid (1.59e-5 M) -# K_h_o: 4.2e8 -# K_h_e: 5.6e3 #5.6e4 -# K_l_o: 0.1 -# K_l_e: 7.6e5 -# r_total: 3.3e-7 # molar, total *monomer* repressor concentration -# o_total: 8.3e-8 # molar, total operator concentration -# e_name: "iptg" # name of effector in conditions. (only one allowed) - -###### linkage microscopic dimer ######## -## Historical linkage model. -# observable_calculator: "lac" -# observable_calc_kwargs: -# T: 310 # K -# R: 0.001987 # kcal/mol/K -# model_to_use: "linkage_dimer" -# wt_K_dict: -# Kd_e1: 4e-7 # 1st IPTG binding -# Kd_e2: 4e-7 # 2nd IPTG binding (assuming non-cooperative) -# Kd_o: 1e-10 # R binding to O (tight) -# Kd_oe1: 1e-5 # RE binding to O (weaker) -# Kd_oe2: 1e-5 # RE2 binding to O (weakest) -# r_total: 3.3e-7 # molar, total *monomer* repressor concentration -# o_total: 8.3e-8 # molar, total operator concentration -# e_name: "iptg" # name of effector in conditions. (only one allowed) - -###### ensemble-epistasis-engine calculation ######## -## Simple model has no nonlinear interactions between terms. probably a bad -## model... -## spreadsheet defining ensemble and interactions with iptg -# observable_calculator: "eee" -# observable_calc_kwargs: -# ensemble_spreadsheet: "../input/ensemble.xlsx" -# T: 310 # K -# R: 0.001987 # kcal/mol/K -# # This sets how the thermodynamic variable maps proportionally to output. For -# # the lac repressor, this is 12 because we derived the thermodynamic -# # parameters under conditions where there was a 12-fold excess of the lac -# # repressor to operator. Fully bound lac repressor thus corresponds to a -# # an observable value of 1/12 in the operator-bound state--hence 12 here. -# scale_obs_by: 12 -# e_name: "iptg" # name of effector in conditions. (only one allowed) - -# Spreadsheet with effects of all mutations on each state in ensemble -ddG_spreadsheet: "ddG_ensemble_clean_with_effector.csv" - -# ----------------------------------------------------------------------------- -# Conditions - -# condition_blocks is a list of dictionaries defining different growth -# conditions. Each dictionary should have a "marker" key with a value of either -# "kanR" or "pheS", a "select" key with a value of either 0 or 1, an "iptg" -# key with a list of iptg concentrations (in mM), and a "time" key with a list -# of sample times (in minutes) -condition_blocks: - - library: "pheS" - titrant_name: "iptg" - titrant_conc: [0, 1] - condition_pre: "pheS-4CP" - t_pre: 30 - condition_sel: "pheS-4CP" - t_sel: [80, 95, 110] - - - library: "kanR" - titrant_name: "iptg" - titrant_conc: [0, 1] - condition_pre: "kanR-kan" - t_pre: 30 - condition_sel: "kanR-kan" - t_sel: [80, 95, 110] - - - library: "kanR" - titrant_name: "iptg" - titrant_conc: [0, 0.0001, 0.001, 0.003] - condition_pre: "kanR-kan" - t_pre: 30 - condition_sel: "kanR+kan" - t_sel: [160, 180, 200] - - - library: "kanR" - titrant_name: "iptg" - titrant_conc: [0.01, 0.03, 0.1, 1.0] - condition_pre: "kanR-kan" - t_pre: 30 - condition_sel: "kanR+kan" - t_sel: [145, 165, 180] - - - library: "pheS" - titrant_name: "iptg" - titrant_conc: [0, 0.0001, 0.001, 0.003, 0.01, 0.03, 0.1, 1.0] - condition_pre: "pheS-4CP" - t_pre: 30 - condition_sel: "pheS+4CP" - t_sel: [95, 110, 125] - -# ----------------------------------------------------------------------------- -# Phenotype calculation parameters - -# Describes how bacteria grow under different conditions as a function of -# operator occupancy. For each condition (matching condition_pre and -# condition_sel values in condition_blocks), provide slope m and intercept b -# for the linear model: -# -# k = m * theta + b -# -# where k is the wildtype growth rate and theta is operator occupancy. -# Every condition that appears in condition_blocks must have an entry here, -# and every entry here must appear in condition_blocks. -growth: - kanR+kan: {m: -0.009933, b: 0.000000} - kanR-kan: {m: 0.000808, b: 0.004670} - pheS+4CP: {m: 0.006226, b: 0.010741} - pheS-4CP: {m: -0.000344, b: 0.017862} - -# We assign pleiotropic growth-rate effects (dk_geno) to each genotype by -# sampling a per-mutation cost from a gamma distribution and summing across -# mutations. The formula is: -# -# dk_geno = hyper_shift - exp(Normal(hyper_loc, hyper_scale)) -# -# so the distribution is centered slightly below zero (most genotypes are -# mildly deleterious) with a short right tail capped at hyper_shift. -# Increasing hyper_scale widens the distribution in both directions. -# hyper_loc controls the typical log-magnitude of the deleterious effect. -# hyper_shift sets the maximum possible beneficial effect. -# These parameters match the hierarchical tfmodel inference prior. -dk_geno_hyper_loc: -3.5 -dk_geno_hyper_scale: 1.0 -dk_geno_hyper_shift: 0.02 - -# ----------------------------------------------------------------------------- -# Experimental simulation information - -# Define how many transformants to include for each sub-library. Keys are -# strings: '1' means O1; '2' means O2; '12' means O1/O2. -# if you set internal_doubles to True above, you can then add '11' and -# '22' to get the doubles within each pool. -transform_sizes: - single-1: 1.0e5 - single-2: 1.0e5 - double-1-2: 3.0e5 - spiked: 1.0e3 - -# what is the mixture ratio of the library. This works together with -# sizes. For the example values, the final mixed library would have 1e5 * 1 -# O1, 1e5 * 1, O2, and and 1e6 * 10 O1/O2. Note that the **ratio** matters, -# not the absolute value. -library_mixture: - single-1: 100 - single-2: 100 - double-1-2: 1000 - spiked: 1 - -# sigma value to give to log normal distribution for generating genotype -# frequencies in the library. 0 gives an even distribution; higher numbers -# give greater skew (meaning some genotypes have very high frequency). -# 1-2 is a good guess for a real library. -lib_assembly_skew_sigma: 1.5 - -# The number of plasmids per cell is set by sampling from a zero-truncated -# Poisson distribution with this lambda. If 0 or None, each cell gets exactly -# one plasmid. -transformation_poisson_lambda: 1.5 - -# How to combine growth rates when a cell contains multiple plasmids. Valid -# options are: min, max, mean, gmean, sum. Keys must match the library names -# in condition_blocks. If this key is omitted, "mean" is used for all -# libraries. For a repressor of an antibiotic resistance gene we recommend -# "min" (the tightest-binding plasmid dominates). For an inducer of antibiotic -# resistance we recommend "max". -multi_plasmid_combine_fcn: - kanR: "min" - pheS: "max" - -# cfu/mL at start of pre-growth -cfu0: 6.5e7 - -# Per-tube environmental growth-rate noise (hr⁻¹). Each physical tube gets its -# own delta_k ~ Normal(0, tube_noise_sigma); the kt contribution per tube is -# delta_k * (t_pre + t_sel), shared by all genotypes in that tube. A value of -# ~0.001–0.002 hr⁻¹ is typical for well-controlled liquid cultures. -# Set to 0 or null to disable. -tube_noise_sigma: 0.002 - -# ----------------------------------------------------------------------------- -# Growth transition model - -# When bacteria switch from pre-selection to selection medium there is a lag -# before they reach their new growth rate. The simulation can model this with -# the "memory" model: -# -# tau = tau0 + k1 / (theta + k2) -# -# where theta is operator occupancy (0–1), tau is the lag time (minutes), -# tau0 is a baseline lag independent of occupancy, k1 scales the -# occupancy-dependence of the lag, and k2 prevents division by zero (must -# be > 0). Bacteria grow at k_pre for the first min(t_sel, tau) minutes of -# selection, then switch to k_sel. -# -# Higher theta (more TF bound) reduces tau when k1 > 0, meaning bacteria -# with higher occupancy adapt more quickly. -# -# Every condition_pre that appears in condition_blocks must have an entry -# here. Use model: "instant" for conditions where no lag is observed. -# -# Omit this block entirely to use an instant transition everywhere. -growth_transition: - - condition_pre: "pheS-4CP" - model: "memory" - tau0: 90.0 # baseline lag ~90 min; pheS shows a pronounced memory effect - k1: 5.0 # occupancy has a strong influence on lag for pheS - k2: 0.2 # keeps denominator finite; sets the curvature near theta=0 - - - condition_pre: "kanR-kan" - model: "memory" - tau0: 60.0 # shorter baseline lag for kanR - k1: 2.0 # weaker occupancy-dependence than pheS - k2: 0.2 - -# ----------------------------------------------------------------------------- -# Data collection parameters - -# Total number of reads coming out of the experiment -total_num_reads: 2.5e7 - -# Fraction of sequencing reads to re-assign to a randomly chosen genotype, -# simulating index hopping / read bleedthrough between samples. Set to None -# or 0 to disable. -prob_index_hop: 0.05 - -# ----------------------------------------------------------------------------- -# Binding data simulation (optional) - -# If present, tfs-simulate will also write a binding CSV with columns: -# genotype, titrant_name, titrant_conc, theta_obs, theta_std -# -# genotypes : list of genotype strings whose binding curves to simulate -# titrant_name : name of the titrant (must match 'e_name' in observable_calc_kwargs) -# titrant_conc : titrant concentrations in mM at which to evaluate theta -# noise : standard deviation of Gaussian noise added to each theta value -# -# Genotypes not present in the library are accepted; their ddG values are -# computed directly from the thermodynamic model. -# -# binding_data: -# genotypes: -# - wt -# - A47V -# titrant_name: iptg -# titrant_conc: [0, 0.0001, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0] -# noise: 0.02 diff --git a/src/tfscreen/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index 713c2809..c029d7a9 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -110,7 +110,7 @@ def _generate_presplit_data(combined_sample_df, combined_counts_df, cf, rng): Returns ------- pandas.DataFrame - Columns: ``replicate``, ``condition_pre``, ``genotype``, + Columns: ``library``, ``replicate``, ``condition_pre``, ``genotype``, ``ln_cfu``, ``ln_cfu_std``, ``ln_cfu_0_true``. ``ln_cfu_0_true`` records the simulation ground truth for validation. Rows with zero initial frequency (genotypes absent from the @@ -127,24 +127,24 @@ def _generate_presplit_data(combined_sample_df, combined_counts_df, cf, rng): total_num_samples = len(combined_sample_df) reads_per_sample = max(1, int(round(total_num_reads / total_num_samples))) - # Attach condition_pre and replicate to each (genotype, sample) row so we - # can group by (replicate, condition_pre) below. + # Attach library, condition_pre, and replicate to each (genotype, sample) + # row so we can group by (replicate, library, condition_pre) below. sample_meta = (combined_sample_df - .reset_index()[["sample", "replicate", "condition_pre"]] + .reset_index()[["sample", "replicate", "library", "condition_pre"]] .drop_duplicates("sample")) counts_meta = pd.merge(combined_counts_df, sample_meta, on="sample", how="left") - # One row per (replicate, condition_pre, genotype), keeping the first - # occurrence of ln_cfu_0 (same value for all selection samples within a - # library group). + # One row per (replicate, library, condition_pre, genotype), keeping the + # first occurrence of ln_cfu_0 (same value for all selection samples within + # a library group). source = (counts_meta - .groupby(["replicate", "condition_pre", "genotype"], observed=True) + .groupby(["replicate", "library", "condition_pre", "genotype"], observed=True) .first() - .reset_index()[["replicate", "condition_pre", "genotype", "ln_cfu_0"]]) + .reset_index()[["replicate", "library", "condition_pre", "genotype", "ln_cfu_0"]]) rows = [] - for (rep, cp), grp in source.groupby(["replicate", "condition_pre"], - observed=True): + for (rep, lib, cp), grp in source.groupby(["replicate", "library", "condition_pre"], + observed=True): genos = grp["genotype"].values ln_cfu0 = grp["ln_cfu_0"].values @@ -195,6 +195,7 @@ def _generate_presplit_data(combined_sample_df, combined_counts_df, cf, rng): for i, geno in enumerate(genos): rows.append({ + "library": lib, "replicate": rep, "condition_pre": cp, "genotype": geno, diff --git a/src/tfscreen/simulate/selection_experiment.py b/src/tfscreen/simulate/selection_experiment.py index 29eb51a3..ad7a10a7 100644 --- a/src/tfscreen/simulate/selection_experiment.py +++ b/src/tfscreen/simulate/selection_experiment.py @@ -49,7 +49,7 @@ SIMULATE_KNOWN_KEYS = frozenset({ # Library genetics (passed to LibraryManager) "reading_frame", "first_amplicon_residue", "wt_seq", "degen_sites", - "sub_libraries", "library_combos", "spiked_seqs", "expected_5p", "expected_3p", + "tiles", "tile_combos", "spiked_seqs", "expected_5p", "expected_3p", # Phenotype / theta calculation "theta_component", "thermo_data", "theta_priors", "theta_rescale", "theta_sim_priors", diff --git a/src/tfscreen/simulate/thermo_to_growth.py b/src/tfscreen/simulate/thermo_to_growth.py index ddc47773..577d5aef 100644 --- a/src/tfscreen/simulate/thermo_to_growth.py +++ b/src/tfscreen/simulate/thermo_to_growth.py @@ -498,7 +498,7 @@ def thermo_to_growth( # ── Build genotype_theta_df (ground-truth theta per unique genotype) ────── # Long form: one row per (genotype, titrant_name, titrant_conc). # unique_sim_indices maps each unique genotype to its representative row in - # theta_gc, eliminating duplicates from sub-libraries. + # theta_gc, eliminating duplicates from tiles. tn_conc_pairs = ( sample_df[["titrant_name", "titrant_conc"]] .drop_duplicates() diff --git a/src/tfscreen/tfmodel/analysis/prediction.py b/src/tfscreen/tfmodel/analysis/prediction.py index 090b6093..195678f3 100644 --- a/src/tfscreen/tfmodel/analysis/prediction.py +++ b/src/tfscreen/tfmodel/analysis/prediction.py @@ -137,8 +137,10 @@ def _get_input(value, col_name): t_sel_list = _get_input(t_sel, "t_sel") titrant_conc_list = _get_input(titrant_conc, "titrant_conc") - # Get all unique categorical combinations - categorical_cols = ["replicate", "condition_pre", "condition_sel", + # Get all unique categorical combinations. "library" must be included so + # that the new ModelOrchestrator produces the same condition_rep ordering + # as the fitted model (which groups conditions per library). + categorical_cols = ["replicate", "library", "condition_pre", "condition_sel", "titrant_name", "genotype"] unique_cats = df[categorical_cols].drop_duplicates() @@ -453,7 +455,7 @@ def predict(orchestrator, # Replace the dummy ln_cfu/ln_cfu_std zeros with observed values from the # original orchestrator.growth_df (NaN where there is no matching observation, # e.g. for expanded prediction grids). - merge_keys = ["replicate", "condition_pre", "condition_sel", + merge_keys = ["replicate", "library", "condition_pre", "condition_sel", "titrant_name", "genotype", "t_pre", "t_sel", "titrant_conc"] obs_cols = merge_keys + ["ln_cfu", "ln_cfu_std"] orig_obs = orchestrator.growth_df[obs_cols].drop_duplicates(subset=merge_keys) diff --git a/src/tfscreen/tfmodel/generative/components/growth/linear.py b/src/tfscreen/tfmodel/generative/components/growth/linear.py index 73c10503..944fb5b2 100644 --- a/src/tfscreen/tfmodel/generative/components/growth/linear.py +++ b/src/tfscreen/tfmodel/generative/components/growth/linear.py @@ -322,34 +322,48 @@ def get_guesses(name, data): return guesses -def get_priors(condition_labels: Optional[List[str]] = None) -> ModelPriors: +def get_priors(condition_labels: Optional[List[str]] = None, + is_selection: Optional[List[bool]] = None) -> ModelPriors: """ Build a :class:`ModelPriors` for the linear growth component. - When ``condition_labels`` is supplied (a list of condition names in the - same order as the model's ``num_condition_rep`` axis), each label is - parsed for '+' or '-' to set ``m_is_selection``. This enables the - tighter ``m_scale_minus`` prior for control conditions and the normal - ``m_scale_plus`` prior for selection conditions, breaking the - optimization degeneracy that otherwise causes systematic theta - undershoot. + Preferred: supply ``is_selection`` — a list of booleans (one per + ``condition_rep`` index) indicating whether each condition is a + selection condition. This sets ``m_is_selection`` directly without + requiring '+' or '-' in condition names. - When ``condition_labels`` is ``None`` (the default), ``m_is_selection`` - is left as ``None`` and ``m_scale`` is used for all conditions - (backward-compatible behaviour). + Legacy: supply ``condition_labels`` — a list of condition name strings + whose '+' or '-' character is parsed to derive ``m_is_selection``. + + When neither is supplied, ``m_is_selection`` is left as ``None`` and + ``m_scale`` is used for all conditions (backward-compatible behaviour). Parameters ---------- condition_labels : list of str, optional Ordered condition names, one per ``condition_rep`` index. Each name must contain exactly one of '+' or '-'. + Mutually exclusive with ``is_selection``. + is_selection : list of bool, optional + Ordered booleans, one per ``condition_rep`` index. + ``True`` → selection condition (normal ``m_scale_plus`` prior). + ``False`` → control condition (tight ``m_scale_minus`` prior). + Mutually exclusive with ``condition_labels``. Returns ------- ModelPriors """ + if condition_labels is not None and is_selection is not None: + raise ValueError( + "Specify either 'condition_labels' or 'is_selection', not both. " + "Use 'is_selection' (preferred) for the inference-based approach " + "or 'condition_labels' for the legacy string-parsing approach." + ) hypers = get_hyperparameters() - if condition_labels is not None: + if is_selection is not None: + hypers["m_is_selection"] = tuple(bool(v) for v in is_selection) + elif condition_labels is not None: hypers["m_is_selection"] = tuple( _parse_condition_label(label) for label in condition_labels ) diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py index 3c015d3c..49a1062f 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py @@ -1,5 +1,14 @@ """ -K-assembly via additive mutation effects in ln-K space (MWC dimer). +PK — mutation effects on equilibrium constants inferred from data (MWC dimer). + +Each mutation shifts all five equilibrium constants (K_h_l, K_h_o, K_l_o, +K_h_e, K_l_e) by an independent Δln_K drawn from a hierarchical Normal prior +with learned scale. No structural information is used; all mutation effects +are inferred directly from the observations. Registry name: +``theta_mwc_dimer_lnK_mut``. + +Contrast with PddG (Δln_K derived from user-supplied structural ΔΔG predictions) +and PnnC (Δln_K derived from NN-predicted structural ΔΔG). Mutation effects are additive in ln(K) space, with optional pairwise epistasis terms: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py index e35ba70e..232d24f8 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py @@ -1,5 +1,14 @@ """ -K-assembly via per-mutation per-structure ΔΔG with user-supplied prior means. +PddG — mutation effects on equilibrium constants from user-supplied ΔΔG prior means (MWC dimer). + +Each mutation's effect on the five equilibrium constants (K_h_l, K_h_o, K_l_o, +K_h_e, K_l_e) is derived from per-structure ΔΔG latent variables whose prior +means come from a user-supplied CSV file (columns: mut, H, HO, L, LO, HE2, LE2). +A learned per-structure trust scale σ_s controls how far the posterior can deviate +from the CSV values. Registry name: ``theta_mwc_dimer_lnK_ddG_prior``. + +Contrast with PK (Δln_K inferred from data alone, no structure) and PnnC +(ΔΔG prior means predicted by a per-structure MLP rather than supplied by the user). Implements the full MWC two-state lac-dimer model (Sochor 2014) with five equilibrium constants, using six structural states as the free-energy basis: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py index 0b7191b1..dd862d5d 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py @@ -1,5 +1,14 @@ """ -K-assembly via per-mutation per-structure ΔΔG with NN-predicted prior means. +PnnC — mutation effects on equilibrium constants from NN-predicted ΔΔG prior means (MWC dimer). + +Identical to PddG, but prior means for the per-structure ΔΔG latent variables +are predicted by per-structure two-layer MLPs trained on LigandMPNN structural +features rather than read from a user-supplied CSV. The MLPs are optimised +jointly with the model (empirical Bayes). Requires a structural ensemble HDF5 +file as input. Registry name: ``theta_mwc_dimer_lnK_nn_prior``. + +Contrast with PK (Δln_K inferred from data alone, no structure) and PddG +(ΔΔG prior means from a user-supplied CSV rather than a trained NN). Implements the full MWC two-state lac-dimer model (Sochor 2014) with five equilibrium constants, using six structural states as the free-energy basis: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py index 91d598cd..dcaa91c5 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py @@ -1,6 +1,14 @@ """ Shared thermodynamic functions for the MWC lac-dimer theta model. +Full Monod-Wyman-Changeux (MWC) two-state model with five independent +equilibrium constants (Sochor 2014). Unlike the simplified lac-dimer model, +this separately parameterises H- and L-state affinities for both operator +(K_h_o, K_l_o) and effector (K_h_e, K_l_e), making it more expressive at the +cost of identifiability with sparse data. Used by +``theta_mwc_dimer_lnK_mut`` (PK), ``theta_mwc_dimer_lnK_ddG_prior`` (PddG), +and ``theta_mwc_dimer_lnK_nn_prior`` (PnnC). + Full MWC two-state model (Sochor 2014, PeerJ 2:e498) with five equilibrium constants. **All concentrations and K values must be in Molar units.** diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py index b1625c59..49c79d2e 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py @@ -1,5 +1,14 @@ """ -K-assembly via additive mutation effects in ln-K space (MWC dimer unfolded). +PK — mutation effects on equilibrium constants inferred from data (MWC dimer unfolded). + +Extends the MWC dimer PK model with a per-mutation unfolding shift (d_ln_K_u). +All six equilibrium constants (K_h_l, K_h_o, K_l_o, K_h_e, K_l_e, K_u) are +shifted by Δln_K values inferred from the observations; no structural information +is used. Registry name: ``theta_mwc_dimer_unfolded_lnK_mut``. + +Contrast with PddG (Δln_K derived from user-supplied structural ΔΔG) and PnnC +(Δln_K derived from NN-predicted structural ΔΔG). Note that PddG and PnnC in +this family hold d_ln_K_u = 0 for all mutations by design. Identical to mwc_dimer/lnK_mut.py with one additional scalar parameter: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py index c40be45a..0f14b88b 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py @@ -1,6 +1,16 @@ """ -K-assembly via per-mutation per-structure ΔΔG with user-supplied prior means, -including a homogeneous WT-level unfolding constant. +PddG — mutation effects on equilibrium constants from user-supplied ΔΔG prior means (MWC dimer unfolded). + +Extends the MWC dimer PddG model with a WT-level unfolding constant (ln_K_u_wt). +Per-mutation effects on the five folded-state K values (K_h_l, K_h_o, K_l_o, +K_h_e, K_l_e) are derived from user-supplied structural ΔΔG (CSV: columns mut, +H, HO, L, LO, HE2, LE2); K_u is held at its WT value for all genotypes +(d_ln_K_u = 0) because structure-based predictors describe folded-state +environments, not global stability. Registry name: +``theta_mwc_dimer_unfolded_lnK_ddG_prior``. + +Contrast with PK (all K shifts inferred from data, including K_u per mutation) +and PnnC (ΔΔG prior means from a per-structure MLP rather than a user CSV). Implements the full MWC two-state lac-dimer model (Sochor 2014) with five equilibrium constants plus a global unfolding equilibrium, using six structural diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py index 17f3456c..b928f979 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py @@ -1,6 +1,15 @@ """ -K-assembly via per-mutation per-structure ΔΔG with NN-predicted prior means, -including a homogeneous WT-level unfolding constant. +PnnC — mutation effects on equilibrium constants from NN-predicted ΔΔG prior means (MWC dimer unfolded). + +Extends the MWC dimer PnnC model with a WT-level unfolding constant (ln_K_u_wt). +Per-mutation effects on the five folded-state K values use MLP-predicted ΔΔG +prior means from LigandMPNN structural features; K_u is held at its WT value for +all genotypes (d_ln_K_u = 0) because NN features describe local folded-state +environments, not global stability. Registry name: +``theta_mwc_dimer_unfolded_lnK_nn_prior``. + +Contrast with PK (all K shifts inferred from data, including K_u per mutation) +and PddG (ΔΔG prior means from a user-supplied CSV rather than a trained NN). Implements the full MWC two-state lac-dimer model (Sochor 2014) with five equilibrium constants plus a global unfolding equilibrium, using six structural diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py index 30340f38..258b2136 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py @@ -1,6 +1,12 @@ """ Shared thermodynamic functions for the MWC lac-dimer-unfolded theta model. +Extends the five-parameter MWC model with a globally unfolded state U. +Destabilising mutations shift population into U, collapsing θ toward zero at +all effector concentrations. Used by ``theta_mwc_dimer_unfolded_lnK_mut`` +(PK), ``theta_mwc_dimer_unfolded_lnK_ddG_prior`` (PddG), and +``theta_mwc_dimer_unfolded_lnK_nn_prior`` (PnnC). + Extends the MWC two-state model (Sochor 2014, PeerJ 2:e498) with an explicit unfolded state U: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py index 506ea832..0fe2b65a 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py @@ -1,5 +1,14 @@ """ -K-assembly via additive mutation effects in ln-K space. +PK — mutation effects on equilibrium constants inferred from growth/binding data. + +Each mutation shifts the three equilibrium constants (K_op, K_HL, K_E) by an +independent Δln_K drawn from a hierarchical Normal prior with learned scale. +No structural information is used; all mutation effects are inferred directly +from the observations. This is the simplest and most data-efficient K-assembly +variant. Registry name: ``theta_lac_dimer_lnK_mut``. + +Contrast with PddG (Δln_K derived from user-supplied structural ΔΔG predictions) +and PnnC (Δln_K derived from NN-predicted structural ΔΔG). Mutation effects are additive in ln(K) space, with optional pairwise epistasis terms: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py index 54929f50..39700d06 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py @@ -1,5 +1,14 @@ """ -K-assembly via per-mutation per-structure ΔΔG with user-supplied prior means. +PddG — mutation effects on equilibrium constants from user-supplied ΔΔG prior means (lac-dimer). + +Each mutation's effect on the three equilibrium constants (K_op, K_HL, K_E) is +derived from per-structure ΔΔG latent variables whose prior means come from a +user-supplied CSV file (columns: mut, H, HD, L, LE2). A learned per-structure +trust scale σ_s controls how far the posterior can deviate from the CSV values. +Registry name: ``theta_lac_dimer_lnK_ddG_prior``. + +Contrast with PK (Δln_K inferred from data alone, no structure) and PnnC +(ΔΔG prior means predicted by a per-structure MLP rather than supplied by the user). Implements the lac-dimer four-state partition function with three equilibrium constants, using four structural states as the free-energy basis: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py index 905a1b08..eb9e2bbc 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py @@ -1,5 +1,14 @@ """ -K-assembly via per-mutation per-structure ΔΔG with NN-predicted prior means. +PnnC — mutation effects on equilibrium constants from NN-predicted ΔΔG prior means (lac-dimer). + +Identical to PddG, but prior means for the per-structure ΔΔG latent variables +are predicted by per-structure two-layer MLPs trained on LigandMPNN structural +features rather than read from a user-supplied CSV. The MLPs are optimised +jointly with the model (empirical Bayes). Requires a structural ensemble HDF5 +file as input. Registry name: ``theta_lac_dimer_lnK_nn_prior``. + +Contrast with PK (Δln_K inferred from data alone, no structure) and PddG +(ΔΔG prior means from a user-supplied CSV rather than a trained NN). Per-mutation per-structure ΔΔG latents with MLP-predicted prior means (empirical-Bayes via LigandMPNN structural features): diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py index a56229e4..853f9975 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py @@ -1,6 +1,12 @@ """ Shared thermodynamic functions for the lac-dimer partition-function θ model. +The TF homodimer occupies two conformations: H (high operator affinity) and +L (low operator affinity, high effector affinity). Effector binding shifts +population toward L, reducing operator occupancy (θ). Used by +``theta_lac_dimer_lnK_mut`` (PK), ``theta_lac_dimer_lnK_ddG_prior`` (PddG), +and ``theta_lac_dimer_lnK_nn_prior`` (PnnC). + Four-state partition function for the TF homodimer: State Weight diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py index 8cbe85f6..43c88ba2 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py @@ -1,5 +1,15 @@ """ -K-assembly via additive mutation effects in ln-K space (lac-dimer-unfolded). +PK — mutation effects on equilibrium constants inferred from data (lac-dimer-unfolded). + +Extends the lac-dimer PK model with a per-mutation unfolding shift (d_ln_K_U). +All four equilibrium constants (K_op, K_HL, K_E, K_U) are shifted by Δln_K +values inferred from the observations; no structural information is used. +Use this when mutations may significantly destabilise the protein and a flat +θ curve is observed. Registry name: ``theta_lac_dimer_unfolded_lnK_mut``. + +Contrast with PddG (Δln_K derived from user-supplied structural ΔΔG) and PnnC +(Δln_K derived from NN-predicted structural ΔΔG). Note that PddG and PnnC in +this family hold d_ln_K_U = 0 for all mutations by design. Identical to lac_dimer/lnK_mut.py with one additional scalar parameter: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py index 877dae0f..c2986a21 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py @@ -1,5 +1,15 @@ """ -K-assembly via per-mutation per-structure ΔΔG with user-supplied prior means (lac-dimer-unfolded). +PddG — mutation effects on equilibrium constants from user-supplied ΔΔG prior means (lac-dimer-unfolded). + +Extends the lac-dimer PddG model with a WT-level unfolding constant (ln_K_U_wt). +Per-mutation effects on K_op, K_HL, and K_E are derived from user-supplied +structural ΔΔG (CSV: columns mut, H, HD, L, LE2); K_U is held at its WT value +for all genotypes (d_ln_K_U = 0) because structure-based predictors describe +folded-state environments, not global stability. Registry name: +``theta_lac_dimer_unfolded_lnK_ddG_prior``. + +Contrast with PK (all K shifts inferred from data, including K_U per mutation) +and PnnC (ΔΔG prior means from a per-structure MLP rather than a user CSV). Identical to lac_dimer/lnK_ddG_prior.py with one additional scalar parameter: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py index 4eefcf4c..bfab38f5 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py @@ -1,5 +1,15 @@ """ -K-assembly via NN-predicted per-structure ΔΔG priors (lac-dimer-unfolded). +PnnC — mutation effects on equilibrium constants from NN-predicted ΔΔG prior means (lac-dimer-unfolded). + +Extends the lac-dimer PnnC model with a WT-level unfolding constant (ln_K_U_wt). +Per-mutation effects on K_op, K_HL, and K_E use MLP-predicted ΔΔG prior means +from LigandMPNN structural features; K_U is held at its WT value for all +genotypes (d_ln_K_U = 0) because NN features describe local folded-state +environments, not global stability. Registry name: +``theta_lac_dimer_unfolded_lnK_nn_prior``. + +Contrast with PK (all K shifts inferred from data, including K_U per mutation) +and PddG (ΔΔG prior means from a user-supplied CSV rather than a trained NN). Identical to lac_dimer/lnK_nn_prior.py with one additional scalar parameter: diff --git a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py index c35ae6b6..bda89f8d 100644 --- a/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py +++ b/src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py @@ -1,6 +1,13 @@ """ Shared thermodynamic functions for the lac-dimer-unfolded partition-function θ model. +Extends the four-state lac-dimer model with a globally unfolded state U. +Destabilising mutations shift population into U, where neither operator nor +effector can bind, collapsing θ toward zero at all effector concentrations. +Used by ``theta_lac_dimer_unfolded_lnK_mut`` (PK), +``theta_lac_dimer_unfolded_lnK_ddG_prior`` (PddG), and +``theta_lac_dimer_unfolded_lnK_nn_prior`` (PnnC). + Five-state partition function for the TF homodimer: State Weight diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 564705e5..303553a7 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -75,7 +75,7 @@ def _read_growth_df(growth_df, # Get default treatment columns if treatment_cols is None: - treatment_cols = ["condition_pre","condition_sel", + treatment_cols = ["library","condition_pre","condition_sel", "titrant_name","titrant_conc"] # Read dataframe, validate or calculate ln_cfu and ln_cfu_std @@ -91,7 +91,12 @@ def _read_growth_df(growth_df, # make a replicate column if not defined if "replicate" not in growth_df.columns: growth_df["replicate"] = 1 - + + if "library" not in growth_df.columns: + raise ValueError( + "growth_df is missing a required 'library' column." + ) + # check for all required columns required = theta_group_cols[:] required.extend(treatment_cols) @@ -106,9 +111,9 @@ def _read_growth_df(growth_df, growth_df = add_group_columns(target_df=growth_df, group_cols=theta_group_cols, group_name="map_theta_group") - + mapper = {} - for _, sub_df in growth_df.groupby(["condition_pre"], observed=True): + for _, sub_df in growth_df.groupby(["library", "condition_pre"], observed=True): cond_sel = list(pd.unique(sub_df["condition_sel"])) mapper.update({c:i for i, c in enumerate(cond_sel)}) @@ -117,6 +122,49 @@ def _read_growth_df(growth_df, return growth_df +def _infer_is_selection(growth_df, per_library=False): + """ + Infer which growth conditions are selective from the data structure. + + A condition is considered selective if it appears in ``condition_sel`` + but never in ``condition_pre`` (within the relevant scope). Conditions + that appear in ``condition_pre`` — including control arms where + ``condition_pre == condition_sel`` — are considered non-selective. + + This replaces the legacy convention of encoding selection status via + '+' or '-' in condition name strings. + + Parameters + ---------- + growth_df : pd.DataFrame + Processed growth DataFrame with ``condition_pre``, ``condition_sel``, + and ``library`` columns. + per_library : bool, optional + If ``False`` (default), inference is global: a condition is + non-selective if it appears in ``condition_pre`` for *any* library. + If ``True``, inference is scoped per library so the same condition + name can be selective in one library and non-selective in another. + + Returns + ------- + dict + ``per_library=False``: ``{condition_name: bool}`` + ``per_library=True``: ``{(library, condition_name): bool}`` + """ + if per_library: + result = {} + for lib, lib_df in growth_df.groupby("library", observed=True): + pre_set = set(lib_df["condition_pre"].unique()) + all_conds = pre_set | set(lib_df["condition_sel"].unique()) + for cond in all_conds: + result[(lib, cond)] = bool(cond not in pre_set) + return result + else: + pre_set = set(growth_df["condition_pre"].unique()) + all_conds = pre_set | set(growth_df["condition_sel"].unique()) + return {cond: bool(cond not in pre_set) for cond in sorted(all_conds)} + + def _build_growth_tm(growth_df, growth_shares_replicates=False): """ Builds a TensorManager for the main growth data. @@ -148,15 +196,20 @@ def _build_growth_tm(growth_df, growth_shares_replicates=False): # Add pivot column so we can both use this as a pivot and value growth_df["pivot_titrant_conc"] = growth_df["titrant_conc"] + # Build a combined library/condition_pre key so that two libraries sharing + # the same condition_pre name get distinct tensor slots. The '/' separator + # is chosen for readability; downstream code never splits on it. + growth_df["_condition_pre_key"] = growth_df["library"] + "/" + growth_df["condition_pre"] + # Create tensor manager for construction of growth experiment tensors growth_tm = TensorManager(growth_df) - # Define that we want a 4D tensor (replicate,time,treatment,genotype) + # Define that we want a 7D tensor (replicate,time,condition_pre,condition_sel,titrant_name,titrant_conc,genotype) growth_tm.add_pivot_index(tensor_dim_name="replicate",cat_column="replicate") growth_tm.add_ranked_pivot_index(tensor_dim_name="time", rank_column="t_sel", select_cols=['replicate','genotype','treatment']) - growth_tm.add_pivot_index(tensor_dim_name="condition_pre",cat_column="condition_pre") + growth_tm.add_pivot_index(tensor_dim_name="condition_pre", cat_column="_condition_pre_key") growth_tm.add_pivot_index(tensor_dim_name="condition_sel",cat_column="condition_sel_reduced") growth_tm.add_pivot_index(tensor_dim_name="titrant_name",cat_column="titrant_name") growth_tm.add_pivot_index(tensor_dim_name="titrant_conc",cat_column="pivot_titrant_conc") @@ -172,19 +225,21 @@ def _build_growth_tm(growth_df, growth_shares_replicates=False): # conditions (pre and sel) for each element in the tensor. # By calling with `select_pool_cols`, we pool names of conditions on # condition_pre and condition_sel. Basically this does the operation - # unique(replicate + condition_pre OR replicate + condition_sel). This - # will create map_condition_pre and map_condition_sel. - # If growth_shares_replicates is True, we drop replicate from the - # map tensor creation columns so that condition mapping is entirely - # coordinate-agnostic across replicates. - select_cols = [] if growth_shares_replicates else ["replicate"] + # unique(replicate + library + condition_pre OR replicate + library + condition_sel). + # This will create map_condition_pre and map_condition_sel. + # If growth_shares_replicates is True, we drop replicate from the + # map tensor creation columns so that condition mapping is entirely + # coordinate-agnostic across replicates. Library is always included so + # that conditions from different libraries remain distinct even when they + # share a name. + select_cols = ["library"] if growth_shares_replicates else ["replicate", "library"] growth_tm.add_map_tensor(select_cols=select_cols, select_pool_cols=["condition_pre","condition_sel"], name="condition_rep") - # These maps will allow us to extract parameter values from posterior - # samples. - growth_tm.add_map_tensor(["replicate","condition_pre","genotype"], + # These maps will allow us to extract parameter values from posterior + # samples. + growth_tm.add_map_tensor(["replicate","library","condition_pre","genotype"], name="ln_cfu0") growth_tm.add_map_tensor("genotype",name="genotype") growth_tm.add_map_tensor(["titrant_name","titrant_conc","genotype"],name="theta") @@ -360,7 +415,7 @@ def _read_presplit_df(presplit_df, growth_df): standardize=True) tfscreen.util.dataframe.check_columns( presplit_df, - required_columns=["replicate", "condition_pre", "genotype", + required_columns=["library", "replicate", "condition_pre", "genotype", "ln_cfu", "ln_cfu_std"], ) @@ -413,8 +468,13 @@ def _build_presplit_tm(presplit_df, growth_tm): presplit_df["replicate"] = pd.Categorical( presplit_df["replicate"], categories=rep_cats ) - presplit_df["condition_pre"] = pd.Categorical( - presplit_df["condition_pre"], categories=cp_cats + # cp_cats contains combined keys (e.g. "kanR/-kan") from growth_tm; build + # the same key for presplit so the two tensors share identical categories. + presplit_df["_condition_pre_key"] = ( + presplit_df["library"] + "/" + presplit_df["condition_pre"] + ) + presplit_df["_condition_pre_key"] = pd.Categorical( + presplit_df["_condition_pre_key"], categories=cp_cats ) presplit_df["genotype"] = pd.Categorical( presplit_df["genotype"], categories=geno_cats @@ -424,7 +484,7 @@ def _build_presplit_tm(presplit_df, growth_tm): presplit_tm.add_pivot_index(tensor_dim_name="replicate", cat_column="replicate") presplit_tm.add_pivot_index(tensor_dim_name="condition_pre", - cat_column="condition_pre") + cat_column="_condition_pre_key") presplit_tm.add_pivot_index(tensor_dim_name="genotype", cat_column="genotype") @@ -1201,11 +1261,23 @@ def _initialize_classes(self): # Record priors. Components may optionally accept special # keyword arguments: - # condition_labels — ordered condition names used by the - # linear growth component to set per-condition m priors. + # is_selection — preferred: per-condition selection flags + # inferred from data structure (no +/- in names required). + # condition_labels — legacy: ordered condition names whose + # '+'/'-' character encodes selection status. # data — component data pytree for empirical prior values. priors_sig = inspect.signature(component_module.get_priors) - if "condition_labels" in priors_sig.parameters: + if "is_selection" in priors_sig.parameters: + cond_rep_df = self.growth_tm.map_groups["condition_rep"] + sorted_cond = cond_rep_df.sort_values("map_condition_rep") + is_sel_map = _infer_is_selection(self.growth_df, per_library=True) + is_selection = [ + is_sel_map.get((row["library"], row["condition_rep"]), False) + for _, row in sorted_cond.iterrows() + ] + priors_class_kwargs[prior_group][key] = \ + component_module.get_priors(is_selection=is_selection) + elif "condition_labels" in priors_sig.parameters: cond_rep_df = self.growth_tm.map_groups["condition_rep"] condition_labels = list( cond_rep_df.sort_values("map_condition_rep")["condition_rep"] diff --git a/tests/smoke-tests/test_configure_run_smoke.py b/tests/smoke-tests/test_configure_run_smoke.py index 6938557c..3bc85d99 100644 --- a/tests/smoke-tests/test_configure_run_smoke.py +++ b/tests/smoke-tests/test_configure_run_smoke.py @@ -69,6 +69,7 @@ def test_configure_run_pipeline_smoke(tmpdir): """ # Create mock data growth_df = pd.DataFrame({ + "library": ["lib", "lib"], "replicate": ["R1", "R1"], "condition_pre": ["C1-", "C1-"], "condition_sel": ["C2+", "C2+"], @@ -154,6 +155,7 @@ def test_configure_run_binding_weight_smoke(tmpdir): """ # Growth data: 20 rows | Binding data: 4 rows → expected auto-weight = 5.0 growth_df = pd.DataFrame({ + "library": ["lib"] * 20, "replicate": ["R1"] * 20, "condition_pre": ["C1-"] * 20, "condition_sel": ["C2+"] * 20, diff --git a/tests/tfscreen/genetics/test_data.py b/tests/tfscreen/genetics/test_data.py new file mode 100644 index 00000000..6d046887 --- /dev/null +++ b/tests/tfscreen/genetics/test_data.py @@ -0,0 +1,141 @@ +""" +Unit tests for tfscreen.genetics.data. + +These tests verify the correctness and completeness of the codon/amino-acid +lookup tables and the degenerate-base specifier dictionary. +""" + +import pytest + +from tfscreen.genetics.data import ( + CODON_TO_AA, + DEGEN_BASE_SPECIFIER, + COMPLEMENT_DICT, +) + + +# --------------------------------------------------------------------------- +# CODON_TO_AA +# --------------------------------------------------------------------------- + +class TestCodonToAa: + def test_has_64_entries(self): + """All 64 sense/stop codons must be present.""" + assert len(CODON_TO_AA) == 64 + + def test_all_keys_are_three_lowercase_nt(self): + valid_bases = set("acgt") + for codon in CODON_TO_AA: + assert len(codon) == 3, f"Codon length != 3: {codon!r}" + assert set(codon) <= valid_bases, f"Non-ACGT base in codon: {codon!r}" + + def test_all_values_are_single_char(self): + for codon, aa in CODON_TO_AA.items(): + assert isinstance(aa, str) and len(aa) == 1, ( + f"Unexpected value for {codon}: {aa!r}" + ) + + def test_standard_start_codon(self): + assert CODON_TO_AA["atg"] == "M" + + def test_stop_codons(self): + for stop in ("taa", "tag", "tga"): + assert CODON_TO_AA[stop] == "*", f"Stop codon {stop!r} should map to '*'" + + def test_known_amino_acids(self): + known = { + "ttt": "F", "ttc": "F", # Phe + "tta": "L", "ttg": "L", # Leu + "att": "I", "atc": "I", # Ile + "gtt": "V", "gtc": "V", # Val + "tct": "S", "tcc": "S", # Ser + "cct": "P", "ccc": "P", # Pro + "act": "T", "acc": "T", # Thr + "gct": "A", "gcc": "A", # Ala + "tat": "Y", "tac": "Y", # Tyr + "cat": "H", "cac": "H", # His + "caa": "Q", "cag": "Q", # Gln + "aat": "N", "aac": "N", # Asn + "aaa": "K", "aag": "K", # Lys + "gat": "D", "gac": "D", # Asp + "gaa": "E", "gag": "E", # Glu + "tgt": "C", "tgc": "C", # Cys + "tgg": "W", # Trp + "cgt": "R", "cgc": "R", # Arg + "ggt": "G", "ggc": "G", # Gly + } + for codon, expected_aa in known.items(): + assert CODON_TO_AA[codon] == expected_aa, ( + f"CODON_TO_AA[{codon!r}] = {CODON_TO_AA[codon]!r}, expected {expected_aa!r}" + ) + + def test_all_standard_amino_acids_represented(self): + standard_aas = set("ACDEFGHIKLMNPQRSTVWY*") + observed_aas = set(CODON_TO_AA.values()) + assert observed_aas == standard_aas + + +# --------------------------------------------------------------------------- +# DEGEN_BASE_SPECIFIER +# --------------------------------------------------------------------------- + +class TestDegenBaseSpecifier: + def test_canonical_bases_map_to_themselves(self): + for base in "acgt": + assert DEGEN_BASE_SPECIFIER[base] == base + + def test_n_maps_to_all_bases(self): + assert DEGEN_BASE_SPECIFIER["n"] == "acgt" + + def test_r_is_purine(self): + assert set(DEGEN_BASE_SPECIFIER["r"]) == set("ag") + + def test_y_is_pyrimidine(self): + assert set(DEGEN_BASE_SPECIFIER["y"]) == set("ct") + + def test_all_values_contain_only_acgt(self): + for code, expansion in DEGEN_BASE_SPECIFIER.items(): + assert set(expansion) <= set("acgt"), ( + f"DEGEN_BASE_SPECIFIER[{code!r}] contains non-ACGT chars: {expansion!r}" + ) + + def test_all_expansions_are_sorted(self): + """Expansions should be in alphabetical order (acgt).""" + for code, expansion in DEGEN_BASE_SPECIFIER.items(): + assert list(expansion) == sorted(expansion), ( + f"DEGEN_BASE_SPECIFIER[{code!r}] is not sorted: {expansion!r}" + ) + + def test_has_all_iupac_codes(self): + expected_keys = set("acgtrymswbvdhn") + assert set(DEGEN_BASE_SPECIFIER.keys()) == expected_keys + + +# --------------------------------------------------------------------------- +# COMPLEMENT_DICT +# --------------------------------------------------------------------------- + +class TestComplementDict: + def test_a_complements_t(self): + assert COMPLEMENT_DICT["a"] == "t" + + def test_t_complements_a(self): + assert COMPLEMENT_DICT["t"] == "a" + + def test_g_complements_c(self): + assert COMPLEMENT_DICT["g"] == "c" + + def test_c_complements_g(self): + assert COMPLEMENT_DICT["c"] == "g" + + def test_self_complementary_entries(self): + for base in ("n", "-"): + assert COMPLEMENT_DICT[base] == base + + def test_complement_is_involution(self): + """Complementing twice should return the original base.""" + for base in "acgt": + comp = COMPLEMENT_DICT[base] + assert COMPLEMENT_DICT[comp] == base, ( + f"Complement of complement({base!r}) != {base!r}" + ) diff --git a/tests/tfscreen/genetics/test_library_manager.py b/tests/tfscreen/genetics/test_library_manager.py index 333c3098..73d0b0f0 100644 --- a/tests/tfscreen/genetics/test_library_manager.py +++ b/tests/tfscreen/genetics/test_library_manager.py @@ -102,7 +102,7 @@ def test_check_contiguous_lib_blocks_failure(invalid_string, offending_char): with pytest.raises(ValueError) as excinfo: _check_contiguous_lib_blocks(invalid_string) - assert f"Sub-library '{offending_char}' is not in a contiguous block" in str(excinfo.value) + assert f"Tile '{offending_char}' is not in a contiguous block" in str(excinfo.value) # ---------------------------------------------------------------------------- @@ -131,17 +131,17 @@ def test_check_lib_key_success(seen_libs): ("", "Invalid command ''"), # Wrong number of parts for 'single' - ("single", "'single' keys must have one sub-library part"), - ("single-1-2", "'single' keys must have one sub-library part"), + ("single", "'single' keys must have one tile part"), + ("single-1-2", "'single' keys must have one tile part"), # Wrong number of parts for 'double' - ("double-1", "'double' keys must have two sub-library parts"), - ("double-1-2-3", "'double' keys must have two sub-library parts"), + ("double-1", "'double' keys must have two tile parts"), + ("double-1-2-3", "'double' keys must have two tile parts"), - # Unrecognized sub-libraries - ("single-3", "Unrecognized sub-library '3'"), - ("double-1-Z", "Unrecognized sub-library 'Z'"), - ("double-X-Y", "Unrecognized sub-library 'X'"), # Should catch the first one + # Unrecognized tiles + ("single-3", "Unrecognized tile '3'"), + ("double-1-Z", "Unrecognized tile 'Z'"), + ("double-X-Y", "Unrecognized tile 'X'"), # Should catch the first one ]) def test_check_lib_key_failure(invalid_key, expected_msg_fragment, seen_libs): """ @@ -166,8 +166,8 @@ def valid_config() -> dict: "wt_seq": "gattacagtcgattaca", # CORRECTED: Shifted block left by 1 to align with reading_frame 0 "degen_sites": "......nnn........", - "sub_libraries":"......222........", - "library_combos": ["single-2"] + "tiles": "......222........", + "tile_combos": ["single-2"] } def test_parse_success(valid_config): @@ -185,12 +185,12 @@ def test_parse_success(valid_config): def test_parse_whitespace_stripped(valid_config): """ - Whitespace (spaces, newlines) in wt_seq, degen_sites, and sub_libraries + Whitespace (spaces, newlines) in wt_seq, degen_sites, and tiles is removed before validation, allowing YAML literal-block multiline values. """ - valid_config["wt_seq"] = "gattac\nagtcgattaca" - valid_config["degen_sites"] = "......\nnnn........" - valid_config["sub_libraries"] = "......\n222........" + valid_config["wt_seq"] = "gattac\nagtcgattaca" + valid_config["degen_sites"] = "......\nnnn........" + valid_config["tiles"] = "......\n222........" lm = LibraryManager(valid_config) assert lm.expected_length == 17 assert lm.wt_seq == "gattacagtcgattaca" @@ -214,9 +214,9 @@ def test_parse_mismatched_lengths(valid_config): def test_parse_non_contiguous_sublibs(valid_config): """ - Tests that a ValueError is raised for non-contiguous sub-libraries. + Tests that a ValueError is raised for non-contiguous tiles. """ - valid_config["sub_libraries"] = "..11..2.2..11...." + valid_config["tiles"] = "..11..2.2..11...." with pytest.raises(ValueError, match="is not in a contiguous block"): LibraryManager(valid_config) @@ -235,11 +235,11 @@ def test_parse_misplaced_degen_base(valid_config): def test_parse_bad_lib_combo(valid_config): """ - Tests that a ValueError is raised for an undefined sub-library in - library_combos. + Tests that a ValueError is raised for an undefined tile in + tile_combos. """ - valid_config["library_combos"] = ["single-3"] # '3' is not defined - with pytest.raises(ValueError, match="Unrecognized sub-library '3'"): + valid_config["tile_combos"] = ["single-3"] # '3' is not defined + with pytest.raises(ValueError, match="Unrecognized tile '3'"): LibraryManager(valid_config) def test_parse_bad_reading_frame(valid_config): @@ -270,7 +270,7 @@ def test_prepare_blocks_simple_case(): # Create a bare instance and set only the necessary attributes lm = LibraryManager.__new__(LibraryManager) lm.wt_seq = "gattaca" - lm.sub_libraries = "..11..." + lm.tiles = "..11..." # Call the method under test lm._prepare_blocks() @@ -297,7 +297,7 @@ def test_prepare_blocks_no_libraries(): with patch.object(LibraryManager, '_prepare_indiv_lib_blocks') as mock_prepare: lm = LibraryManager.__new__(LibraryManager) lm.wt_seq = "acgt" - lm.sub_libraries = "...." + lm.tiles = "...." lm._prepare_blocks() @@ -322,7 +322,7 @@ def test_prepare_blocks_multiple_libraries(): lm = LibraryManager.__new__(LibraryManager) lm.wt_seq = "agattaca" - lm.sub_libraries = ".1.22..." + lm.tiles = ".1.22..." lm._prepare_blocks() @@ -356,7 +356,7 @@ def bare_lm() -> LibraryManager: def test_pib_aligned_no_flanks(bare_lm): """Tests a sub-library perfectly aligned with the reading frame.""" bare_lm.reading_frame = 0 - bare_lm.sub_libraries = "...111..." + bare_lm.tiles = "...111..." bare_lm.degen_sites = "...nnt..." bare_lm.wt_seq = "...act..." @@ -373,7 +373,7 @@ def test_pib_with_left_flank(bare_lm): bare_lm.reading_frame = 0 # CORRECTED: Made all strings the same length and ensured the core # part of the library is a complete codon. - bare_lm.sub_libraries = ".11111" # Starts at index 1, length 5 + bare_lm.tiles = ".11111" # Starts at index 1, length 5 bare_lm.degen_sites = ".acnnt" # 'ac' is the flank, 'nnt' is the core bare_lm.wt_seq = ".acact" @@ -387,7 +387,7 @@ def test_pib_with_left_flank(bare_lm): def test_pib_with_right_flank(bare_lm): """Tests a sub-library that ends out of frame, creating a right flank.""" bare_lm.reading_frame = 0 - bare_lm.sub_libraries = "1111." # Starts at index 0 (frame 0), len 4 -> 1 trailing + bare_lm.tiles = "1111." # Starts at index 0 (frame 0), len 4 -> 1 trailing bare_lm.degen_sites = "nntg." bare_lm.wt_seq = "actg." @@ -400,11 +400,11 @@ def test_pib_with_right_flank(bare_lm): def test_pib_with_both_flanks(bare_lm): """Tests a sub-library with both left and right flanks.""" bare_lm.reading_frame = 1 - bare_lm.sub_libraries = "..11111" # Starts at index 2 (frame 2), len 5 + bare_lm.tiles = "..11111" # Starts at index 2 (frame 2), len 5 # offset=(1-2)%3=2. core len=3. trailing=0. Mistake. # Let's fix. sub-lib len=6. Starts at index 2. # core_lib_seq len = 4. num_trailing = 1. - bare_lm.sub_libraries = "..111111" # len 6 + bare_lm.tiles = "..111111" # len 6 bare_lm.degen_sites = "..acnntg" bare_lm.wt_seq = "..acactg" @@ -417,7 +417,7 @@ def test_pib_with_both_flanks(bare_lm): def test_pib_fails_degen_in_left_flank(bare_lm): """Tests that ValueError is raised for a degenerate base in a left flank.""" bare_lm.reading_frame = 0 - bare_lm.sub_libraries = ".1111" + bare_lm.tiles = ".1111" bare_lm.degen_sites = ".ncnnt" # 'n' is in the flank bare_lm.wt_seq = ".acact" @@ -796,7 +796,7 @@ def test_get_libraries_dispatcher(mock_get_singles, mock_get_spiked): """ Tests that get_libraries correctly dispatches to the appropriate - helper methods based on the library_combos. + helper methods based on the tile_combos. """ # 1. Setup mock return values to be unique and trackable mock_get_singles.return_value = (['s_dna'], ['s_aa']) @@ -806,7 +806,7 @@ def test_get_libraries_dispatcher(mock_get_singles, # 2. Setup a bare instance with a list of combos to test lm = LibraryManager.__new__(LibraryManager) - lm.library_combos = [ + lm.tile_combos = [ "single-1", "double-2-2", # Should call intra-doubles "double-1-2" # Should call inter-doubles diff --git a/tests/tfscreen/mle/test_parse_patsy.py b/tests/tfscreen/mle/test_parse_patsy.py deleted file mode 100644 index 575efa23..00000000 --- a/tests/tfscreen/mle/test_parse_patsy.py +++ /dev/null @@ -1,82 +0,0 @@ - -import pytest -import pandas as pd -import numpy as np -from tfscreen.mle.parse_patsy import parse_patsy - -def test_parse_patsy_simple(): - df = pd.DataFrame({"color": ["red", "blue"], "size": [1, 2]}) - - # Patsy often generates names like "beta[T.red]" if formula is "y ~ C(color)" - # If using custom terms, it might look different. - # The code expects `param[specifier]`. - - patsy_param_names = [ - "beta[T.red]", - "beta[T.blue]" - ] - - # model_terms maps "beta" -> "beta" usually? - # Code: patsy_to_pretty = dict((value,key) for key, value in model_terms.items()) - # So if model_terms = {"beta": "beta"}, patsy_to_pretty["beta"] = "beta". - model_terms = {"beta": "beta"} - - # factor_terms maps param_class ("beta") to columns ("color") - factor_terms = {"beta": "color"} - - res = parse_patsy(df, patsy_param_names, model_terms, factor_terms) - - assert len(res) == 2 - assert "color" in res.columns - assert res.iloc[0]["param_class"] == "beta" - assert res.iloc[0]["color"] == "red" # Coerced to string - assert res.iloc[1]["color"] == "blue" - -def test_parse_patsy_numeric_coercion(): - df = pd.DataFrame({"size": [1, 2]}) - patsy_param_names = ["gamma[1]", "gamma[2]"] - model_terms = {"gamma": "gamma"} - factor_terms = {"gamma": "size"} - - res = parse_patsy(df, patsy_param_names, model_terms, factor_terms) - - # Should be coerced to int because df["size"] is int - assert res.iloc[0]["size"] == 1 - assert isinstance(res.iloc[0]["size"], (int, np.integer)) - -def test_parse_patsy_tuple_factors(): - df = pd.DataFrame({"color": ["red"], "temp": [10]}) - patsy_param_names = ["k[red, 10]"] # patsy interaction term often: k[T.red:10] or k[red, 10]? - # Code handles specifier that looks like tuple? - # "If this looks like a tuple, split it into individual values" - # But patsy output for interaction is usually "A:B". - # The code specifically checks for `(` and `)`. - # Maybe custom coding? Or how patsy formats tuples. - # "If specifier[0] == '(' ... " - - patsy_param_names = ["k[(red, 10)]"] - model_terms = {"k": "k"} - factor_terms = {"k": ["color", "temp"]} - - res = parse_patsy(df, patsy_param_names, model_terms, factor_terms) - - assert res.iloc[0]["color"] == "red" - assert res.iloc[0]["temp"] == 10 - -def test_parse_patsy_errors(): - df = pd.DataFrame({"color": ["red"]}) - patsy_param_names = ["k[red]"] - model_terms = {"k": "k"} - factor_terms = {"k": ["color", "shape"]} # Mismatch length - - with pytest.raises(RuntimeError, match="problem parsing the patsy"): - parse_patsy(df, patsy_param_names, model_terms, factor_terms) - -def test_parse_patsy_coercion_error(): - df = pd.DataFrame({"val": [1]}) # int - patsy_param_names = ["k[foo]"] # 'foo' cannot be int - model_terms = {"k": "k"} - factor_terms = {"k": "val"} - - with pytest.raises(RuntimeError, match="problem coercing the factor"): - parse_patsy(df, patsy_param_names, model_terms, factor_terms) diff --git a/tests/tfscreen/process_raw/test_counts_io.py b/tests/tfscreen/process_raw/test_counts_io.py new file mode 100644 index 00000000..cd2f64f4 --- /dev/null +++ b/tests/tfscreen/process_raw/test_counts_io.py @@ -0,0 +1,128 @@ +import pytest +import pandas as pd +import pandas.testing as pd_testing +from unittest.mock import patch, call + +from tfscreen.process_raw._counts_io import _prep_sample_df, _aggregate_counts + + +# ------------------------ +# Fixtures +# ------------------------ + +@pytest.fixture +def fx_sample_df() -> pd.DataFrame: + return pd.DataFrame({ + "sample": ["s1", "s2"], + "sample_cfu": [1e8, 1.6e8], + "sample_cfu_std": [1e7, 1.6e7], + }) + + +@pytest.fixture +def fx_counts_dir(tmp_path): + counts_path = tmp_path / "counts_dir" + counts_path.mkdir() + (counts_path / "counts_s1_file.csv").touch() + (counts_path / "counts_s2_file.csv").touch() + (counts_path / "counts_s2_ambiguous.csv").touch() + return counts_path + + +# ------------------------ +# Tests for _prep_sample_df +# ------------------------ + +@patch('glob.glob') +@patch('os.path.isdir', return_value=True) +@patch('tfscreen.util.io.read_dataframe') +def test_prep_sample_df_happy_path(mock_read_df, mock_isdir, mock_glob, fx_sample_df): + mock_read_df.return_value = fx_sample_df.set_index("sample") + mock_glob.side_effect = [ + ["/path/to/counts_s1_file.csv"], + ["/path/to/counts_s2_file.csv"] + ] + + result_df = _prep_sample_df( + sample_df="dummy_path", + counts_csv_path="/path/to", + counts_glob_prefix="counts", + verbose=False + ) + + mock_read_df.assert_called_once_with("dummy_path", index_column="sample") + assert "obs_file" in result_df.columns + assert result_df.loc["s1", "obs_file"] == "/path/to/counts_s1_file.csv" + assert result_df.index.name == "sample" + + +@patch('builtins.print') +@patch('glob.glob') +@patch('os.path.isdir', return_value=True) +@patch('tfscreen.util.io.read_dataframe') +def test_prep_sample_df_verbose_output(mock_read_df, mock_isdir, mock_glob, mock_print, fx_sample_df): + mock_read_df.return_value = fx_sample_df.set_index("sample") + mock_glob.side_effect = [["f1"], ["f2"]] + + _prep_sample_df(sample_df="dummy", counts_csv_path="dummy", verbose=True) + + assert mock_print.call_count > 0 + assert "2 unique samples" in mock_print.call_args_list[0][0][0] + + +def test_prep_sample_df_dir_not_found(fx_sample_df): + with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): + with patch('os.path.isdir', return_value=False): + with pytest.raises(FileNotFoundError, match="is not a directory"): + _prep_sample_df(fx_sample_df, "invalid_path") + + +def test_prep_sample_df_duplicate_samples(fx_sample_df): + dup_df = pd.concat([fx_sample_df, fx_sample_df.iloc[[0]]]).set_index("sample") + with patch('tfscreen.util.io.read_dataframe', return_value=dup_df): + with pytest.raises(ValueError, match="samples must be unique"): + _prep_sample_df("dummy_path", "dummy_dir") + + +def test_prep_sample_df_missing_file(fx_sample_df, fx_counts_dir): + with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): + with pytest.raises(ValueError, match="MISSING: No files found for sample 's1'"): + _prep_sample_df(fx_sample_df, str(fx_counts_dir), counts_glob_prefix="obs") + + +def test_prep_sample_df_ambiguous_files(fx_sample_df, fx_counts_dir): + with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): + with pytest.raises(ValueError, match="AMBIGUOUS: 2 files found for sample 's2'"): + _prep_sample_df(fx_sample_df, str(fx_counts_dir), counts_glob_prefix="counts") + + +def test_prep_sample_df_bad_index(fx_sample_df): + with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df): + with pytest.raises(ValueError, match="sample_df must be indexed by 'sample'"): + _prep_sample_df(fx_sample_df, "dummy_dir") + + +# ------------------------ +# Tests for _aggregate_counts +# ------------------------ + +@patch('pandas.read_csv') +def test_aggregate_counts(mock_read_csv): + sample_df = pd.DataFrame({ + "obs_file": ["/path/s1.csv", "/path/s2.csv"] + }, index=pd.Index(["s1", "s2"], name="sample")) + + df1 = pd.DataFrame({"genotype": ["wt", "A1C"], "counts": [100, 10]}) + df2 = pd.DataFrame({"genotype": ["wt", "G2T"], "counts": [200, 20]}) + mock_read_csv.side_effect = [df1, df2] + + result_df = _aggregate_counts(sample_df) + + expected_df = pd.DataFrame({ + "sample": ["s1", "s1", "s2", "s2"], + "genotype": ["wt", "A1C", "wt", "G2T"], + "counts": [100, 10, 200, 20] + }) + + pd_testing.assert_frame_equal(result_df, expected_df) + mock_read_csv.assert_has_calls([call("/path/s1.csv"), call("/path/s2.csv")]) diff --git a/tests/tfscreen/process_raw/test_process_counts_cli.py b/tests/tfscreen/process_raw/test_process_counts_cli.py index 0ea631de..cda97b65 100644 --- a/tests/tfscreen/process_raw/test_process_counts_cli.py +++ b/tests/tfscreen/process_raw/test_process_counts_cli.py @@ -1,143 +1,22 @@ import pytest import pandas as pd -import pandas.testing as pd_testing -from unittest.mock import patch, call +from unittest.mock import patch + +from tfscreen.process_raw.scripts.process_counts_cli import process_counts -from tfscreen.process_raw.scripts.process_counts_cli import ( - _prep_sample_df, - _aggregate_counts, - process_counts, -) # ------------------------ -# Pytest Fixtures +# Fixture # ------------------------ @pytest.fixture def fx_sample_df() -> pd.DataFrame: - """Provides a sample DataFrame for testing.""" return pd.DataFrame({ "sample": ["s1", "s2"], "sample_cfu": [1e8, 1.6e8], "sample_cfu_std": [1e7, 1.6e7], }) -@pytest.fixture -def fx_counts_dir(tmp_path): - """Creates a temporary directory with dummy count CSV files.""" - counts_path = tmp_path / "counts_dir" - counts_path.mkdir() - - # Create valid files - (counts_path / "counts_s1_file.csv").touch() - (counts_path / "counts_s2_file.csv").touch() - - # Create an extra file to test ambiguous matching - (counts_path / "counts_s2_ambiguous.csv").touch() - - return counts_path - -# ------------------------ -# Test _prep_sample_df -# ------------------------ - -@patch('glob.glob') -@patch('os.path.isdir', return_value=True) -@patch('tfscreen.util.io.read_dataframe') -def test_prep_sample_df_happy_path(mock_read_df, mock_isdir, mock_glob, fx_sample_df): - """Tests successful validation and file matching.""" - mock_read_df.return_value = fx_sample_df.set_index("sample") - - mock_glob.side_effect = [ - ["/path/to/counts_s1_file.csv"], - ["/path/to/counts_s2_file.csv"] - ] - - result_df = _prep_sample_df( - sample_df="dummy_path", - counts_csv_path="/path/to", - counts_glob_prefix="counts", - verbose=False - ) - - mock_read_df.assert_called_once_with("dummy_path", index_column="sample") - assert "obs_file" in result_df.columns - assert result_df.loc["s1", "obs_file"] == "/path/to/counts_s1_file.csv" - assert result_df.index.name == "sample" - -@patch('builtins.print') -@patch('glob.glob') -@patch('os.path.isdir', return_value=True) -@patch('tfscreen.util.io.read_dataframe') -def test_prep_sample_df_verbose_output(mock_read_df, mock_isdir, mock_glob, mock_print, fx_sample_df): - """Tests that verbose=True produces print output.""" - mock_read_df.return_value = fx_sample_df.set_index("sample") - mock_glob.side_effect = [["f1"], ["f2"]] - - _prep_sample_df(sample_df="dummy", counts_csv_path="dummy", verbose=True) - - assert mock_print.call_count > 0 - assert "2 unique samples" in mock_print.call_args_list[0][0][0] - -def test_prep_sample_df_dir_not_found(fx_sample_df): - """Tests that FileNotFoundError is raised for an invalid directory.""" - with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): - with patch('os.path.isdir', return_value=False): - with pytest.raises(FileNotFoundError, match="is not a directory"): - _prep_sample_df(fx_sample_df, "invalid_path") - -def test_prep_sample_df_duplicate_samples(fx_sample_df): - """Tests that ValueError is raised for non-unique samples.""" - dup_df = pd.concat([fx_sample_df, fx_sample_df.iloc[[0]]]).set_index("sample") - with patch('tfscreen.util.io.read_dataframe', return_value=dup_df): - with pytest.raises(ValueError, match="samples must be unique"): - _prep_sample_df("dummy_path", "dummy_dir") - -def test_prep_sample_df_missing_file(fx_sample_df, fx_counts_dir): - """Tests that ValueError is raised when a sample's file is missing.""" - with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): - with pytest.raises(ValueError, match="MISSING: No files found for sample 's1'"): - _prep_sample_df(fx_sample_df, str(fx_counts_dir), counts_glob_prefix="obs") - -def test_prep_sample_df_ambiguous_files(fx_sample_df, fx_counts_dir): - """Tests that ValueError is raised when a sample has multiple file matches.""" - with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df.set_index("sample")): - with pytest.raises(ValueError, match="AMBIGUOUS: 2 files found for sample 's2'"): - _prep_sample_df(fx_sample_df, str(fx_counts_dir), counts_glob_prefix="counts") - -def test_prep_sample_df_bad_index(fx_sample_df): - """Tests that ValueError is raised if 'sample' is not the index.""" - with patch('tfscreen.util.io.read_dataframe', return_value=fx_sample_df): - with pytest.raises(ValueError, match="sample_df must be indexed by 'sample'"): - _prep_sample_df(fx_sample_df, "dummy_dir") - - -# ------------------------ -# Test _aggregate_counts -# ------------------------ - -@patch('pandas.read_csv') -def test_aggregate_counts(mock_read_csv): - """Tests the aggregation of multiple count files into a single DataFrame.""" - sample_df = pd.DataFrame({ - "obs_file": ["/path/s1.csv", "/path/s2.csv"] - }, index=pd.Index(["s1", "s2"], name="sample")) - - df1 = pd.DataFrame({"genotype": ["wt", "A1C"], "counts": [100, 10]}) - df2 = pd.DataFrame({"genotype": ["wt", "G2T"], "counts": [200, 20]}) - mock_read_csv.side_effect = [df1, df2] - - result_df = _aggregate_counts(sample_df) - - expected_df = pd.DataFrame({ - "sample": ["s1", "s1", "s2", "s2"], - "genotype": ["wt", "A1C", "wt", "G2T"], - "counts": [100, 10, 200, 20] - }) - - pd_testing.assert_frame_equal(result_df, expected_df) - mock_read_csv.assert_has_calls([call("/path/s1.csv"), call("/path/s2.csv")]) - # ------------------------ # Test process_counts @@ -150,10 +29,7 @@ def test_aggregate_counts(mock_read_csv): def test_process_counts_orchestration( mock_prep, mock_agg, mock_lncfu, mock_to_csv, fx_sample_df ): - """ - Tests the main `process_counts` function by mocking its dependencies - to verify the overall workflow and data handoffs. - """ + """Verify the overall workflow and data handoffs.""" df_prepped = fx_sample_df.set_index("sample") df_aggregated = pd.DataFrame({"s": ["s1"], "aggregated": [True]}) df_final = pd.DataFrame({"s": ["s1"], "final_lncfu": [True]}) @@ -181,7 +57,7 @@ def test_process_counts_orchestration( def test_process_counts_missing_cfu_columns(tmp_path): - """Tests that ValueError is raised when sample_cfu or sample_cfu_std are absent.""" + """ValueError raised when sample_cfu_std is absent.""" bad_df = pd.DataFrame({ "sample": ["s1", "s2"], "sample_cfu": [1e8, 1.6e8], diff --git a/tests/tfscreen/process_raw/test_process_presplit_cli.py b/tests/tfscreen/process_raw/test_process_presplit_cli.py new file mode 100644 index 00000000..2c0b9f4c --- /dev/null +++ b/tests/tfscreen/process_raw/test_process_presplit_cli.py @@ -0,0 +1,268 @@ +import pytest +import numpy as np +import pandas as pd +import pandas.testing as pd_testing +from unittest.mock import patch, MagicMock, ANY + +from tfscreen.process_raw.scripts.process_presplit_cli import process_presplit + + +# ------------------------ +# Fixtures +# ------------------------ + +@pytest.fixture +def fx_sample_df() -> pd.DataFrame: + """Minimal presplit sample metadata.""" + return pd.DataFrame({ + "sample": ["ps_rep1_kanR", "ps_rep2_kanR"], + "replicate": [1, 2], + "condition_pre": ["kanR-cond", "kanR-cond"], + "sample_cfu": [1e8, 1.2e8], + "sample_cfu_std": [1e7, 1.2e7], + }) + + +@pytest.fixture +def fx_lncfu_df() -> pd.DataFrame: + """Simulated output from counts_to_lncfu, including ln_cfu_var.""" + return pd.DataFrame({ + "sample": ["ps_rep1_kanR", "ps_rep1_kanR", "ps_rep2_kanR", "ps_rep2_kanR"], + "replicate": [1, 1, 2, 2], + "condition_pre": ["kanR-cond", "kanR-cond", "kanR-cond", "kanR-cond"], + "library": ["default"] * 4, + "genotype": ["wt", "A1V", "wt", "A1V"], + "ln_cfu": [10.0, 9.5, 10.1, 9.4], + "ln_cfu_var": [0.01, 0.02, 0.01, 0.02], + }) + + +# ------------------------ +# Tests for process_presplit +# ------------------------ + +@patch('pandas.DataFrame.to_csv') +@patch('tfscreen.process_raw.scripts.process_presplit_cli.get_scaled_cfu') +@patch('tfscreen.process_raw.scripts.process_presplit_cli.counts_to_lncfu') +@patch('tfscreen.process_raw.scripts.process_presplit_cli._aggregate_counts') +@patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df') +def test_process_presplit_orchestration( + mock_prep, mock_agg, mock_lncfu, mock_scaled, mock_to_csv, + fx_sample_df, fx_lncfu_df +): + """Verify the overall workflow, data handoffs, and column selection.""" + df_prepped = fx_sample_df.set_index("sample") + df_counts = pd.DataFrame({"sample": ["ps_rep1_kanR"], "genotype": ["wt"], "counts": [100]}) + # get_scaled_cfu adds ln_cfu_std to the df + df_scaled = fx_lncfu_df.copy() + df_scaled["ln_cfu_std"] = np.sqrt(df_scaled["ln_cfu_var"]) + + mock_prep.return_value = df_prepped + mock_agg.return_value = df_counts + mock_lncfu.return_value = fx_lncfu_df + mock_scaled.return_value = df_scaled + + process_presplit( + sample_df=fx_sample_df, + counts_csv_path="/counts/path", + output_file="/out/presplit.csv", + counts_glob_prefix="counts", + min_genotype_obs=5, + pseudocount=1, + verbose=False + ) + + mock_prep.assert_called_once_with(fx_sample_df, "/counts/path", "counts", False) + # _aggregate_counts receives the sample_df with 'library' injected (ANY because + # the exact df object varies when library is added) + mock_agg.assert_called_once_with(ANY) + mock_lncfu.assert_called_once_with(ANY, df_counts, + min_genotype_obs=5, pseudocount=1) + mock_scaled.assert_called_once() + + # Verify to_csv is called once on the result + mock_to_csv.assert_called_once_with("/out/presplit.csv", index=False) + + + +def test_process_presplit_output_columns_integration(fx_sample_df, fx_lncfu_df, tmp_path): + """Integration-style: verify the CSV is written with the right columns.""" + df_prepped = fx_sample_df.set_index("sample") + df_scaled = fx_lncfu_df.copy() + df_scaled["ln_cfu_std"] = np.sqrt(df_scaled["ln_cfu_var"]) + output_file = str(tmp_path / "presplit.csv") + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=df_prepped), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli._aggregate_counts', + return_value=pd.DataFrame()), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.counts_to_lncfu', + return_value=fx_lncfu_df), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.get_scaled_cfu', + return_value=df_scaled): + + process_presplit( + sample_df=fx_sample_df, + counts_csv_path="/counts/path", + output_file=output_file, + verbose=False + ) + + result = pd.read_csv(output_file) + assert set(result.columns) == {"replicate", "condition_pre", "genotype", + "ln_cfu", "ln_cfu_std"} + # Extra columns from counts_to_lncfu (library, sample, ln_cfu_var) must be absent + assert "library" not in result.columns + assert "ln_cfu_var" not in result.columns + assert "sample" not in result.columns + + +def test_process_presplit_output_sorted(fx_sample_df, fx_lncfu_df, tmp_path): + """Output rows are sorted by (replicate, condition_pre, genotype).""" + df_prepped = fx_sample_df.set_index("sample") + # Deliberately shuffle the order in the lncfu df + df_shuffled = fx_lncfu_df.iloc[::-1].reset_index(drop=True) + df_scaled = df_shuffled.copy() + df_scaled["ln_cfu_std"] = np.sqrt(df_scaled["ln_cfu_var"]) + output_file = str(tmp_path / "presplit_sorted.csv") + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=df_prepped), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli._aggregate_counts', + return_value=pd.DataFrame()), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.counts_to_lncfu', + return_value=df_shuffled), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.get_scaled_cfu', + return_value=df_scaled): + + process_presplit( + sample_df=fx_sample_df, + counts_csv_path="/counts/path", + output_file=output_file, + verbose=False + ) + + result = pd.read_csv(output_file) + sorted_result = result.sort_values( + by=["replicate", "condition_pre", "genotype"] + ).reset_index(drop=True) + pd_testing.assert_frame_equal(result, sorted_result) + + +def test_process_presplit_missing_replicate_column(tmp_path, fx_sample_df): + """ValueError raised when 'replicate' is absent from sample_df.""" + bad_df = fx_sample_df.drop(columns=["replicate"]) + prepped = bad_df.set_index("sample") + prepped["obs_file"] = "dummy.csv" + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=prepped): + with pytest.raises(ValueError, match="Not all required columns seen"): + process_presplit( + sample_df=bad_df, + counts_csv_path=str(tmp_path), + output_file="/out/presplit.csv", + ) + + +def test_process_presplit_missing_condition_pre_column(tmp_path, fx_sample_df): + """ValueError raised when 'condition_pre' is absent from sample_df.""" + bad_df = fx_sample_df.drop(columns=["condition_pre"]) + prepped = bad_df.set_index("sample") + prepped["obs_file"] = "dummy.csv" + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=prepped): + with pytest.raises(ValueError, match="Not all required columns seen"): + process_presplit( + sample_df=bad_df, + counts_csv_path=str(tmp_path), + output_file="/out/presplit.csv", + ) + + +def test_process_presplit_missing_cfu_column(tmp_path, fx_sample_df): + """ValueError raised when 'sample_cfu_std' is absent from sample_df.""" + bad_df = fx_sample_df.drop(columns=["sample_cfu_std"]) + prepped = bad_df.set_index("sample") + prepped["obs_file"] = "dummy.csv" + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=prepped): + with pytest.raises(ValueError, match="Not all required columns seen"): + process_presplit( + sample_df=bad_df, + counts_csv_path=str(tmp_path), + output_file="/out/presplit.csv", + ) + + +def test_process_presplit_default_library_added(fx_sample_df, fx_lncfu_df, tmp_path): + """When sample_df has no 'library' column, 'default' is injected before counts_to_lncfu.""" + df_prepped = fx_sample_df.set_index("sample") + assert "library" not in df_prepped.columns + + df_scaled = fx_lncfu_df.copy() + df_scaled["ln_cfu_std"] = np.sqrt(df_scaled["ln_cfu_var"]) + + lncfu_calls = [] + + def capture_lncfu(sdf, cdf, **kwargs): + lncfu_calls.append(sdf.copy()) + return fx_lncfu_df + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=df_prepped), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli._aggregate_counts', + return_value=pd.DataFrame()), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.counts_to_lncfu', + side_effect=capture_lncfu), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.get_scaled_cfu', + return_value=df_scaled), \ + patch('pandas.DataFrame.to_csv'): + + process_presplit( + sample_df=fx_sample_df, + counts_csv_path="/counts/path", + output_file=str(tmp_path / "out.csv"), + verbose=False + ) + + assert len(lncfu_calls) == 1 + assert "library" in lncfu_calls[0].columns + assert (lncfu_calls[0]["library"] == "default").all() + + +def test_process_presplit_existing_library_preserved(fx_sample_df, fx_lncfu_df, tmp_path): + """When sample_df already has a 'library' column, it is not overwritten.""" + df_with_lib = fx_sample_df.copy() + df_with_lib["library"] = ["lib_A", "lib_B"] + df_prepped = df_with_lib.set_index("sample") + + df_scaled = fx_lncfu_df.copy() + df_scaled["ln_cfu_std"] = np.sqrt(df_scaled["ln_cfu_var"]) + + lncfu_calls = [] + + def capture_lncfu(sdf, cdf, **kwargs): + lncfu_calls.append(sdf.copy()) + return fx_lncfu_df + + with patch('tfscreen.process_raw.scripts.process_presplit_cli._prep_sample_df', + return_value=df_prepped), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli._aggregate_counts', + return_value=pd.DataFrame()), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.counts_to_lncfu', + side_effect=capture_lncfu), \ + patch('tfscreen.process_raw.scripts.process_presplit_cli.get_scaled_cfu', + return_value=df_scaled), \ + patch('pandas.DataFrame.to_csv'): + + process_presplit( + sample_df=df_with_lib, + counts_csv_path="/counts/path", + output_file=str(tmp_path / "out.csv"), + verbose=False + ) + + assert list(lncfu_calls[0]["library"]) == ["lib_A", "lib_B"] diff --git a/tests/tfscreen/simulate/test_generate_presplit_data.py b/tests/tfscreen/simulate/test_generate_presplit_data.py index 83d3cf7c..f1ae7639 100644 --- a/tests/tfscreen/simulate/test_generate_presplit_data.py +++ b/tests/tfscreen/simulate/test_generate_presplit_data.py @@ -36,7 +36,7 @@ def _make_inputs( # Two selection samples per (rep, cp) (different t_sel) for t_sel in (60.0, 90.0): sample_rows.append( - {"sample": sample_id, "replicate": rep, + {"sample": sample_id, "replicate": rep, "library": "lib", "condition_pre": cp, "t_sel": t_sel, "sample_cfu": 1e8, "sample_cfu_std": 5e6} ) @@ -72,8 +72,8 @@ def test_output_columns(): sample_df, counts_df = _make_inputs() result = _generate_presplit_data(sample_df, counts_df, _minimal_cf(), np.random.default_rng(0)) - for col in ["replicate", "condition_pre", "genotype", "ln_cfu", "ln_cfu_std", - "ln_cfu_0_true"]: + for col in ["library", "replicate", "condition_pre", "genotype", + "ln_cfu", "ln_cfu_std", "ln_cfu_0_true"]: assert col in result.columns, f"missing column: {col}" @@ -180,7 +180,7 @@ def test_run_simulation_writes_presplit_csv(tmp_path): # Real _simulate_library_group returns sample_df with "sample" as a # regular column and an unnamed integer index. sample_df = pd.DataFrame([{ - "sample": 0, "replicate": 1, "condition_pre": "kanR", + "sample": 0, "replicate": 1, "library": "lib", "condition_pre": "kanR", "t_sel": 60.0, "sample_cfu": 1e8, "sample_cfu_std": 5e6, }], index=[0]) counts_df = pd.DataFrame([ @@ -209,7 +209,8 @@ def test_run_simulation_writes_presplit_csv(tmp_path): presplit_path = tmp_path / "tfs_sim_presplit.csv" assert presplit_path.exists(), "presplit CSV was not written" presplit_df = pd.read_csv(presplit_path) - for col in ["replicate", "condition_pre", "genotype", "ln_cfu", "ln_cfu_std"]: + for col in ["library", "replicate", "condition_pre", "genotype", + "ln_cfu", "ln_cfu_std"]: assert col in presplit_df.columns @@ -221,7 +222,7 @@ def test_run_simulation_no_presplit_without_config(tmp_path): pheno_df = pd.DataFrame({"genotype": ["wt"]}) theta_df = pd.DataFrame({"genotype": ["wt"]}) params_df = pd.DataFrame({"genotype": ["wt"], "dk_geno": [0.0], "activity": [1.0]}) - sample_df = pd.DataFrame([{"sample": 0, "replicate": 1, + sample_df = pd.DataFrame([{"sample": 0, "replicate": 1, "library": "lib", "condition_pre": "kanR", "t_sel": 60.0, "sample_cfu": 1e8, "sample_cfu_std": 5e6}], index=[0]) diff --git a/tests/tfscreen/tfmodel/test_extract_growth_predictions.py b/tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extract_growth_predictions.py rename to tests/tfscreen/tfmodel/analysis/test_extract_growth_predictions.py diff --git a/tests/tfscreen/tfmodel/test_extract_parameters_congression.py b/tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extract_parameters_congression.py rename to tests/tfscreen/tfmodel/analysis/test_extract_parameters_congression.py diff --git a/tests/tfscreen/tfmodel/test_extract_samples.py b/tests/tfscreen/tfmodel/analysis/test_extract_samples.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extract_samples.py rename to tests/tfscreen/tfmodel/analysis/test_extract_samples.py diff --git a/tests/tfscreen/tfmodel/test_extract_theta_curves.py b/tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extract_theta_curves.py rename to tests/tfscreen/tfmodel/analysis/test_extract_theta_curves.py diff --git a/tests/tfscreen/tfmodel/test_extraction_new_models.py b/tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extraction_new_models.py rename to tests/tfscreen/tfmodel/analysis/test_extraction_new_models.py diff --git a/tests/tfscreen/tfmodel/test_extraction_robustness.py b/tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py similarity index 100% rename from tests/tfscreen/tfmodel/test_extraction_robustness.py rename to tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py diff --git a/tests/tfscreen/tfmodel/test_h5_indexing.py b/tests/tfscreen/tfmodel/analysis/test_h5_indexing.py similarity index 99% rename from tests/tfscreen/tfmodel/test_h5_indexing.py rename to tests/tfscreen/tfmodel/analysis/test_h5_indexing.py index af4c540e..5bd080c8 100644 --- a/tests/tfscreen/tfmodel/test_h5_indexing.py +++ b/tests/tfscreen/tfmodel/analysis/test_h5_indexing.py @@ -11,6 +11,7 @@ def test_predict_h5_indexing(tmp_path): # 1. Create dummy ModelOrchestrator growth_df = pd.DataFrame({ + "library": ["lib"], "genotype": ["wt"], "titrant_name": ["tit1"], "titrant_conc": [0.0], diff --git a/tests/tfscreen/tfmodel/test_prediction.py b/tests/tfscreen/tfmodel/analysis/test_prediction.py similarity index 99% rename from tests/tfscreen/tfmodel/test_prediction.py rename to tests/tfscreen/tfmodel/analysis/test_prediction.py index 05ce9041..808f3db4 100644 --- a/tests/tfscreen/tfmodel/test_prediction.py +++ b/tests/tfscreen/tfmodel/analysis/test_prediction.py @@ -12,6 +12,7 @@ def dummy_orchestrator(): """Create a dummy ModelOrchestrator instance for testing.""" growth_df = pd.DataFrame({ + "library": ["lib"] * 4, "genotype": ["wt", "wt", "M42V", "M42V"], "titrant_name": ["tit1", "tit1", "tit1", "tit1"], "titrant_conc": [0.0, 1.0, 0.0, 1.0], @@ -148,6 +149,7 @@ def test_copy_orchestrator_genotypes_tm_labels_differ_from_original(dummy_orches def spiked_orchestrator(): """ModelOrchestrator with one spiked genotype (A1G) and two library genotypes.""" growth_df = pd.DataFrame({ + "library": ["lib"] * 6, "genotype": ["wt", "wt", "M42V", "M42V", "A1G", "A1G"], "titrant_name": ["tit1"] * 6, "titrant_conc": [0.0, 1.0] * 3, @@ -185,6 +187,7 @@ def test_copy_orchestrator_spiked_partial_overlap(): """Only spiked genotypes present in the subset survive.""" # Build a fresh orchestrator with two spiked genotypes: A1G and S5T growth_df = pd.DataFrame({ + "library": ["lib"] * 8, "genotype": ["wt", "wt", "M42V", "M42V", "A1G", "A1G", "S5T", "S5T"], "titrant_name": ["tit1"] * 8, "titrant_conc": [0.0, 1.0] * 4, diff --git a/tests/tfscreen/tfmodel/test_prior_predictive.py b/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py similarity index 99% rename from tests/tfscreen/tfmodel/test_prior_predictive.py rename to tests/tfscreen/tfmodel/analysis/test_prior_predictive.py index 5ba65a11..aa93bb2e 100644 --- a/tests/tfscreen/tfmodel/test_prior_predictive.py +++ b/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py @@ -9,6 +9,7 @@ @pytest.fixture def dummy_orchestrator(): growth_df = pd.DataFrame({ + "library": ["lib", "lib", "lib", "lib"], "genotype": ["wt", "wt", "M42V", "M42V"], "titrant_name": ["tit1", "tit1", "tit1", "tit1"], "titrant_conc": [0.0, 1.0, 0.0, 1.0], diff --git a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py index 34ce0cab..9bf98df8 100644 --- a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py +++ b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py @@ -387,6 +387,58 @@ def test_scales_preserved_in_priors(self): assert priors.m_scale_plus == pytest.approx(0.01) +# --------------------------------------------------------------------------- +# Phase 2 tests: get_priors with explicit is_selection flags +# --------------------------------------------------------------------------- + +class TestGetPriorsIsSelectionPhase2: + """ + Phase 2 tests: get_priors should accept an ``is_selection`` list of booleans + directly, so callers no longer need +/- in condition names. + + All tests are xfail until a new ``is_selection`` parameter is added to + ``get_priors``. Remove the xfail marker after each test passes. + """ + + def test_is_selection_sets_m_is_selection(self): + """get_priors(is_selection=[...]) directly sets m_is_selection.""" + priors = get_priors(is_selection=[True, False, True]) + assert priors.m_is_selection == (True, False, True) + + def test_is_selection_requires_no_plus_minus_in_names(self): + """ + When is_selection is provided, condition names without +/- must work. + Currently, callers must use condition_labels with +/- to get per-condition + m priors; Phase 2 removes that naming constraint. + """ + # With the current API (condition_labels), these names would raise + # ValueError from _parse_condition_label. With is_selection, they work. + priors = get_priors(is_selection=[False, True]) + assert priors.m_is_selection == (False, True) + + def test_is_selection_false_uses_tight_prior(self): + """is_selection=False conditions get m_scale_minus (tight prior).""" + hypers = get_hyperparameters() + priors = get_priors(is_selection=[False, True]) + assert priors.m_is_selection is not None + scales = [ + hypers["m_scale_plus"] if sel else hypers["m_scale_minus"] + for sel in priors.m_is_selection + ] + assert scales[0] == pytest.approx(hypers["m_scale_minus"]) + assert scales[1] == pytest.approx(hypers["m_scale_plus"]) + + def test_is_selection_all_false(self): + """All non-selective conditions: m_is_selection all False.""" + priors = get_priors(is_selection=[False, False]) + assert priors.m_is_selection == (False, False) + + def test_is_selection_and_condition_labels_mutually_exclusive(self): + """Passing both is_selection and condition_labels must raise ValueError.""" + with pytest.raises(ValueError, match="is_selection"): + get_priors(condition_labels=["a+b"], is_selection=[True]) + + # --------------------------------------------------------------------------- # define_model — per-condition m prior # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/generative/components/theta_rescale/test_passthrough.py b/tests/tfscreen/tfmodel/generative/components/theta_rescale/test_passthrough.py index 297c1193..22b89165 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta_rescale/test_passthrough.py +++ b/tests/tfscreen/tfmodel/generative/components/theta_rescale/test_passthrough.py @@ -7,6 +7,35 @@ def test_passthrough_identity(): assert jnp.allclose(rescale(theta), theta) -def test_passthrough_shape_preserved(): +def test_passthrough_shape_preserved_3d(): theta = jnp.ones((3, 4, 5)) * 0.5 assert rescale(theta).shape == theta.shape + + +def test_passthrough_shape_preserved_1d(): + theta = jnp.linspace(0.0, 1.0, 10) + assert rescale(theta).shape == (10,) + + +def test_passthrough_zero_preserved(): + theta = jnp.zeros(5) + assert jnp.allclose(rescale(theta), jnp.zeros(5)) + + +def test_passthrough_one_preserved(): + theta = jnp.ones(5) + assert jnp.allclose(rescale(theta), jnp.ones(5)) + + +def test_passthrough_does_not_clip_outside_unit_interval(): + """passthrough must not clip values — callers decide clamping.""" + theta = jnp.array([-0.5, 1.5]) + out = rescale(theta) + assert jnp.allclose(out, theta) + + +def test_passthrough_2d_batch(): + theta = jnp.ones((4, 6)) * 0.3 + out = rescale(theta) + assert out.shape == (4, 6) + assert jnp.allclose(out, theta) diff --git a/tests/tfscreen/tfmodel/test_congression_mask.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py similarity index 100% rename from tests/tfscreen/tfmodel/test_congression_mask.py rename to tests/tfscreen/tfmodel/generative/components/transformation/test_congression_mask.py diff --git a/tests/tfscreen/tfmodel/test_loglikelihood.py b/tests/tfscreen/tfmodel/generative/test_loglikelihood.py similarity index 100% rename from tests/tfscreen/tfmodel/test_loglikelihood.py rename to tests/tfscreen/tfmodel/generative/test_loglikelihood.py diff --git a/tests/tfscreen/tfmodel/test_model.py b/tests/tfscreen/tfmodel/generative/test_model.py similarity index 100% rename from tests/tfscreen/tfmodel/test_model.py rename to tests/tfscreen/tfmodel/generative/test_model.py diff --git a/tests/tfscreen/tfmodel/test_model_math.py b/tests/tfscreen/tfmodel/generative/test_model_math.py similarity index 100% rename from tests/tfscreen/tfmodel/test_model_math.py rename to tests/tfscreen/tfmodel/generative/test_model_math.py diff --git a/tests/tfscreen/tfmodel/test_reference_math.py b/tests/tfscreen/tfmodel/generative/test_reference_math.py similarity index 100% rename from tests/tfscreen/tfmodel/test_reference_math.py rename to tests/tfscreen/tfmodel/generative/test_reference_math.py diff --git a/tests/tfscreen/tfmodel/generative/test_registry.py b/tests/tfscreen/tfmodel/generative/test_registry.py new file mode 100644 index 00000000..012bb452 --- /dev/null +++ b/tests/tfscreen/tfmodel/generative/test_registry.py @@ -0,0 +1,167 @@ +""" +Unit tests for tfscreen.tfmodel.generative.registry. + +Verifies that model_registry has the expected top-level keys, that each +component category maps to a dict of name->module, and that every component +module exposes the standard interface attributes. +""" + +import types +import pytest + +from tfscreen.tfmodel.generative.registry import model_registry + + +# --------------------------------------------------------------------------- +# Expected structure +# --------------------------------------------------------------------------- + +COMPONENT_CATEGORIES = { + "condition_growth", + "ln_cfu0", + "dk_geno", + "activity", + "transformation", + "theta_rescale", + "theta", + "theta_growth_noise", + "theta_binding_noise", + "growth_noise", + "sample_offset", + "growth_transition", +} + +OBSERVE_KEYS = {"observe_binding", "observe_growth"} + +# Attributes that non-rescale component modules should expose +STANDARD_COMPONENT_ATTRS = {"get_priors", "define_model", "guide", "get_guesses"} + +# theta_rescale modules expose only a rescale callable +THETA_RESCALE_ATTR = "rescale" + +# observe modules expose these +OBSERVE_ATTRS = {"observe", "guide"} + +# Known minimum component counts per category +MIN_COUNTS = { + "condition_growth": 3, + "ln_cfu0": 2, + "dk_geno": 2, + "activity": 5, + "transformation": 3, + "theta_rescale": 2, + "theta": 4, + "theta_growth_noise": 3, + "theta_binding_noise": 2, + "growth_noise": 2, + "sample_offset": 2, + "growth_transition": 5, +} + + +# --------------------------------------------------------------------------- +# Top-level structure +# --------------------------------------------------------------------------- + +class TestRegistryStructure: + def test_all_component_categories_present(self): + for key in COMPONENT_CATEGORIES: + assert key in model_registry, f"Missing category: {key}" + + def test_all_observe_keys_present(self): + for key in OBSERVE_KEYS: + assert key in model_registry, f"Missing observe key: {key}" + + def test_no_unexpected_top_level_keys(self): + expected = COMPONENT_CATEGORIES | OBSERVE_KEYS + unexpected = set(model_registry.keys()) - expected + assert not unexpected, f"Unexpected registry keys: {unexpected}" + + def test_component_categories_are_dicts(self): + for key in COMPONENT_CATEGORIES: + assert isinstance(model_registry[key], dict), ( + f"model_registry['{key}'] should be a dict" + ) + + def test_observe_values_are_modules(self): + for key in OBSERVE_KEYS: + assert isinstance(model_registry[key], types.ModuleType), ( + f"model_registry['{key}'] should be a module" + ) + + +# --------------------------------------------------------------------------- +# Component counts +# --------------------------------------------------------------------------- + +class TestComponentCounts: + @pytest.mark.parametrize("category,min_count", MIN_COUNTS.items()) + def test_minimum_component_count(self, category, min_count): + count = len(model_registry[category]) + assert count >= min_count, ( + f"model_registry['{category}'] has {count} entries; expected >= {min_count}" + ) + + def test_all_component_names_are_strings(self): + for cat, components in model_registry.items(): + if not isinstance(components, dict): + continue + for name in components: + assert isinstance(name, str), ( + f"Component name in '{cat}' is not a string: {name!r}" + ) + + +# --------------------------------------------------------------------------- +# Component module interfaces +# --------------------------------------------------------------------------- + +class TestComponentInterfaces: + @pytest.mark.parametrize("name,mod", [ + (name, mod) + for cat, components in model_registry.items() + if isinstance(components, dict) and cat != "theta_rescale" + for name, mod in components.items() + ]) + def test_standard_components_have_define_model_and_get_guesses(self, name, mod): + for attr in STANDARD_COMPONENT_ATTRS: + assert hasattr(mod, attr), ( + f"Component '{name}' ({mod.__name__}) is missing '{attr}'" + ) + + @pytest.mark.parametrize("name,mod", model_registry.get("theta_rescale", {}).items()) + def test_theta_rescale_has_rescale(self, name, mod): + assert hasattr(mod, THETA_RESCALE_ATTR), ( + f"theta_rescale component '{name}' is missing '{THETA_RESCALE_ATTR}'" + ) + assert callable(getattr(mod, THETA_RESCALE_ATTR)), ( + f"theta_rescale component '{name}'.rescale is not callable" + ) + + @pytest.mark.parametrize("name,mod", [ + (name, mod) + for cat, components in model_registry.items() + if isinstance(components, dict) and cat not in ("theta_rescale",) + for name, mod in components.items() + ]) + def test_get_priors_returns_object(self, name, mod): + priors = mod.get_priors() + assert priors is not None, f"Component '{name}'.get_priors() returned None" + + @pytest.mark.parametrize("name,mod", model_registry.get("transformation", {}).items()) + def test_transformation_has_update_thetas(self, name, mod): + assert hasattr(mod, "update_thetas"), ( + f"transformation/{name} missing 'update_thetas'" + ) + assert callable(mod.update_thetas) + + @pytest.mark.parametrize("key", list(OBSERVE_KEYS)) + def test_observe_modules_have_observe_and_guide(self, key): + mod = model_registry[key] + for attr in OBSERVE_ATTRS: + assert hasattr(mod, attr), ( + f"observe module '{key}' is missing '{attr}'" + ) + assert callable(getattr(mod, attr)), ( + f"observe module '{key}'.{attr} is not callable" + ) diff --git a/tests/tfscreen/tfmodel/inference/__init__.py b/tests/tfscreen/tfmodel/inference/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/tfscreen/tfmodel/test_get_posteriors_mapping.py b/tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py similarity index 100% rename from tests/tfscreen/tfmodel/test_get_posteriors_mapping.py rename to tests/tfscreen/tfmodel/inference/test_get_posteriors_mapping.py diff --git a/tests/tfscreen/tfmodel/test_posteriors.py b/tests/tfscreen/tfmodel/inference/test_posteriors.py similarity index 100% rename from tests/tfscreen/tfmodel/test_posteriors.py rename to tests/tfscreen/tfmodel/inference/test_posteriors.py diff --git a/tests/tfscreen/tfmodel/test_run_inference.py b/tests/tfscreen/tfmodel/inference/test_run_inference.py similarity index 100% rename from tests/tfscreen/tfmodel/test_run_inference.py rename to tests/tfscreen/tfmodel/inference/test_run_inference.py diff --git a/tests/tfscreen/tfmodel/test_checkpoint_protection.py b/tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py similarity index 100% rename from tests/tfscreen/tfmodel/test_checkpoint_protection.py rename to tests/tfscreen/tfmodel/scripts/test_checkpoint_protection.py diff --git a/tests/tfscreen/tfmodel/test_configure_and_run.py b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py similarity index 100% rename from tests/tfscreen/tfmodel/test_configure_and_run.py rename to tests/tfscreen/tfmodel/scripts/test_configure_and_run.py diff --git a/tests/tfscreen/tfmodel/test_fit_model_helpers.py b/tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py similarity index 100% rename from tests/tfscreen/tfmodel/test_fit_model_helpers.py rename to tests/tfscreen/tfmodel/scripts/test_fit_model_helpers.py diff --git a/tests/tfscreen/tfmodel/scripts/test_summarize_sbc_cli.py b/tests/tfscreen/tfmodel/scripts/test_summarize_sbc_cli.py index 7d974d4c..46b16a5c 100644 --- a/tests/tfscreen/tfmodel/scripts/test_summarize_sbc_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_summarize_sbc_cli.py @@ -17,3 +17,18 @@ def test_summarize_sbc_imported_from_analysis(self): from tfscreen.tfmodel.scripts.summarize_sbc_cli import summarize_sbc from tfscreen.tfmodel.analysis.error_calibration import summarize_sbc as canonical assert summarize_sbc is canonical + + def test_main_passes_manual_arg_types(self): + """manual_arg_types must declare sbc_dir and out_prefix as str.""" + with patch("tfscreen.tfmodel.scripts.summarize_sbc_cli.generalized_main") as mock_gm: + from tfscreen.tfmodel.scripts import summarize_sbc_cli + summarize_sbc_cli.main() + + _, kwargs = mock_gm.call_args + mat = kwargs.get("manual_arg_types", {}) + assert mat.get("sbc_dir") is str + assert mat.get("out_prefix") is str + + def test_main_is_callable(self): + from tfscreen.tfmodel.scripts.summarize_sbc_cli import main + assert callable(main) diff --git a/tests/tfscreen/tfmodel/tensors/__init__.py b/tests/tfscreen/tfmodel/tensors/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/tfscreen/tfmodel/test_batch.py b/tests/tfscreen/tfmodel/tensors/test_batch.py similarity index 100% rename from tests/tfscreen/tfmodel/test_batch.py rename to tests/tfscreen/tfmodel/tensors/test_batch.py diff --git a/tests/tfscreen/tfmodel/test_batch_consistency.py b/tests/tfscreen/tfmodel/tensors/test_batch_consistency.py similarity index 100% rename from tests/tfscreen/tfmodel/test_batch_consistency.py rename to tests/tfscreen/tfmodel/tensors/test_batch_consistency.py diff --git a/tests/tfscreen/tfmodel/test_batch_fix.py b/tests/tfscreen/tfmodel/tensors/test_batch_fix.py similarity index 100% rename from tests/tfscreen/tfmodel/test_batch_fix.py rename to tests/tfscreen/tfmodel/tensors/test_batch_fix.py diff --git a/tests/tfscreen/tfmodel/test_populate_dataclass.py b/tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py similarity index 100% rename from tests/tfscreen/tfmodel/test_populate_dataclass.py rename to tests/tfscreen/tfmodel/tensors/test_populate_dataclass.py diff --git a/tests/tfscreen/tfmodel/test_tensor_manager.py b/tests/tfscreen/tfmodel/tensors/test_tensor_manager.py similarity index 100% rename from tests/tfscreen/tfmodel/test_tensor_manager.py rename to tests/tfscreen/tfmodel/tensors/test_tensor_manager.py diff --git a/tests/tfscreen/tfmodel/test_configuration_io_helpers.py b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py new file mode 100644 index 00000000..b72625fd --- /dev/null +++ b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py @@ -0,0 +1,193 @@ +""" +Unit tests for the internal helpers in tfscreen.tfmodel.configuration_io. + +_update_dataclass is tested in test_configure_and_run.py; this file covers +_extract_scalars and _gather_dict_field which have no prior test coverage. +""" + +import dataclasses +import numpy as np +import pytest + +from tfscreen.tfmodel.configuration_io import ( + _extract_scalars, + _gather_dict_field, +) + + +# --------------------------------------------------------------------------- +# Minimal dataclass helpers +# --------------------------------------------------------------------------- + +@dataclasses.dataclass +class Leaf: + x: float = 1.0 + y: float = 2.5 + + +@dataclasses.dataclass +class Nested: + sub: Leaf = dataclasses.field(default_factory=Leaf) + z: float = 3.0 + + +@dataclasses.dataclass +class WithDict: + d: dict = dataclasses.field(default_factory=lambda: {"a": 1.0, "b": 2.0}) + scalar: float = 5.0 + + +@dataclasses.dataclass +class WithArray: + arr: object = dataclasses.field(default_factory=lambda: np.array([1.0, 2.0, 3.0])) + scalar: float = 7.0 + + +@dataclasses.dataclass +class WithString: + label: str = "hello" + value: float = 9.0 + + +# --------------------------------------------------------------------------- +# _extract_scalars +# --------------------------------------------------------------------------- + +class TestExtractScalars: + def test_flat_scalar_fields_extracted(self): + out = _extract_scalars(Leaf()) + assert out["x"] == pytest.approx(1.0) + assert out["y"] == pytest.approx(2.5) + + def test_flat_values_are_float(self): + out = _extract_scalars(Leaf()) + for v in out.values(): + assert isinstance(v, (int, float)) + + def test_nested_dataclass_prefixed(self): + out = _extract_scalars(Nested()) + assert "sub.x" in out + assert "sub.y" in out + assert out["sub.x"] == pytest.approx(1.0) + assert out["z"] == pytest.approx(3.0) + + def test_nested_flat_key_absent(self): + # The nested object should NOT appear as a raw key + out = _extract_scalars(Nested()) + assert "sub" not in out + + def test_dict_field_expanded_with_dot_key(self): + out = _extract_scalars(WithDict()) + assert "d.a" in out + assert "d.b" in out + assert out["d.a"] == pytest.approx(1.0) + assert out["d.b"] == pytest.approx(2.0) + + def test_dict_scalar_sibling_also_extracted(self): + out = _extract_scalars(WithDict()) + assert "scalar" in out + assert out["scalar"] == pytest.approx(5.0) + + def test_array_field_skipped(self): + """1-D arrays should not appear in output (non-scalar shape).""" + out = _extract_scalars(WithArray()) + assert "arr" not in out + + def test_scalar_alongside_array_extracted(self): + out = _extract_scalars(WithArray()) + assert "scalar" in out + assert out["scalar"] == pytest.approx(7.0) + + def test_string_field_stored_as_str(self): + out = _extract_scalars(WithString()) + assert "label" in out + assert isinstance(out["label"], str) + assert out["label"] == "hello" + + def test_numeric_field_alongside_string(self): + out = _extract_scalars(WithString()) + assert out["value"] == pytest.approx(9.0) + + def test_prefix_prepended(self): + out = _extract_scalars(Leaf(), prefix="outer.") + assert "outer.x" in out + assert "outer.y" in out + + def test_empty_object_returns_empty_dict(self): + @dataclasses.dataclass + class Empty: + pass + out = _extract_scalars(Empty()) + assert isinstance(out, dict) + + def test_dict_array_value_skipped(self): + """Arrays stored as dict values should be skipped.""" + @dataclasses.dataclass + class WithDictArr: + d: dict = dataclasses.field( + default_factory=lambda: {"arr": np.array([1.0, 2.0]), "val": 3.0} + ) + out = _extract_scalars(WithDictArr()) + assert "d.arr" not in out + assert "d.val" in out + + +# --------------------------------------------------------------------------- +# _gather_dict_field +# --------------------------------------------------------------------------- + +class TestGatherDictField: + def test_basic_collection(self): + flat = {"a.x": 1.0, "a.y": 2.0} + result = _gather_dict_field("a", flat) + assert result == {"x": 1.0, "y": 2.0} + + def test_ignores_unrelated_keys(self): + flat = {"a.x": 1.0, "b.x": 9.0, "c": 99.0} + result = _gather_dict_field("a", flat) + assert "x" in result + assert len(result) == 1 + + def test_skips_deeper_nesting(self): + """Keys with two-level suffixes (a.x.sub) must be ignored.""" + flat = {"a.x": 1.0, "a.y.deep": 5.0} + result = _gather_dict_field("a", flat) + assert "x" in result + assert "y" not in result + assert "y.deep" not in result + + def test_returns_empty_when_no_match(self): + flat = {"b.x": 1.0, "c.y": 2.0} + result = _gather_dict_field("a", flat) + assert result == {} + + def test_coerces_to_float(self): + flat = {"a.x": "3.14"} + result = _gather_dict_field("a", flat) + assert result["x"] == pytest.approx(3.14) + assert isinstance(result["x"], float) + + def test_non_numeric_string_preserved(self): + flat = {"a.label": "hello"} + result = _gather_dict_field("a", flat) + assert result["label"] == "hello" + + def test_integer_coerced_to_float(self): + flat = {"a.n": 42} + result = _gather_dict_field("a", flat) + assert result["n"] == pytest.approx(42.0) + + def test_prefix_must_match_exactly(self): + """'ab.x' must not be collected when full_key is 'a'.""" + flat = {"ab.x": 99.0, "a.x": 1.0} + result = _gather_dict_field("a", flat) + assert "x" in result + assert result["x"] == pytest.approx(1.0) + assert len(result) == 1 + + def test_multiple_suffixes_collected(self): + flat = {f"p.k{i}": float(i) for i in range(5)} + result = _gather_dict_field("p", flat) + assert len(result) == 5 + for i in range(5): + assert result[f"k{i}"] == pytest.approx(float(i)) diff --git a/tests/tfscreen/tfmodel/test_data_class.py b/tests/tfscreen/tfmodel/test_data_class.py new file mode 100644 index 00000000..c8b0de9e --- /dev/null +++ b/tests/tfscreen/tfmodel/test_data_class.py @@ -0,0 +1,276 @@ +""" +Unit tests for tfscreen.tfmodel.data_class. + +The JIT-stability behaviour is covered in test_data_class_jit.py. This +file focuses on field defaults, the replace() contract, and dataclass +construction for all four dataclasses in the module. +""" + +import pytest +import jax.numpy as jnp +import numpy as np +from unittest.mock import MagicMock + +from tfscreen.tfmodel.data_class import ( + GrowthData, + BindingData, + PreSplitData, + DataClass, + GrowthPriors, + BindingPriors, + PriorsClass, +) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _make_growth_data(num_genotype=4, **overrides): + """Return a minimal valid GrowthData for testing.""" + G = num_genotype + shape = (1, 1, 1, 1, 1, 1, G) + kwargs = dict( + batch_size=G, + batch_idx=jnp.arange(G, dtype=jnp.int32), + scale_vector=jnp.ones(G), + geno_theta_idx=jnp.arange(G, dtype=jnp.int32), + ln_cfu=jnp.zeros(shape), + ln_cfu_std=jnp.ones(shape), + t_pre=jnp.zeros(shape), + t_sel=jnp.zeros(shape), + good_mask=jnp.ones(shape, dtype=bool), + congression_mask=jnp.ones(G, dtype=bool), + num_replicate=1, + num_time=1, + num_condition_pre=1, + num_condition_sel=1, + num_titrant_name=1, + num_titrant_conc=1, + num_genotype=G, + num_condition_rep=1, + map_condition_pre=jnp.zeros(shape, dtype=jnp.int32), + map_condition_sel=jnp.zeros(shape, dtype=jnp.int32), + titrant_conc=jnp.array([0.0]), + log_titrant_conc=jnp.array([0.0]), + wt_indexes=jnp.array([0]), + scatter_theta=0, + ln_cfu0_spiked_mask=jnp.zeros(G, dtype=bool), + ln_cfu0_wt_mask=jnp.zeros(G, dtype=bool), + ) + kwargs.update(overrides) + return GrowthData(**kwargs) + + +def _make_binding_data(num_genotype=4, **overrides): + """Return a minimal valid BindingData for testing.""" + G = num_genotype + kwargs = dict( + batch_size=G, + batch_idx=jnp.arange(G, dtype=jnp.int32), + scale_vector=jnp.ones(G), + geno_theta_idx=jnp.arange(G, dtype=jnp.int32), + theta_obs=jnp.zeros((1, 1, G)), + theta_std=jnp.ones((1, 1, G)), + good_mask=jnp.ones((1, 1, G), dtype=bool), + num_titrant_name=1, + num_titrant_conc=1, + num_genotype=G, + titrant_conc=jnp.array([0.0]), + log_titrant_conc=jnp.array([0.0]), + scatter_theta=0, + ) + kwargs.update(overrides) + return BindingData(**kwargs) + + +def _make_data_class(num_genotype=4): + """Return a minimal DataClass with both growth and binding.""" + G = num_genotype + return DataClass( + num_genotype=G, + batch_idx=jnp.arange(G, dtype=jnp.int32), + batch_size=G, + not_binding_idx=jnp.arange(G, dtype=jnp.int32), + not_binding_batch_size=G, + num_binding=0, + growth=_make_growth_data(G), + binding=_make_binding_data(G), + ) + + +# --------------------------------------------------------------------------- +# GrowthData +# --------------------------------------------------------------------------- + +class TestGrowthData: + def test_construction(self): + gd = _make_growth_data() + assert gd.num_genotype == 4 + + def test_required_fields_accessible(self): + gd = _make_growth_data() + assert gd.ln_cfu.shape[-1] == 4 + assert gd.batch_size == 4 + + def test_default_ln_cfu0_library_masks_is_none(self): + gd = _make_growth_data() + assert gd.ln_cfu0_library_masks is None + + def test_default_num_ln_cfu0_library_classes(self): + gd = _make_growth_data() + assert gd.num_ln_cfu0_library_classes == 1 + + def test_default_growth_shares_replicates(self): + gd = _make_growth_data() + assert gd.growth_shares_replicates is False + + def test_default_mutation_fields(self): + gd = _make_growth_data() + assert gd.num_mutation == 0 + assert gd.num_pair == 0 + assert gd.mut_geno_matrix is None + + def test_default_struct_fields(self): + gd = _make_growth_data() + assert gd.num_struct == 0 + assert gd.struct_names is None + assert gd.struct_features is None + + def test_replace_updates_batch_size(self): + gd = _make_growth_data(num_genotype=4) + gd2 = gd.replace(batch_size=2) + assert gd2.batch_size == 2 + assert gd.batch_size == 4 # original unchanged + + def test_replace_updates_ln_cfu(self): + gd = _make_growth_data(num_genotype=4) + new_ln_cfu = jnp.ones_like(gd.ln_cfu) * 99.0 + gd2 = gd.replace(ln_cfu=new_ln_cfu) + assert float(gd2.ln_cfu.max()) == pytest.approx(99.0) + assert float(gd.ln_cfu.max()) == pytest.approx(0.0) + + +# --------------------------------------------------------------------------- +# BindingData +# --------------------------------------------------------------------------- + +class TestBindingData: + def test_construction(self): + bd = _make_binding_data() + assert bd.num_genotype == 4 + + def test_theta_obs_shape(self): + bd = _make_binding_data() + assert bd.theta_obs.shape == (1, 1, 4) + + def test_default_mutation_fields(self): + bd = _make_binding_data() + assert bd.num_mutation == 0 + assert bd.mut_geno_matrix is None + + def test_default_struct_fields(self): + bd = _make_binding_data() + assert bd.num_struct == 0 + assert bd.struct_names is None + + def test_replace_updates_batch_size(self): + bd = _make_binding_data() + bd2 = bd.replace(batch_size=2) + assert bd2.batch_size == 2 + assert bd.batch_size == 4 + + +# --------------------------------------------------------------------------- +# PreSplitData +# --------------------------------------------------------------------------- + +class TestPreSplitData: + def test_construction(self): + G = 3 + ps = PreSplitData( + ln_cfu_t0=jnp.zeros((1, 1, G)), + ln_cfu_t0_std=jnp.ones((1, 1, G)), + good_mask=jnp.ones((1, 1, G), dtype=bool), + num_replicate=1, + num_condition_pre=1, + num_genotype=G, + ) + assert ps.num_genotype == G + assert ps.ln_cfu_t0.shape == (1, 1, G) + + def test_replace_works(self): + G = 3 + ps = PreSplitData( + ln_cfu_t0=jnp.zeros((1, 1, G)), + ln_cfu_t0_std=jnp.ones((1, 1, G)), + good_mask=jnp.ones((1, 1, G), dtype=bool), + num_replicate=1, + num_condition_pre=1, + num_genotype=G, + ) + ps2 = ps.replace(num_genotype=10) + assert ps2.num_genotype == 10 + assert ps.num_genotype == G + + +# --------------------------------------------------------------------------- +# DataClass +# --------------------------------------------------------------------------- + +class TestDataClass: + def test_construction_with_growth_and_binding(self): + dc = _make_data_class() + assert dc.num_genotype == 4 + assert dc.growth is not None + assert dc.binding is not None + + def test_default_growth_is_none(self): + # growth defaults to None + dc = DataClass( + num_genotype=4, + batch_idx=jnp.arange(4, dtype=jnp.int32), + batch_size=4, + not_binding_idx=jnp.arange(4, dtype=jnp.int32), + not_binding_batch_size=4, + num_binding=4, + ) + assert dc.growth is None + assert dc.binding is None + assert dc.presplit is None + + def test_replace_growth(self): + dc = _make_data_class() + new_gd = _make_growth_data(num_genotype=8) + dc2 = dc.replace(growth=new_gd) + assert dc2.growth.num_genotype == 8 + assert dc.growth.num_genotype == 4 + + def test_batch_idx_shape(self): + dc = _make_data_class(num_genotype=6) + assert dc.batch_idx.shape == (6,) + + +# --------------------------------------------------------------------------- +# PriorsClass +# --------------------------------------------------------------------------- + +class TestPriorsClass: + def test_construction(self): + mock_any = MagicMock() + gp = GrowthPriors( + condition_growth=mock_any, + growth_transition=mock_any, + ln_cfu0=mock_any, + dk_geno=mock_any, + activity=mock_any, + transformation=mock_any, + theta_growth_noise=mock_any, + growth_noise=mock_any, + sample_offset=mock_any, + ) + bp = BindingPriors(theta_binding_noise=mock_any) + pc = PriorsClass(theta=bp, growth=gp, binding=bp) + assert pc.growth is gp + assert pc.binding is bp + assert pc.theta is bp diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index fe2a541f..5e75ad04 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -17,6 +17,7 @@ _setup_batching, get_batch ) +from tfscreen.tfmodel.generative.components.growth.linear import _parse_condition_label from tfscreen.tfmodel.tensors.tensor_manager import TensorManager from tfscreen.tfmodel.analysis.extraction import ( _extract_param_est, @@ -32,8 +33,9 @@ @pytest.fixture def dummy_growth_df(): return pd.DataFrame({ - "replicate": [1], - "t_sel": [0.0], + "replicate": [1], + "library": ["lib"], + "t_sel": [0.0], "t_pre": [0.0], "genotype": ["wt"], "condition_pre": ["A"], @@ -96,9 +98,12 @@ def test_setup_batching_logic(): @pytest.fixture def base_growth_df(): cols = ["ln_cfu", "ln_cfu_std", "replicate", "t_pre", "t_sel", - "genotype", "titrant_name", "condition_pre", "condition_sel", + "genotype", "titrant_name", "condition_pre", "condition_sel", "titrant_conc"] - return pd.DataFrame({c: [1.0] for c in cols if c != "genotype"} | {"genotype": ["wt"]}) + return pd.DataFrame( + {c: [1.0] for c in cols if c != "genotype"} + | {"genotype": ["wt"], "library": ["lib"]} + ) def test_read_growth_df(mocker, base_growth_df): mocker.patch("tfscreen.util.io.read_dataframe", return_value=base_growth_df) @@ -878,23 +883,29 @@ def test_shares_replicates_false_includes_replicate_but_still_sorts(self): assert result[0] == "pheS-4CP" assert result[1] == "pheS+4CP" - def test_linear_get_priors_signature_has_condition_labels(self): + def test_linear_get_priors_signature_has_is_selection(self): """ - The orchestrator detects condition_labels support via inspect.signature. - Verify that the linear component's get_priors actually has this param. + The orchestrator detects is_selection support via inspect.signature. + Verify that the linear component's get_priors has this parameter + (preferred path) and still retains condition_labels for legacy compat. """ import inspect from tfscreen.tfmodel.generative.components.growth.linear import get_priors sig = inspect.signature(get_priors) + assert "is_selection" in sig.parameters, ( + "linear.get_priors must have an 'is_selection' parameter so " + "ModelOrchestrator can pass inferred selection flags directly" + ) assert "condition_labels" in sig.parameters, ( - "linear.get_priors must have a 'condition_labels' parameter so " - "ModelOrchestrator can pass condition names for per-condition m priors" + "linear.get_priors must retain 'condition_labels' for backward compat" ) - def test_setup_model_extracts_labels_and_calls_get_priors(self, mocker): + def test_setup_model_extracts_is_selection_and_calls_get_priors(self, mocker): """ - _setup_model must call get_priors(condition_labels=...) for a - condition_growth component that accepts that parameter. + _initialize_classes must call get_priors(is_selection=...) using + flags inferred from the data structure, not from parsing condition + name strings. kanR+kan only in condition_sel → True; kanR-kan in + condition_pre → False. """ import inspect import tfscreen.tfmodel.model_orchestrator as mo @@ -902,17 +913,29 @@ def test_setup_model_extracts_labels_and_calls_get_priors(self, mocker): captured = {} - def capturing_get_priors(condition_labels=None): + def capturing_get_priors(condition_labels=None, is_selection=None): + captured["is_selection"] = is_selection captured["condition_labels"] = condition_labels - return real_linear.get_priors(condition_labels=condition_labels) + return real_linear.get_priors(is_selection=is_selection, + condition_labels=condition_labels) + # cond_rep_df as produced after Phase 1 (library column present) cond_rep_df = pd.DataFrame({ + "library": ["lib", "lib"], "condition_rep": ["kanR+kan", "kanR-kan"], "map_condition_rep": [0, 1], }) mock_growth_tm = MagicMock() mock_growth_tm.map_groups = {"condition_rep": cond_rep_df} + # Minimal growth_df so _infer_is_selection can derive flags: + # kanR-kan in condition_pre → False; kanR+kan only in condition_sel → True + growth_df = pd.DataFrame({ + "library": ["lib", "lib"], + "condition_pre": ["kanR-kan", "kanR-kan"], + "condition_sel": ["kanR+kan", "kanR-kan"], + }) + # Stub ALL registry entries except we intercept condition_growth.get_priors all_stubs = {} for comp_key, comp_val in mo.model_registry.items(): @@ -941,6 +964,7 @@ def capturing_get_priors(condition_labels=None): orchestrator = MagicMock(spec=ModelOrchestrator) orchestrator.growth_tm = mock_growth_tm + orchestrator.growth_df = growth_df orchestrator._data = MagicMock() orchestrator._binding_only = False orchestrator._batch_size = None @@ -961,9 +985,574 @@ def capturing_get_priors(condition_labels=None): try: mo.ModelOrchestrator._initialize_classes(orchestrator) except Exception: - pass # only condition_labels matters + pass # only is_selection matters + + assert "is_selection" in captured, ( + "_initialize_classes did not pass is_selection to get_priors" + ) + # kanR+kan at index 0 → selective (True); kanR-kan at index 1 → not selective (False) + assert captured["is_selection"] == [True, False], ( + f"Expected [True, False], got {captured['is_selection']}" + ) + assert captured["condition_labels"] is None + + +# --------------------------------------------------------------------------- +# Sentinel tests: genotype ordering must survive the data pipeline +# --------------------------------------------------------------------------- + +class TestGenotypeOrderSentinel: + """ + Sentinel tests verifying that genotype ordering is maintained as GENETIC + order (wt first, then by residue number) through the full data pipeline. + + Uses a deliberately pathological genotype set where: + insertion order: A10G, wt, A2G + alphabetical order: A10G, A2G, wt + genetic order: wt, A2G, A10G <- required + + Any operation that loses the CategoricalDtype and re-creates it via + pd.Categorical() would produce alphabetical order instead, giving wrong + genotype_idx assignments and silently scrambling parameters. + """ + + @staticmethod + def _build_raw_df(libraries=("lib",), condition_blocks=(("no-kan", "kan"),)): + """Minimal growth_df with pathological genotype insertion order.""" + rows = [] + for lib in libraries: + for geno in ["A10G", "wt", "A2G"]: # non-alpha, non-genetic order + for cp, cs in condition_blocks: + rows.append({ + "genotype": geno, + "library": lib, + "replicate": 1, + "titrant_name": "iptg", + "titrant_conc": 0.0, + "condition_pre": cp, + "condition_sel": cs, + "t_pre": 30.0, + "t_sel": 100.0, + "ln_cfu": 10.0, + "ln_cfu_std": 0.1, + }) + return pd.DataFrame(rows) + + def test_read_growth_df_produces_genetic_categorical_order(self): + """After _read_growth_df, genotype categories must be in genetic order.""" + result = _read_growth_df(self._build_raw_df()) + cats = list(result["genotype"].cat.categories) + assert cats == ["wt", "A2G", "A10G"], ( + f"Expected ['wt','A2G','A10G'] (genetic), got {cats}. " + "Alphabetical would be ['A10G','A2G','wt'] — categorical dtype " + "was probably lost and re-created by pd.Categorical()." + ) + + def test_read_growth_df_genotype_stays_categorical(self): + """Categorical dtype on genotype must survive all ops in _read_growth_df.""" + result = _read_growth_df(self._build_raw_df()) + assert isinstance(result["genotype"].dtype, pd.CategoricalDtype), ( + "genotype lost CategoricalDtype during _read_growth_df. " + "Any subsequent pd.Categorical() call produces alphabetical order." + ) + + def test_read_growth_df_row_order_unchanged(self): + """Row insertion order must not change inside _read_growth_df.""" + df = self._build_raw_df() + expected = list(df["genotype"]) + result = _read_growth_df(df) + assert list(result["genotype"]) == expected + + def test_build_growth_tm_tensor_genotype_axis_genetic_order(self): + """ + After _build_growth_tm the genotype tensor dimension must be in + genetic order, not alphabetical or insertion order. + """ + df = self._build_raw_df() + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + geno_dim = tm.tensor_dim_names.index("genotype") + assert list(tm.tensor_dim_labels[geno_dim]) == ["wt", "A2G", "A10G"], ( + f"Tensor genotype axis: {list(tm.tensor_dim_labels[geno_dim])}" + ) + + def test_genotype_idx_consistent_with_tensor_labels(self): + """ + genotype_idx in the DataFrame must match each genotype's position + in the tensor genotype dimension. Misalignment causes parameters + for genotype X to be silently applied to genotype Y's data. + """ + df = self._build_raw_df() + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + geno_dim = tm.tensor_dim_names.index("genotype") + label_to_pos = {str(g): i for i, g in enumerate(tm.tensor_dim_labels[geno_dim])} + + for _, row in tm.df.iterrows(): + geno = str(row["genotype"]) + idx = int(row["genotype_idx"]) + expected = label_to_pos[geno] + assert idx == expected, ( + f"Genotype '{geno}': genotype_idx={idx} but " + f"tensor label position={expected}." + ) + + def test_condition_sel_reduced_does_not_reorder_rows(self): + """ + The condition_sel_reduced groupby in _read_growth_df adds a column + but must not change row order (which would shift genotype_idx assignments). + """ + df = self._build_raw_df( + condition_blocks=[("no-kan", "kan"), ("no-kan", "no-kan")] + ) + expected_genos = list(df["genotype"]) + result = _read_growth_df(df) + assert list(result["genotype"]) == expected_genos, ( + "Row order changed during condition_sel_reduced computation." + ) + + def test_genotype_categorical_survives_condition_sel_reduced(self): + """ + CategoricalDtype must survive the condition_sel_reduced groupby/map. + If dropped and re-created, genetic order is replaced by alphabetical. + """ + df = self._build_raw_df( + condition_blocks=[("no-kan", "kan"), ("no-kan", "no-kan")] + ) + result = _read_growth_df(df) + assert isinstance(result["genotype"].dtype, pd.CategoricalDtype), ( + "genotype lost CategoricalDtype after condition_sel_reduced was computed." + ) + + +# --------------------------------------------------------------------------- +# Phase 1 tests: library as a proper grouping key +# --------------------------------------------------------------------------- + +class TestLibraryGroupingPhase1: + """ + Tests for Phase 1 of the library-column refactor. Library must be added + to the condition_sel_reduced groupby and to the ln_cfu0 map tensor. + + Tests marked xfail(strict=True) document the desired new behavior and + will fail until the refactor is implemented. Remove the marker after + each test starts passing. + + The regression guard (single-library unchanged) should pass now and + continue to pass after the refactor. + """ + + @staticmethod + def _two_library_df(shared_condition_sel="kan"): + """Two libraries with identical condition names but distinct ln_cfu.""" + rows = [] + for lib, base in [("libA", 10.0), ("libB", 20.0)]: + for geno in ["wt", "A2G"]: + rows.append({ + "genotype": geno, + "library": lib, + "replicate": 1, + "titrant_name": "iptg", + "titrant_conc": 0.0, + "condition_pre": "no-kan", + "condition_sel": shared_condition_sel, + "t_pre": 30.0, + "t_sel": 100.0, + "ln_cfu": base, + "ln_cfu_std": 0.1, + }) + return pd.DataFrame(rows) + + def test_single_library_regression(self): + """ + Single-library behavior must be unchanged after Phase 1. + Genotype order must still be genetic. + """ + df = TestGenotypeOrderSentinel._build_raw_df() + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + geno_dim = tm.tensor_dim_names.index("genotype") + assert list(tm.tensor_dim_labels[geno_dim]) == ["wt", "A2G", "A10G"] + + def test_two_libraries_genotype_order_preserved(self): + """ + Adding a second library must not change genotype ordering — both + libraries share the same genotype set and must be in genetic order. + """ + df = self._two_library_df() + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + geno_dim = tm.tensor_dim_names.index("genotype") + assert list(tm.tensor_dim_labels[geno_dim]) == ["wt", "A2G"], ( + f"Unexpected genotype order: {list(tm.tensor_dim_labels[geno_dim])}" + ) + + def test_two_libraries_have_distinct_ln_cfu0_slots(self): + """ + Same genotype in two different libraries must have different ln_cfu0 + parameter slots. After Phase 1, 'library' is added to the ln_cfu0 + map tensor so (libA, rep1, no-kan, wt) and (libB, rep1, no-kan, wt) + receive different indices. + """ + df = self._two_library_df() + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + libA_wt = int( + tm.df[(tm.df["genotype"] == "wt") & (tm.df["library"] == "libA")] + ["map_ln_cfu0"].iloc[0] + ) + libB_wt = int( + tm.df[(tm.df["genotype"] == "wt") & (tm.df["library"] == "libB")] + ["map_ln_cfu0"].iloc[0] + ) + assert libA_wt != libB_wt, ( + "libA/wt and libB/wt share ln_cfu0 slot — library is not yet " + "included in the ln_cfu0 map tensor." + ) + + def test_condition_sel_reduced_is_per_library(self): + """ + condition_sel_reduced numbering must be computed within each + (library, condition_pre) group so that each library's first unique + condition_sel gets index 0. + + Currently, the mapper is built globally per condition_pre, so a + condition that only appears in libB gets a non-zero index because + libA's conditions are numbered first. After Phase 1, each + (library, condition_pre) group numbers independently from 0. + """ + rows = [] + # libA: two distinct condition_sel values under no-kan + for cs in ["sel-A", "ctrl"]: + rows.append({ + "genotype": "wt", "library": "libA", "replicate": 1, + "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": "no-kan", "condition_sel": cs, + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 10.0, "ln_cfu_std": 0.1, + }) + # libB: one condition_sel unique to it (not in libA) + rows.append({ + "genotype": "wt", "library": "libB", "replicate": 1, + "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": "no-kan", "condition_sel": "sel-B", + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 10.0, "ln_cfu_std": 0.1, + }) + df = pd.DataFrame(rows) + growth_df = _read_growth_df(df) + + # Before Phase 1: global mapper gives "sel-B" index 2 (after sel-A=0, ctrl=1). + # After Phase 1: per-library mapper gives "sel-B" index 0 within its own group. + libB_sel_b_reduced = int( + growth_df[ + (growth_df["library"] == "libB") & (growth_df["condition_sel"] == "sel-B") + ]["condition_sel_reduced"].iloc[0] + ) + assert libB_sel_b_reduced == 0, ( + f"libB/'sel-B' got condition_sel_reduced={libB_sel_b_reduced}, expected 0. " + "The global mapper assigns higher indices to conditions that appear " + "after other libraries' conditions — library is not yet in the groupby." + ) + + +# --------------------------------------------------------------------------- +# Phase 2 tests: is_selection inference from data structure +# --------------------------------------------------------------------------- + +class TestIsSelectionInference: + """ + Tests for Phase 2: inferring which conditions are selective based on + data structure. The rule: + condition only in condition_sel (never in condition_pre) → selective + condition that appears in condition_pre → not selective + + All tests are xfail until _infer_is_selection is implemented in + model_orchestrator.py. The ImportError that results from the missing + function counts as the expected failure under xfail(strict=True). + Remove the marker once each test passes. + """ + + @staticmethod + def _build_df(blocks, library="lib"): + """Build a minimal growth_df from (condition_pre, condition_sel) pairs.""" + rows = [] + for cp, cs in blocks: + rows.append({ + "genotype": "wt", + "library": library, + "replicate": 1, + "titrant_name": "iptg", + "titrant_conc": 0.0, + "condition_pre": cp, + "condition_sel": cs, + "t_pre": 30.0, + "t_sel": 100.0, + "ln_cfu": 10.0, + "ln_cfu_std": 0.1, + }) + return pd.DataFrame(rows) + + def test_standard_case(self): + """ + Condition only in condition_pre → False. + Condition only in condition_sel → True. + """ + from tfscreen.tfmodel.model_orchestrator import _infer_is_selection + df = self._build_df([ + ("no-kan", "kan"), # no-kan in pre → False; kan only in sel → True + ("no-kan", "no-kan"), # control arm: no-kan appears in pre → still False + ]) + result = _infer_is_selection(df) + assert result["no-kan"] is False + assert result["kan"] is True + + def test_control_arm_same_condition_in_pre_and_sel(self): + """condition_pre == condition_sel → that condition is non-selective.""" + from tfscreen.tfmodel.model_orchestrator import _infer_is_selection + df = self._build_df([ + ("LB", "sel"), + ("LB", "LB"), # control arm + ]) + result = _infer_is_selection(df) + assert result["LB"] is False + assert result["sel"] is True + + def test_multiple_null_conditions_both_false(self): + """Two distinct non-selective conditions must independently get False.""" + from tfscreen.tfmodel.model_orchestrator import _infer_is_selection + df = self._build_df([ + ("LB", "kan"), + ("M9", "kan"), # second distinct null medium + ]) + result = _infer_is_selection(df) + assert result["LB"] is False + assert result["M9"] is False + assert result["kan"] is True + + def test_per_library_same_name_different_role(self): + """ + Same condition name appearing in condition_pre for libA but only in + condition_sel for libB gets different is_selection per library. + """ + from tfscreen.tfmodel.model_orchestrator import _infer_is_selection + rows = [] + # libA: "shared" is used as pre-growth (non-selective) + rows.append({"genotype": "wt", "library": "libA", + "condition_pre": "shared", "condition_sel": "sel", + "replicate": 1, "titrant_name": "iptg", "titrant_conc": 0.0, + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 10.0, "ln_cfu_std": 0.1}) + # libB: "shared" only appears in condition_sel (selective) + rows.append({"genotype": "wt", "library": "libB", + "condition_pre": "LB", "condition_sel": "shared", + "replicate": 1, "titrant_name": "iptg", "titrant_conc": 0.0, + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 10.0, "ln_cfu_std": 0.1}) + df = pd.DataFrame(rows) + result = _infer_is_selection(df, per_library=True) + assert result[("libA", "shared")] is False + assert result[("libB", "shared")] is True + + def test_inferred_agrees_with_legacy_parse_for_plus_minus_names(self): + """ + For condition names with standard +/- notation, the new inference rule + must agree with the legacy _parse_condition_label() parser. + """ + from tfscreen.tfmodel.model_orchestrator import _infer_is_selection + df = self._build_df([ + ("kanR-kan", "kanR+kan"), # - in pre (control), + in sel (selection) + ("kanR-kan", "kanR-kan"), # control arm + ]) + result = _infer_is_selection(df) + for cond, is_sel in result.items(): + legacy = _parse_condition_label(cond) + assert is_sel is legacy, ( + f"Inference disagreed with legacy parser for '{cond}': " + f"inferred={is_sel}, legacy={legacy}" + ) - assert "condition_labels" in captured, ( - "_setup_model did not pass condition_labels to get_priors" + +# --------------------------------------------------------------------------- +# Combined library/condition_pre key tests +# --------------------------------------------------------------------------- + +class TestCombinedConditionPreKey: + """ + Tests for the internal `_condition_pre_key` = library + "/" + condition_pre + column used inside _build_growth_tm and _build_presplit_tm. + + The combined key ensures that two libraries sharing the same condition_pre + name get DISTINCT tensor slots, preventing silent cross-library pooling. + The '/' separator is never split on downstream — the key is opaque. + """ + + @staticmethod + def _growth_df(libraries_conditions): + """ + Build a minimal growth_df. + + Parameters + ---------- + libraries_conditions : list of (library, condition_pre, condition_sel) + """ + rows = [] + for lib, cp, cs in libraries_conditions: + rows.append({ + "library": lib, "replicate": 1, + "genotype": "wt", "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": cp, "condition_sel": cs, + "t_pre": 30.0, "t_sel": 100.0, + "ln_cfu": 10.0, "ln_cfu_std": 0.1, + }) + return pd.DataFrame(rows) + + def test_single_library_combined_key_formed(self): + """_condition_pre_key = library/condition_pre is added to growth_tm.df.""" + df = self._growth_df([("kanR", "-kan", "+kan")]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + assert "_condition_pre_key" in tm.df.columns + assert tm.df["_condition_pre_key"].iloc[0] == "kanR/-kan" + + def test_single_library_num_condition_pre_unchanged(self): + """Single library with one condition_pre → num_condition_pre == 1.""" + df = self._growth_df([("kanR", "-kan", "+kan")]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + cp_dim = tm.tensor_dim_names.index("condition_pre") + assert len(tm.tensor_dim_labels[cp_dim]) == 1 + + def test_two_libraries_shared_condition_pre_distinct_tensor_slots(self): + """ + Two libraries both using condition_pre='-kan' must occupy DIFFERENT + condition_pre tensor slots. Before the combined key this collapsed + them into one slot, silently pooling unrelated data. + """ + df = self._growth_df([ + ("libA", "-kan", "+kan"), + ("libB", "-kan", "+kan"), # same condition_pre, different library + ]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + cp_dim = tm.tensor_dim_names.index("condition_pre") + assert len(tm.tensor_dim_labels[cp_dim]) == 2, ( + "Two libraries sharing condition_pre='-kan' should produce " + "two distinct condition_pre tensor slots ('libA/-kan' and 'libB/-kan'), " + "not one collapsed slot." + ) + + def test_two_libraries_shared_condition_pre_labels_contain_library(self): + """Tensor condition_pre labels carry the library prefix.""" + df = self._growth_df([ + ("libA", "-kan", "+kan"), + ("libB", "-kan", "+kan"), + ]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + cp_dim = tm.tensor_dim_names.index("condition_pre") + labels = set(tm.tensor_dim_labels[cp_dim]) + assert "libA/-kan" in labels + assert "libB/-kan" in labels + + def test_two_libraries_shared_condition_pre_data_not_pooled(self): + """ + Data from two libraries sharing condition_pre must land in separate + tensor positions. The condition_pre_idx in tm.df must differ between + the two libraries. + """ + df = pd.DataFrame([ + {"library": "libA", "replicate": 1, "genotype": "wt", + "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": "-kan", "condition_sel": "+kan", + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 10.0, "ln_cfu_std": 0.1}, + {"library": "libB", "replicate": 1, "genotype": "wt", + "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": "-kan", "condition_sel": "+kan", + "t_pre": 30.0, "t_sel": 100.0, "ln_cfu": 20.0, "ln_cfu_std": 0.1}, + ]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + idx_a = int(tm.df[tm.df["library"] == "libA"]["condition_pre_idx"].iloc[0]) + idx_b = int(tm.df[tm.df["library"] == "libB"]["condition_pre_idx"].iloc[0]) + assert idx_a != idx_b, ( + f"libA and libB both got condition_pre_idx={idx_a} — " + "their data would overwrite each other in the tensor." ) - assert captured["condition_labels"] == ["kanR+kan", "kanR-kan"] \ No newline at end of file + + def test_distinct_condition_pre_names_not_affected(self): + """ + Libraries with distinct condition_pre names keep num_condition_pre + equal to the number of unique (library, condition_pre) pairs — + same behaviour as before. + """ + df = self._growth_df([ + ("kanR", "-kan", "+kan"), + ("pheS", "-4CP", "+4CP"), # different names — no collision risk + ]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + cp_dim = tm.tensor_dim_names.index("condition_pre") + assert len(tm.tensor_dim_labels[cp_dim]) == 2 + + def test_slash_in_condition_name_is_safe(self): + """ + A condition_pre name that itself contains '/' produces a valid combined + key without any parsing ambiguity — the key is treated as opaque. + """ + df = self._growth_df([("lib", "no/sel", "+sel")]) + growth_df = _read_growth_df(df) + tm = _build_growth_tm(growth_df) + + cp_dim = tm.tensor_dim_names.index("condition_pre") + labels = list(tm.tensor_dim_labels[cp_dim]) + assert labels == ["lib/no/sel"] + + def test_presplit_combined_key_matches_growth_tm_categories(self): + """ + _build_presplit_tm must use the same combined condition_pre categories + as growth_tm so that the presplit condition_pre_idx values are + consistent with those used in the growth tensor. + """ + rows_growth = [] + rows_presplit = [] + for lib, cp, cs in [("libA", "-kan", "+kan"), ("libB", "-kan", "+kan")]: + for geno in ["wt", "A2G"]: + rows_growth.append({ + "library": lib, "replicate": 1, "genotype": geno, + "titrant_name": "iptg", "titrant_conc": 0.0, + "condition_pre": cp, "condition_sel": cs, + "t_pre": 30.0, "t_sel": 100.0, + "ln_cfu": 10.0, "ln_cfu_std": 0.1, + }) + rows_presplit.append({ + "library": lib, "replicate": 1, "genotype": geno, + "condition_pre": cp, + "ln_cfu": 9.5, "ln_cfu_std": 0.1, + }) + + growth_df_raw = pd.DataFrame(rows_growth) + presplit_df_raw = pd.DataFrame(rows_presplit) + + from tfscreen.tfmodel.model_orchestrator import _build_presplit_tm, _read_presplit_df + growth_df = _read_growth_df(growth_df_raw) + tm_growth = _build_growth_tm(growth_df) + presplit_df = _read_presplit_df(presplit_df_raw, growth_df) + tm_presplit = _build_presplit_tm(presplit_df, tm_growth) + + # Both tensors must share the same condition_pre dimension labels + cp_growth = list(tm_growth.tensor_dim_labels[ + tm_growth.tensor_dim_names.index("condition_pre")]) + cp_presplit = list(tm_presplit.tensor_dim_labels[ + tm_presplit.tensor_dim_names.index("condition_pre")]) + assert cp_growth == cp_presplit, ( + f"growth condition_pre labels: {cp_growth}\n" + f"presplit condition_pre labels: {cp_presplit}" + ) \ No newline at end of file diff --git a/tests/tfscreen/tfmodel/test_presplit.py b/tests/tfscreen/tfmodel/test_presplit.py index edc229a2..9b499da1 100644 --- a/tests/tfscreen/tfmodel/test_presplit.py +++ b/tests/tfscreen/tfmodel/test_presplit.py @@ -39,6 +39,7 @@ def minimal_growth_df(): for geno in ["wt", "A1V", "A2V"]: for t_sel in [60.0, 90.0]: rows.append({ + "library": "lib", "replicate": rep, "condition_pre": cp, "condition_sel": cp, @@ -67,6 +68,7 @@ def minimal_presplit_df(): for cp in ["kanR-cond", "pheS-cond"]: for geno in ["wt", "A1V", "A2V"]: rows.append({ + "library": "lib", "replicate": rep, "condition_pre": cp, "genotype": geno, @@ -154,8 +156,8 @@ def test_build_presplit_tm_genotype_alignment(minimal_presplit_df, def test_build_presplit_tm_partial_coverage(minimal_growth_df, growth_tm): """Genotypes absent from presplit_df get NaN (masked) in the tensor.""" partial_df = pd.DataFrame([ - {"replicate": 1, "condition_pre": "kanR-cond", "genotype": "wt", - "ln_cfu": 9.5, "ln_cfu_std": 0.4}, + {"library": "lib", "replicate": 1, "condition_pre": "kanR-cond", + "genotype": "wt", "ln_cfu": 9.5, "ln_cfu_std": 0.4}, ]) gdf = _read_growth_df(minimal_growth_df.copy()) psdf = _read_presplit_df(partial_df, gdf) diff --git a/tests/tfscreen/tfmodel/test_registry.py b/tests/tfscreen/tfmodel/test_registry.py deleted file mode 100644 index a6fc398c..00000000 --- a/tests/tfscreen/tfmodel/test_registry.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Tests for tfmodel/registry.py. - -Verifies that: - - All expected categories are present in model_registry. - - Every component module under a dict-valued category exposes the three - required functions: get_priors, define_model, guide. - - get_priors() returns a non-None object for every component. - - The flat observe entries expose an `observe` callable. -""" - -import pytest -from tfscreen.tfmodel.generative.registry import model_registry - -# Categories whose values are {name: module} dicts. -COMPONENT_CATEGORIES = [ - "condition_growth", - "ln_cfu0", - "dk_geno", - "activity", - "transformation", - "theta", - "theta_growth_noise", - "theta_binding_noise", - "growth_transition", - "growth_noise", - "sample_offset", -] - -# Categories whose value is a single module (not a dict). -OBSERVE_CATEGORIES = ["observe_binding", "observe_growth"] - -# Categories whose modules only expose a single `rescale` callable. -RESCALE_CATEGORIES = ["theta_rescale"] - -REQUIRED_INTERFACE = ["get_priors", "define_model", "guide"] - - -# --------------------------------------------------------------------------- -# Top-level presence -# --------------------------------------------------------------------------- - -def test_all_component_categories_present(): - for cat in COMPONENT_CATEGORIES: - assert cat in model_registry, f"Missing category: {cat}" - - -def test_all_observe_categories_present(): - for cat in OBSERVE_CATEGORIES: - assert cat in model_registry, f"Missing observe entry: {cat}" - - -# --------------------------------------------------------------------------- -# Component interface (parametrised over category × entry) -# --------------------------------------------------------------------------- - -def _all_component_entries(): - """Yield (category, name, module) for every registered component.""" - for cat in COMPONENT_CATEGORIES: - entries = model_registry[cat] - assert isinstance(entries, dict), f"{cat} should be a dict of components" - for name, module in entries.items(): - yield cat, name, module - - -@pytest.mark.parametrize("cat,name,module", list(_all_component_entries())) -def test_component_has_required_interface(cat, name, module): - for fn in REQUIRED_INTERFACE: - assert hasattr(module, fn), ( - f"{cat}/{name} is missing required attribute '{fn}'" - ) - assert callable(getattr(module, fn)), ( - f"{cat}/{name}.{fn} is not callable" - ) - - -@pytest.mark.parametrize("cat,name,module", list(_all_component_entries())) -def test_get_priors_returns_object(cat, name, module): - priors = module.get_priors() - assert priors is not None, f"{cat}/{name}.get_priors() returned None" - - -# --------------------------------------------------------------------------- -# Transformation components also need update_thetas -# --------------------------------------------------------------------------- - -@pytest.mark.parametrize("name,module", list(model_registry["transformation"].items())) -def test_transformation_has_update_thetas(name, module): - assert hasattr(module, "update_thetas"), ( - f"transformation/{name} missing 'update_thetas'" - ) - assert callable(module.update_thetas) - - -# --------------------------------------------------------------------------- -# Observe modules -# --------------------------------------------------------------------------- - -@pytest.mark.parametrize("cat", OBSERVE_CATEGORIES) -def test_observe_module_has_observe(cat): - module = model_registry[cat] - assert hasattr(module, "observe"), f"{cat} missing 'observe' function" - assert callable(module.observe) - - -# --------------------------------------------------------------------------- -# No unexpected categories (guard against leftover or mis-keyed entries) -# --------------------------------------------------------------------------- - -@pytest.mark.parametrize("cat,name,module", - [(cat, name, mod) - for cat in RESCALE_CATEGORIES - for name, mod in model_registry[cat].items()]) -def test_rescale_component_has_rescale(cat, name, module): - assert hasattr(module, "rescale"), f"{cat}/{name} missing 'rescale' function" - assert callable(module.rescale) - - -def test_no_unexpected_top_level_keys(): - expected = set(COMPONENT_CATEGORIES) | set(OBSERVE_CATEGORIES) | set(RESCALE_CATEGORIES) - actual = set(model_registry.keys()) - extra = actual - expected - assert not extra, f"Unexpected keys in model_registry: {extra}" diff --git a/tests/tfscreen/tfmodel/test_share_replicates.py b/tests/tfscreen/tfmodel/test_share_replicates.py index 20b59c6b..22faf783 100644 --- a/tests/tfscreen/tfmodel/test_share_replicates.py +++ b/tests/tfscreen/tfmodel/test_share_replicates.py @@ -16,6 +16,7 @@ def get_mock_df(): for tconc in [0.0, 1.0]: for geno in ['wt', 'A1T']: data.append({ + "library": "lib", "genotype": geno, "condition_pre": cond_pre, "condition_sel": cond_sel, diff --git a/tests/tfscreen/tfmodel/test_spiked_genotypes.py b/tests/tfscreen/tfmodel/test_spiked_genotypes.py index d36591f9..5e097104 100644 --- a/tests/tfscreen/tfmodel/test_spiked_genotypes.py +++ b/tests/tfscreen/tfmodel/test_spiked_genotypes.py @@ -13,6 +13,7 @@ def dummy_data(): genotypes = ["wt", "A10G", "V20L"] for g in genotypes: rows.append({ + "library": "lib", "replicate": 1, "time": 0.0, "genotype": g, diff --git a/tests/tfscreen/util/test_grid_utils.py b/tests/tfscreen/util/test_grid_utils.py new file mode 100644 index 00000000..356220ad --- /dev/null +++ b/tests/tfscreen/util/test_grid_utils.py @@ -0,0 +1,135 @@ +""" +Unit tests for tfscreen.util.grid_utils. + +The relativize_node / relativize_config_paths / relativize_template_vars +functions are already covered in +tests/tfscreen/tfmodel/scripts/test_setup_grid_cli.py, so this file focuses +on the remaining helpers: sanitize, make_jinja_env, and make_run_name. +""" + +import pytest + +from tfscreen.util.grid_utils import sanitize, make_jinja_env, make_run_name + + +# --------------------------------------------------------------------------- +# sanitize +# --------------------------------------------------------------------------- + +class TestSanitize: + def test_plain_word_unchanged(self): + assert sanitize("hello") == "hello" + + def test_replaces_dot_with_underscore(self): + assert sanitize("a.b") == "a_b" + + def test_replaces_space_with_underscore(self): + assert sanitize("a b") == "a_b" + + def test_replaces_slash_with_underscore(self): + assert sanitize("a/b") == "a_b" + + def test_collapses_consecutive_underscores(self): + assert sanitize("a..b") == "a_b" + assert sanitize("a b") == "a_b" + + def test_strips_leading_trailing_underscores(self): + assert sanitize("_hello_") == "hello" + assert sanitize(".hello.") == "hello" + + def test_preserves_hyphens(self): + assert sanitize("a-b") == "a-b" + + def test_preserves_digits(self): + assert sanitize("abc123") == "abc123" + + def test_numeric_string(self): + # Numbers should come through as-is + assert sanitize(42) == "42" + + def test_empty_string_gives_empty(self): + assert sanitize("") == "" + + def test_only_special_chars_gives_empty(self): + assert sanitize("...") == "" + + +# --------------------------------------------------------------------------- +# make_jinja_env +# --------------------------------------------------------------------------- + +class TestMakeJinjaEnv: + def test_returns_jinja_environment(self): + import jinja2 + env = make_jinja_env() + assert isinstance(env, jinja2.Environment) + + def test_basename_filter_registered(self): + env = make_jinja_env() + assert "basename" in env.filters + + def test_basename_filter_works(self): + env = make_jinja_env() + tmpl = env.from_string("{{ path | basename }}") + assert tmpl.render(path="/a/b/c.yaml") == "c.yaml" + + def test_strict_mode_raises_on_missing_var(self): + import jinja2 + env = make_jinja_env(strict=True) + tmpl = env.from_string("{{ missing }}") + with pytest.raises(jinja2.UndefinedError): + tmpl.render() + + def test_non_strict_mode_renders_empty_on_missing(self): + env = make_jinja_env(strict=False) + tmpl = env.from_string("{{ missing }}") + # Should not raise; missing var renders as empty string + result = tmpl.render() + assert result == "" + + +# --------------------------------------------------------------------------- +# make_run_name +# --------------------------------------------------------------------------- + +class TestMakeRunName: + def test_prefix_always_present(self): + name = make_run_name(None, {"x": "val"}, 0) + assert name.startswith("run_0000") + + def test_index_zero_padded_to_4_digits(self): + name = make_run_name(None, {"x": "a"}, 7) + assert name.startswith("run_0007") + + def test_large_index(self): + name = make_run_name(None, {"x": "a"}, 1234) + assert name.startswith("run_1234") + + def test_no_template_uses_var_values(self): + name = make_run_name(None, {"alpha": "foo", "beta": "bar"}, 1) + assert "foo" in name + assert "bar" in name + + def test_no_template_sanitizes_values(self): + name = make_run_name(None, {"x": "a.b/c"}, 0) + # Special chars should not appear raw + assert "." not in name + assert "/" not in name + + def test_with_template(self): + name = make_run_name("{{ x }}__{{ y }}", {"x": "alpha", "y": "beta"}, 2) + assert "alpha" in name + assert "beta" in name + + def test_template_output_sanitized(self): + name = make_run_name("{{ x }}", {"x": "val with spaces"}, 0) + assert " " not in name + + def test_empty_suffix_returns_prefix_only(self): + # If all var values are empty, suffix is empty → name == prefix + name = make_run_name(None, {"x": ""}, 3) + assert name == "run_0003" + + def test_bad_template_raises_value_error(self): + with pytest.raises(ValueError, match="run_name template error"): + make_run_name("{% for %}", {}, 0)