From 16aafa5e08c82649e0c250230a412e6681a6c502 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Thu, 25 Jun 2026 08:21:00 -0700 Subject: [PATCH 01/30] added genotype batching --- src/tfscreen/tfmodel/model_orchestrator.py | 15 +- .../tfmodel/scripts/predict_growth_cli.py | 46 ++++-- .../scripts/test_predict_growth_cli.py | 141 ++++++++++++++++++ .../tfmodel/test_model_orchestrator.py | 1 - tests/tfscreen/tfmodel/test_presplit.py | 1 - 5 files changed, 181 insertions(+), 23 deletions(-) diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 303553a7..ae454484 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -307,17 +307,9 @@ def _read_binding_df(binding_df, growth_seen = growth_df[cols].drop_duplicates().set_index(cols) extra = binding_seen.index[~binding_seen.index.isin(growth_seen.index)] if len(extra) > 0: - by_titrant = {} - for geno, tname in extra: - by_titrant.setdefault(tname, []).append(geno) - detail = "\n".join( - f" {tname}: {', '.join(sorted(genos))}" - for tname, genos in sorted(by_titrant.items()) - ) print( f"Syncing binding_df to growth_df: {len(extra)} " - f"genotype/titrant_name pair(s) not in growth_df will be dropped.\n" - + detail, + f"genotype/titrant_name pair(s) not in growth_df will be dropped.", flush=True, ) # Inherit map_theta_group indices from growth_df so parameter indexing @@ -421,14 +413,13 @@ def _read_presplit_df(presplit_df, growth_df): growth_genotypes = set(growth_df["genotype"]) mask = presplit_df["genotype"].isin(growth_genotypes) - dropped_genos = sorted(set(presplit_df.loc[~mask, "genotype"].astype(str))) n_dropped = int((~mask).sum()) + n_dropped_genos = presplit_df.loc[~mask, "genotype"].nunique() presplit_df = presplit_df[mask].copy() if n_dropped > 0: print( f"Syncing presplit_df to growth_df: {n_dropped} row(s) for " - f"{len(dropped_genos)} genotype(s) not found in growth_df will be dropped.\n" - f" Dropped genotypes: {', '.join(dropped_genos)}", + f"{n_dropped_genos} genotype(s) not found in growth_df will be dropped.", flush=True, ) diff --git a/src/tfscreen/tfmodel/scripts/predict_growth_cli.py b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py index 72d4f0ed..e64a948b 100644 --- a/src/tfscreen/tfmodel/scripts/predict_growth_cli.py +++ b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py @@ -1,3 +1,4 @@ +import pandas as pd from tfscreen.tfmodel.configuration_io import read_configuration from tfscreen.tfmodel.inference.checkpoint_io import resolve_param_file from tfscreen.tfmodel.analysis.prediction import predict @@ -12,7 +13,8 @@ def predict_growth(config_file, titrant_concs_file=None, only_files=False, num_samples=0, - num_marginal_samples=None): + num_marginal_samples=None, + genotype_batch_size=None): """ Predict growth signal (ln_cfu) from a fitted hierarchical model. @@ -74,6 +76,12 @@ def predict_growth(config_file, num_marginal_samples : int or None, optional Number of posterior samples to run through the model when computing quantiles. If None, all available samples are used. + genotype_batch_size : int or None, optional + Maximum number of genotypes per predict() call. When set, the genotype + list is split into chunks of this size, each chunk is predicted + separately, and the results are concatenated. Reduces peak GPU memory + at the cost of one JAX re-compilation per batch. If None (default), all + genotypes are predicted in a single call. """ file_genotypes = read_lines(genotypes_file) if genotypes_file else [] titrant_names = read_lines(titrant_names_file) if titrant_names_file else None @@ -100,16 +108,35 @@ def predict_growth(config_file, training_concs = list(orchestrator.growth_df["titrant_conc"].unique()) titrant_concs = sorted(set(training_concs) | set(file_concs)) if file_concs else None + # When batching is requested and genotypes is still None (no file restriction), + # resolve the full list explicitly so it can be split into chunks. + if genotype_batch_size is not None and genotypes is None: + genotypes = list(orchestrator.growth_df["genotype"].unique()) + q_to_get = [0.5] if is_map else None print("Running growth predictions...", flush=True) - result_df = predict(orchestrator=orchestrator, - param_posteriors=param_file, - predict_sites=["growth_pred"], - num_samples=num_samples, - num_marginal_samples=num_marginal_samples, - titrant_conc=titrant_concs, - genotypes=genotypes, - q_to_get=q_to_get) + + predict_kwargs = dict( + orchestrator=orchestrator, + param_posteriors=param_file, + predict_sites=["growth_pred"], + num_samples=num_samples, + num_marginal_samples=num_marginal_samples, + titrant_conc=titrant_concs, + q_to_get=q_to_get, + ) + + if genotype_batch_size is not None and genotypes is not None and len(genotypes) > genotype_batch_size: + batches = [genotypes[i:i + genotype_batch_size] + for i in range(0, len(genotypes), genotype_batch_size)] + n_batches = len(batches) + batch_dfs = [] + for batch_idx, batch in enumerate(batches, 1): + print(f" Batch {batch_idx}/{n_batches} ({len(batch)} genotypes)...", flush=True) + batch_dfs.append(predict(**predict_kwargs, genotypes=batch)) + result_df = pd.concat(batch_dfs, ignore_index=True) + else: + result_df = predict(**predict_kwargs, genotypes=genotypes) # Apply titrant_name filter post-prediction. if titrant_names is not None: @@ -132,6 +159,7 @@ def main(): "titrant_names_file": str, "titrant_concs_file": str, "num_marginal_samples": int, + "genotype_batch_size": int, "only_files": bool}) diff --git a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py index 8c34a719..1965eb97 100644 --- a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py @@ -335,3 +335,144 @@ def fake_predict(**kwargs): out_prefix=str(tmp_path / "out")) assert predict_calls["q_to_get"] is None + + +# --------------------------------------------------------------------------- +# Genotype batching +# --------------------------------------------------------------------------- + +class TestPredictGrowthBatching: + """Tests for --genotype_batch_size batching logic.""" + + def _make_fake_predict(self, orchestrator): + """Return a fake predict that records every call and returns a DataFrame.""" + all_calls = [] + + def fake_predict(**kwargs): + all_calls.append(dict(kwargs)) + genotypes = kwargs.get("genotypes") or orchestrator.growth_df["genotype"].unique().tolist() + concs = kwargs.get("titrant_conc") or orchestrator.growth_df["titrant_conc"].unique().tolist() + rows = [{"genotype": g, "titrant_name": "IPTG", "titrant_conc": c, + "q0.5": 10.0} + for g in genotypes for c in concs] + return pd.DataFrame(rows) + + return fake_predict, all_calls + + def _patch_stack(self, mock_orchestrator, fake_predict): + return [ + patch("tfscreen.tfmodel.scripts.predict_growth_cli.read_configuration", + return_value=(mock_orchestrator, {})), + patch("tfscreen.tfmodel.scripts.predict_growth_cli.resolve_param_file", + side_effect=lambda pf, orchestrator, op: pf), + patch("tfscreen.tfmodel.scripts.predict_growth_cli.predict", + side_effect=fake_predict), + ] + + def test_no_batching_when_batch_size_none(self, mock_orchestrator, tmp_path): + """genotype_batch_size=None → predict called exactly once.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=None) + assert len(all_calls) == 1 + + def test_batch_size_larger_than_total_single_call(self, mock_orchestrator, tmp_path): + """genotype_batch_size > n_genotypes → still a single predict call.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1000) + assert len(all_calls) == 1 + + def test_batch_size_1_two_genotypes_two_calls(self, mock_orchestrator, tmp_path): + """genotype_batch_size=1 with 2 training genotypes → 2 predict calls.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + assert len(all_calls) == 2 + + def test_batch_each_call_gets_one_genotype(self, mock_orchestrator, tmp_path): + """With batch_size=1, each predict call receives exactly 1 genotype.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + for call in all_calls: + assert len(call["genotypes"]) == 1 + + def test_batch_covers_all_genotypes(self, mock_orchestrator, tmp_path): + """All training genotypes appear across the batched predict calls.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + seen = [call["genotypes"][0] for call in all_calls] + expected = mock_orchestrator.growth_df["genotype"].unique().tolist() + assert sorted(seen) == sorted(expected) + + def test_batch_results_concatenated_in_csv(self, mock_orchestrator, tmp_path): + """Output CSV contains rows for every genotype across all batches.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + out = str(tmp_path / "out") + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=out, + genotype_batch_size=1) + df = pd.read_csv(f"{out}.csv") + assert set(df["genotype"].unique()) == {"wt", "A1B"} + + def test_batch_resolves_none_genotypes_from_orchestrator(self, mock_orchestrator, tmp_path): + """When genotypes would be None, batching resolves from orchestrator.growth_df.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + # No genotypes_file → genotypes=None without batching; with batching + # it must be resolved so the list can be split. + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + # Each call must have an explicit genotypes list, not None. + for call in all_calls: + assert call.get("genotypes") is not None + + def test_batch_with_file_genotypes_splits_file_list(self, mock_orchestrator, tmp_path): + """When only_files=True and a genotypes file is given, batching splits the file list.""" + gf = str(tmp_path / "genos.txt") + _write_lines(gf, ["wt", "A1B"]) + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + genotypes_file=gf, + only_files=True, + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + assert len(all_calls) == 2 + seen = [call["genotypes"][0] for call in all_calls] + assert sorted(seen) == ["A1B", "wt"] + + def test_batch_in_training_data_correct_across_batches(self, mock_orchestrator, tmp_path): + """in_training_data column is correct for rows from all batches.""" + fake_predict, _ = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + out = str(tmp_path / "out") + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=out, + genotype_batch_size=1) + df = pd.read_csv(f"{out}.csv") + # Both genotypes in training data → all rows should be in_training_data=1 + assert (df["in_training_data"] == 1).all() diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 5e75ad04..b22c2fff 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -214,7 +214,6 @@ def test_read_binding_df_extra_pairs_dropped_with_warning(capsys): result = _read_binding_df(binding_df, growth_df=growth_df) captured = capsys.readouterr() assert "will be dropped" in captured.out - assert "M42I" in captured.out # Only the "wt" row should survive assert set(result["genotype"]) == {"wt"} diff --git a/tests/tfscreen/tfmodel/test_presplit.py b/tests/tfscreen/tfmodel/test_presplit.py index 9b499da1..d0116b0f 100644 --- a/tests/tfscreen/tfmodel/test_presplit.py +++ b/tests/tfscreen/tfmodel/test_presplit.py @@ -103,7 +103,6 @@ def test_read_presplit_df_drops_unknown_genotypes(minimal_presplit_df, result = _read_presplit_df(df_extra, gdf) captured = capsys.readouterr() assert "will be dropped" in captured.out - assert "A99V" in captured.out assert "A99V" not in result["genotype"].values assert len(result) == len(minimal_presplit_df) From 0c33d372777d686bb27051c9cf5c23085e45b35d Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Thu, 25 Jun 2026 20:58:42 -0700 Subject: [PATCH 02/30] fixed bug in growth prediction batching --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 435 +++++++++--------- reports/junit/junit.xml | 2 +- .../tfmodel/scripts/predict_growth_cli.py | 22 +- .../scripts/test_predict_growth_cli.py | 136 ++++++ 6 files changed, 378 insertions(+), 221 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index c4be7e75..80ba1187 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.23%coverage96.23% \ No newline at end of file +coverage: 96.24%coverage96.24% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 73b48077..7cfca822 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3633tests3633 \ No newline at end of file +tests: 3642tests3642 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index b7c078e1..efdfa29f 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -3438,149 +3438,149 @@ ./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:334:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:366:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:367:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:368:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:370:23: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:371:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:372:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:376:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:455:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:520:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:523:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:528:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:529:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:536:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:540:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:556:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:557:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/model_orchestrator.py:577:82: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:582:87: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:585:84: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:590:79: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:672:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:672:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:697:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:698:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:700:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:701:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:701:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:701:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:702:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:702:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:703:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:707:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:708:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:713:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:720:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:722:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:722:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:724:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:727:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:729:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:731:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:743:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:751:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:773:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:774:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:774:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:775:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:775:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:776:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:776:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:777:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:777:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:779:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:786:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:791:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:791:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:791:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:798:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:844:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:845:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:846:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:847:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:887:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:890:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:891:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:892:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:896:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:897:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:898:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:899:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:901:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:912:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:912:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:915:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:916:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:921:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:922:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:923:58: 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/model_orchestrator.py:938:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:941:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:947:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:949:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:956:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1012:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1013:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1014:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1015:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1022:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1024:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1100:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1101:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1103:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1176:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:1196:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1198:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1199:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1201:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1202:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1203:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1204:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1221:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1222:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1223:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1223:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1223:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1223:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1223:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1292:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1295:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1299:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1301:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1311:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1313:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1366:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1371:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1385:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1395:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1405:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1419:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1422:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1451:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1463:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1475:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1481:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1482:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1483:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1484:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1485:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1486:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1487:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1488:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1489:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1490:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1491:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1492:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1493:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1494:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1495: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 @@ -3632,6 +3632,7 @@ ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:521:72: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:522:74: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:524:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:122:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:106:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:107:23: E221 multiple spaces before operator @@ -7288,75 +7289,75 @@ ./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: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: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_model_orchestrator.py:299:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:322:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:328:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:330:76: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:353:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:361:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:362:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:372:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:48: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:50: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:52: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:54: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:56: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:58: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:386:112: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:386:128: E501 line too long (191 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:391:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:394:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:398:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:405:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:424:128: E501 line too long (198 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:429:128: E501 line too long (167 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:477:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:478:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:481:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:489:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:498:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:500:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:512:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:517:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:525:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:533:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:544:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:547:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:554:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:561:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:569:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:574:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:579:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:585:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:594:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:598:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:608:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:609:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:611:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:612:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:624:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:630:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:639:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:640:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:643:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:646:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:909:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1306:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1550:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1557: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 @@ -7372,12 +7373,12 @@ ./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: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_presplit.py:127:35: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:140:48: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:174:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:200:28: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:218:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_presplit.py:230: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 @@ -7702,9 +7703,9 @@ 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 +42 F841 local variable 'e' is assigned to but never used 638 W291 trailing whitespace 86 W292 no newline at end of file 1630 W293 blank line contains whitespace 30 W391 blank line at end of file -7661 +7662 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 895ef5b3..43fbb36d 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/tfmodel/scripts/predict_growth_cli.py b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py index e64a948b..e1dbd3c3 100644 --- a/src/tfscreen/tfmodel/scripts/predict_growth_cli.py +++ b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py @@ -113,6 +113,14 @@ def predict_growth(config_file, if genotype_batch_size is not None and genotypes is None: genotypes = list(orchestrator.growth_df["genotype"].unique()) + # Binding genotypes (those with direct theta_obs measurements) must appear + # in every batch so the binding TensorManager is never empty. + try: + binding_genos = [str(g) for g in orchestrator.binding_df["genotype"].unique()] + except Exception: + binding_genos = [] + binding_set = set(binding_genos) + q_to_get = [0.5] if is_map else None print("Running growth predictions...", flush=True) @@ -133,7 +141,19 @@ def predict_growth(config_file, batch_dfs = [] for batch_idx, batch in enumerate(batches, 1): print(f" Batch {batch_idx}/{n_batches} ({len(batch)} genotypes)...", flush=True) - batch_dfs.append(predict(**predict_kwargs, genotypes=batch)) + # Binding genotypes (those with direct theta_obs measurements) must + # appear in every predict() call so the binding TensorManager is + # never empty. Prepend any that are missing from this chunk, then + # strip their rows from the result so each binding genotype appears + # only once — in the batch where it falls naturally. + batch_set = set(batch) + extra_binding = [g for g in binding_genos if g not in batch_set] + run_genotypes = extra_binding + list(batch) if extra_binding else list(batch) + batch_df = predict(**predict_kwargs, genotypes=run_genotypes) + if extra_binding: + extra_set = set(extra_binding) + batch_df = batch_df[~batch_df["genotype"].isin(extra_set)].reset_index(drop=True) + batch_dfs.append(batch_df) result_df = pd.concat(batch_dfs, ignore_index=True) else: result_df = predict(**predict_kwargs, genotypes=genotypes) diff --git a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py index 1965eb97..21d26e93 100644 --- a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py @@ -476,3 +476,139 @@ def test_batch_in_training_data_correct_across_batches(self, mock_orchestrator, df = pd.read_csv(f"{out}.csv") # Both genotypes in training data → all rows should be in_training_data=1 assert (df["in_training_data"] == 1).all() + + +# --------------------------------------------------------------------------- +# Spiked-genotype augmentation during batching +# --------------------------------------------------------------------------- + +@pytest.fixture +def mock_orchestrator_binding(): + """Orchestrator with 'wt' as the only binding genotype (has theta_obs data).""" + orchestrator = MagicMock() + orchestrator.growth_df = _make_growth_df(["wt", "A1B"], [0.0, 1.0]) + orchestrator.binding_df = pd.DataFrame({ + "genotype": ["wt", "wt"], + "titrant_name": ["IPTG", "IPTG"], + "titrant_conc": [0.0, 1.0], + "theta_obs": [0.1, 0.9], + "theta_std": [0.01, 0.01], + }) + return orchestrator + + +class TestPredictGrowthBatchingSpiked: + """Tests for binding-genotype augmentation when batching.""" + + def _make_fake_predict(self, orchestrator): + all_calls = [] + + def fake_predict(**kwargs): + all_calls.append(dict(kwargs)) + genotypes = kwargs.get("genotypes") or orchestrator.growth_df["genotype"].unique().tolist() + concs = kwargs.get("titrant_conc") or orchestrator.growth_df["titrant_conc"].unique().tolist() + rows = [{"genotype": g, "titrant_name": "IPTG", "titrant_conc": c, + "q0.5": 10.0} + for g in genotypes for c in concs] + return pd.DataFrame(rows) + + return fake_predict, all_calls + + def _patch_stack(self, orchestrator, fake_predict): + return [ + patch("tfscreen.tfmodel.scripts.predict_growth_cli.read_configuration", + return_value=(orchestrator, {})), + patch("tfscreen.tfmodel.scripts.predict_growth_cli.resolve_param_file", + side_effect=lambda pf, orch, op: pf), + patch("tfscreen.tfmodel.scripts.predict_growth_cli.predict", + side_effect=fake_predict), + ] + + def test_binding_geno_added_to_batch_missing_it(self, mock_orchestrator_binding, tmp_path): + """The batch that doesn't contain 'wt' (binding genotype) gets it prepended.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator_binding) + patches = self._patch_stack(mock_orchestrator_binding, fake_predict) + with patches[0], patches[1], patches[2]: + # batch_size=1 → batch1=["wt"], batch2=["A1B"]; "wt" must appear in batch2 call + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + assert len(all_calls) == 2 + # batch2 is the "A1B" batch; "wt" (binding genotype) must be included + a1b_call = next(c for c in all_calls if "A1B" in c["genotypes"]) + assert "wt" in a1b_call["genotypes"] + + def test_binding_geno_rows_stripped_from_non_native_batch(self, mock_orchestrator_binding, tmp_path): + """Rows for extra binding genotypes are removed from the batch result.""" + fake_predict, _ = self._make_fake_predict(mock_orchestrator_binding) + patches = self._patch_stack(mock_orchestrator_binding, fake_predict) + out = str(tmp_path / "out") + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=out, + genotype_batch_size=1) + df = pd.read_csv(f"{out}.csv") + # "wt" should appear once per titrant_conc, not twice (no duplication) + wt_rows = df[df["genotype"] == "wt"] + expected_wt_rows = len(mock_orchestrator_binding.growth_df[ + mock_orchestrator_binding.growth_df["genotype"] == "wt" + ]["titrant_conc"].unique()) + assert len(wt_rows) == expected_wt_rows + + def test_binding_geno_appears_exactly_once_in_output(self, mock_orchestrator_binding, tmp_path): + """Binding genotype rows appear exactly once in the final CSV.""" + fake_predict, _ = self._make_fake_predict(mock_orchestrator_binding) + patches = self._patch_stack(mock_orchestrator_binding, fake_predict) + out = str(tmp_path / "out") + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=out, + genotype_batch_size=1) + df = pd.read_csv(f"{out}.csv") + wt_rows = df[df["genotype"] == "wt"] + assert len(wt_rows) == wt_rows.drop_duplicates( + subset=["genotype", "titrant_name", "titrant_conc"] + ).shape[0] + + def test_all_genotypes_present_in_output_with_binding(self, mock_orchestrator_binding, tmp_path): + """Both binding and library genotypes appear in the output CSV.""" + fake_predict, _ = self._make_fake_predict(mock_orchestrator_binding) + patches = self._patch_stack(mock_orchestrator_binding, fake_predict) + out = str(tmp_path / "out") + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=out, + genotype_batch_size=1) + df = pd.read_csv(f"{out}.csv") + assert set(df["genotype"].unique()) == {"wt", "A1B"} + + def test_no_augmentation_when_no_binding_df(self, mock_orchestrator, tmp_path): + """When binding_df is a MagicMock (no real data), no augmentation happens.""" + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) + patches = self._patch_stack(mock_orchestrator, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + # Each call should get exactly the original batch (1 genotype), no augmentation + for call in all_calls: + assert len(call["genotypes"]) == 1 + + def test_binding_geno_not_in_requested_genotypes_still_augments( + self, mock_orchestrator_binding, tmp_path): + """Binding genotypes are added even when not in the user-requested list.""" + gf = str(tmp_path / "genos.txt") + _write_lines(gf, ["A1B"]) # only the non-binding genotype + fake_predict, all_calls = self._make_fake_predict(mock_orchestrator_binding) + patches = self._patch_stack(mock_orchestrator_binding, fake_predict) + with patches[0], patches[1], patches[2]: + predict_growth("cfg.yaml", "post.h5", + genotypes_file=gf, + only_files=True, + out_prefix=str(tmp_path / "out"), + genotype_batch_size=1) + # Only 1 genotype in list → single call (no batching), but even if + # batched, "wt" would be added and stripped. The CSV should only + # contain A1B rows. + df = pd.read_csv(f"{tmp_path / 'out'}.csv") + assert set(df["genotype"].unique()) == {"A1B"} From ca00115ac71fd843c1eda439d2f969ab16411e63 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Fri, 3 Jul 2026 15:49:01 -0700 Subject: [PATCH 03/30] fixing empirical theta correction bug --- src/tfscreen/tfmodel/analysis/batch_sizing.py | 156 ++++++++ src/tfscreen/tfmodel/analysis/prediction.py | 87 +++- src/tfscreen/tfmodel/data_class.py | 12 + .../components/transformation/_congression.py | 42 +- .../components/transformation/empirical.py | 8 + .../components/transformation/logit_norm.py | 6 + .../components/transformation/single.py | 7 +- src/tfscreen/tfmodel/generative/model.py | 45 ++- .../tfmodel/inference/run_inference.py | 346 +++++++++------- src/tfscreen/tfmodel/model_orchestrator.py | 78 +++- src/tfscreen/tfmodel/scripts/fit_model_cli.py | 3 + .../tfmodel/scripts/predict_growth_cli.py | 33 +- tests/smoke-tests/test_prediction_smoke.py | 10 +- .../tfmodel/analysis/test_batch_sizing.py | 171 ++++++++ .../tfmodel/analysis/test_prediction.py | 190 ++++++++- .../theta/test_full_population_contract.py | 154 +++++++ .../transformation/test__congression.py | 76 ++++ .../transformation/test_empirical.py | 6 + .../transformation/test_logit_norm.py | 6 + .../components/transformation/test_single.py | 6 + .../tfscreen/tfmodel/generative/test_model.py | 113 +++++- .../tfmodel/generative/test_model_math.py | 4 +- .../tfmodel/inference/test_run_inference.py | 376 ++++++++++++++---- .../scripts/test_predict_growth_cli.py | 61 ++- .../tfmodel/test_model_orchestrator.py | 110 +++++ 25 files changed, 1832 insertions(+), 274 deletions(-) create mode 100644 src/tfscreen/tfmodel/analysis/batch_sizing.py create mode 100644 tests/tfscreen/tfmodel/analysis/test_batch_sizing.py create mode 100644 tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py diff --git a/src/tfscreen/tfmodel/analysis/batch_sizing.py b/src/tfscreen/tfmodel/analysis/batch_sizing.py new file mode 100644 index 00000000..8592fed5 --- /dev/null +++ b/src/tfscreen/tfmodel/analysis/batch_sizing.py @@ -0,0 +1,156 @@ +"""Estimate a safe genotype_batch_size for predict() from tensor shapes and +available device memory, so CLIs don't require hand-tuning after an OOM. +""" + +import os + +import jax + +from tfscreen.tfmodel.model_orchestrator import FLOAT_DTYPE + +# Empirically calibrated on CPU (measuring RSS delta of real predict() calls +# at genotype counts of 500/2000/5000 against the raw tensor-byte formula) +# to absorb overhead not captured by the raw tensor-byte count: the per-site +# quantile copy, the host-transfer copy of posterior samples, and (on GPU) +# XLA compilation/workspace buffers. The measured marginal cost per genotype +# was ~6.5x the raw formula; this is rounded up for headroom, since GPU-side +# overhead (not measurable on this CPU-only calibration) is expected to be +# higher. Lower this if a genotype_batch_size sized with it still OOMs on GPU. +_DEFAULT_OVERHEAD_MULTIPLIER = 8.0 + +# Fraction of total device memory to treat as usable budget, leaving +# headroom for the host process, other tensors already resident, and the +# unmodeled overhead above. +_DEFAULT_SAFETY_FRACTION = 0.7 + + +def _dtype_itemsize(): + """Byte size of the float dtype used for prediction tensors.""" + return jax.numpy.dtype(FLOAT_DTYPE).itemsize + + +def estimate_bytes_per_genotype(orchestrator, + predict_sites, + num_marginal_samples=None, + overhead_multiplier=_DEFAULT_OVERHEAD_MULTIPLIER): + """ + Estimate peak bytes of device memory consumed per genotype during + predict(). + + Each genotype's row in the dense TensorManager tensor carries the full + cross-product of every other tensor dimension (replicate, time, + condition_pre, condition_sel, titrant_name, titrant_conc). predict() + additionally holds one such array per requested predict_sites entry, + stacked over the posterior-sample axis. + + Parameters + ---------- + orchestrator : ModelOrchestrator + Orchestrator whose growth_tm defines the tensor shape. genotype is + assumed to be the last dimension in growth_tm.tensor_shape. + predict_sites : list of str + Sites requested from predict(). + num_marginal_samples : int or None, optional + Number of posterior draws run through the model for quantile + computation. If None, the full posterior draw count is unknown here, + so callers should pass the resolved value (or an upper bound). + overhead_multiplier : float, optional + Multiplier absorbing unmodeled overhead (quantile/host copies, XLA + workspace). Default calibrated value. + + Returns + ------- + float + Estimated bytes of device memory per genotype. + """ + tensor_shape = orchestrator.growth_tm.tensor_shape + other_axes_product = 1 + for size in tensor_shape[:-1]: + other_axes_product *= size + + n_samples = num_marginal_samples if num_marginal_samples is not None else 1 + n_sites = len(predict_sites) if predict_sites else 1 + + bytes_per_genotype = ( + other_axes_product + * n_samples + * n_sites + * _dtype_itemsize() + * overhead_multiplier + ) + + return bytes_per_genotype + + +def get_available_memory_bytes(safety_fraction=_DEFAULT_SAFETY_FRACTION): + """ + Estimate a usable memory budget in bytes for the current JAX default + device. + + On GPU/TPU backends, uses jax.devices()[0].memory_stats()['bytes_limit'], + which reflects total device memory capacity (not current usage) and is + reliable regardless of XLA's preallocation behavior. On CPU, or when + memory_stats() is unsupported (returns None, as it does on the CPU + backend), falls back to total system RAM via os.sysconf. + + Parameters + ---------- + safety_fraction : float, optional + Fraction of total memory to treat as usable, leaving headroom for + other processes and unmodeled overhead. Default 0.7. + + Returns + ------- + int + Usable memory budget in bytes. + """ + device = jax.devices()[0] + stats = device.memory_stats() + + if stats is not None and "bytes_limit" in stats: + total_bytes = stats["bytes_limit"] + else: + total_bytes = os.sysconf("SC_PAGE_SIZE") * os.sysconf("SC_PHYS_PAGES") + + return int(total_bytes * safety_fraction) + + +def estimate_genotype_batch_size(orchestrator, + predict_sites, + num_marginal_samples=None, + safety_fraction=_DEFAULT_SAFETY_FRACTION, + overhead_multiplier=_DEFAULT_OVERHEAD_MULTIPLIER): + """ + Estimate a genotype_batch_size that keeps predict() under the available + memory budget. + + Parameters + ---------- + orchestrator : ModelOrchestrator + Orchestrator used to derive per-genotype memory cost. + predict_sites : list of str + Sites requested from predict(). + num_marginal_samples : int or None, optional + Number of posterior draws run through the model. See + estimate_bytes_per_genotype. + safety_fraction : float, optional + Fraction of total device memory to treat as usable. Default 0.7. + overhead_multiplier : float, optional + Multiplier absorbing unmodeled overhead. Default calibrated value. + + Returns + ------- + int + Estimated genotype batch size, clamped to at least 1. + """ + bytes_per_genotype = estimate_bytes_per_genotype( + orchestrator, + predict_sites, + num_marginal_samples=num_marginal_samples, + overhead_multiplier=overhead_multiplier, + ) + available_bytes = get_available_memory_bytes(safety_fraction=safety_fraction) + + batch_size = int(available_bytes // bytes_per_genotype) + + return max(batch_size, 1) diff --git a/src/tfscreen/tfmodel/analysis/prediction.py b/src/tfscreen/tfmodel/analysis/prediction.py index 195678f3..ba118709 100644 --- a/src/tfscreen/tfmodel/analysis/prediction.py +++ b/src/tfscreen/tfmodel/analysis/prediction.py @@ -1,6 +1,7 @@ import pandas as pd import numpy as np import itertools +import warnings from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator from tfscreen.tfmodel.inference.posteriors import load_posteriors, get_posterior_samples from tfscreen.tfmodel.tensors.batch import get_batch as _get_batch @@ -241,6 +242,67 @@ def _convert_map_params(map_params, model_trace): return constrained +def _build_population_theta_reference(param_posteriors, max_samples=20): + """ + Build a single population-wide theta_growth reference for transformation + components whose congression correction needs one (see + transformation/_congression.py and generative/model.py). + + Reads the ``theta_growth_pred`` deterministic site, which get_posteriors() + always stores at full genotype-population size regardless of any + genotype batching used during training or posterior sampling (unlike a + fresh forward pass through a genotype-subsetted orchestrator, which only + ever sees the requested subset -- see copy_orchestrator()). + + Reduces across a small number of posterior draws (median) rather than + threading the full posterior sample axis through this call: the + population reference only needs to characterize the theta *distribution* + across genotypes for the congression correction, not track each specific + joint posterior draw, and this keeps the one-time cost independent of + both ``num_marginal_samples`` and the number of stored posterior draws. + + Parameters + ---------- + param_posteriors : dict-like + Full (not genotype-subsetted) posterior samples, as returned by + load_posteriors(). + max_samples : int, optional + Maximum number of posterior draws to read when computing the + median. Default 20. + + Returns + ------- + jnp.ndarray or None + Shape matches theta_growth_pred's stored shape with the leading + sample axis reduced away (typically (num_titrant_name, + num_titrant_conc, num_genotype), possibly with extra broadcast dims + from scatter_theta=1). None if theta_growth_pred is not present in + param_posteriors (e.g. a raw MAP checkpoint, which stores guide + parameters rather than deterministic site values). + """ + try: + theta_growth_pred = get_posterior_samples(param_posteriors, "theta_growth_pred") + except KeyError: + warnings.warn( + "The configured transformation component needs a population-wide " + "theta reference for its congression correction, but " + "'theta_growth_pred' was not found in param_posteriors (expected " + "for raw MAP checkpoints, which only store guide parameters, not " + "deterministic site values). Falling back to no population " + "reference; predictions may reproduce the population-CDF bug this " + "mechanism exists to avoid. Run tfs-sample-posterior to generate " + "a full posterior file instead.", + UserWarning, + stacklevel=2, + ) + return None + + n_available = theta_growth_pred.shape[0] + n_use = min(max_samples, n_available) + theta_growth_pred = np.asarray(theta_growth_pred[:n_use]) + return jnp.asarray(np.median(theta_growth_pred, axis=0)) + + def predict(orchestrator, param_posteriors, predict_sites=None, @@ -302,10 +364,26 @@ def predict(orchestrator, if predict_sites is None: predict_sites = ["growth_pred"] - + if isinstance(predict_sites, str): predict_sites = [predict_sites] + # Some transformation components (currently just "empirical") correct + # theta using a background CDF that must be estimated from the *full* + # genotype population, not whatever subset of genotypes this call + # happens to request (see generative/model.py and + # transformation/_congression.py). Build that reference once, up front, + # from the full-population posterior -- never from new_orchestrator, + # which copy_orchestrator() below rebuilds scoped to just the requested + # genotypes. + transformation_control = orchestrator.main_control_kwargs.get("transformation") + transformation_needs_population = ( + bool(transformation_control[2]) if transformation_control is not None else False + ) + external_theta_population = None + if transformation_needs_population: + external_theta_population = _build_population_theta_reference(param_posteriors) + # Create the expanded prediction model, subsetting genotypes if requested. # Passing genotypes to copy_orchestrator ensures the new orchestrator's TM # labels are a strict subset of the original's, which triggers parameter @@ -436,6 +514,13 @@ def predict(orchestrator, all_indices = jnp.arange(num_geno, dtype=jnp.int32) pred_data = _get_batch(new_orchestrator.data, all_indices) + if external_theta_population is not None: + pred_data = pred_data.replace( + growth=pred_data.growth.replace( + external_theta_population=external_theta_population + ) + ) + # Use the ORIGINAL orchestrator's priors so that any pinned hyperpriors # (e.g. activity_hyper_loc/activity_hyper_scale in the calibration model) # remain pinned at their calibrated values rather than being sampled from diff --git a/src/tfscreen/tfmodel/data_class.py b/src/tfscreen/tfmodel/data_class.py index cc0e963f..5b6f8d36 100644 --- a/src/tfscreen/tfmodel/data_class.py +++ b/src/tfscreen/tfmodel/data_class.py @@ -101,6 +101,18 @@ class GrowthData: struct_contact_pair_idx: Any = field(pytree_node=False, default=None) struct_contact_distances: Any = field(pytree_node=False, default=None) + # Precomputed theta at growth titrant concentrations for *every* genotype + # in the library (shape (num_titrant_name, num_titrant_conc, true_num_genotype)), + # used only by transformation components whose congression correction needs + # a population-wide reference distribution (see transformation/_congression.py). + # None (the default) tells `jax_model` to compute this locally from + # `data.growth` itself, which is only correct when `data.growth` already + # spans the full genotype population (true during SVI training, since + # genotype minibatching never shrinks `num_genotype`). Prediction code + # paths that subset genotypes (e.g. `analysis.prediction.predict`) must + # supply this explicitly, computed against the true, unsubsetted library. + external_theta_population: Any = field(default=None) + @dataclass(frozen=True) class BindingData: diff --git a/src/tfscreen/tfmodel/generative/components/transformation/_congression.py b/src/tfscreen/tfmodel/generative/components/transformation/_congression.py index ac13f750..649b15e3 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/_congression.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/_congression.py @@ -61,15 +61,16 @@ def get_cdf(s): return flat_cdf.reshape(shape + (len(t_grid),)) -def update_thetas(theta, params, theta_dist=None, mask=None, n_grid=256): +def update_thetas(theta, params, theta_dist=None, mask=None, n_grid=256, + population_theta=None): """ - Corrects theta values for co-transformation using the method of + Corrects theta values for co-transformation using the method of re-sampling from the background distribution. Parameters ---------- theta : jnp.array - Array of theta values. + Array of theta values to correct. Expected shape: (..., num_genotype) params : tuple Tuple of parameters defining the background distribution. @@ -79,11 +80,23 @@ def update_thetas(theta, params, theta_dist=None, mask=None, n_grid=256): One of "logit_norm" or "empirical". If None, the distribution is inferred from the length of params. mask : jnp.array, optional - Boolean array of shape (num_genotype,) where True indicates the + Boolean array of shape (num_genotype,) where True indicates the genotype should be corrected for congression. If None, all genotypes are corrected. n_grid : int, optional Number of points for grid-based numerical integration (default 256). + population_theta : jnp.array, optional + Array of theta values used to build the background (empirical) CDF, + expected shape (..., num_population_genotype), broadcastable against + ``theta`` on every axis except the last. Only consulted when + ``theta_dist == "empirical"``. If None (default), ``theta`` itself is + used as the population sample, which is only statistically valid when + ``theta`` already spans the full genotype population — callers that + only ever see a genotype subset or minibatch (e.g. batched training or + single-genotype prediction) must pass the true population sample here + or the empirical CDF silently degenerates to whatever subset is + present, biasing the correction. Ignored for "logit_norm", which uses + the smooth analytic CDF in ``params`` instead of raw samples. Returns ------- @@ -117,16 +130,23 @@ def update_thetas(theta, params, theta_dist=None, mask=None, n_grid=256): Ft_grid = jax.vmap(lambda m, s: _logit_normal_cdf(t_grid, m, s))(flat_params[1], flat_params[2]) elif theta_dist == "empirical": - Ft_grid_raw = _empirical_cdf(theta, t_grid) + # Build the background CDF from population_theta when supplied (the + # full genotype population) rather than theta itself (which may only + # cover a training minibatch or a handful of requested genotypes). + # See the population_theta docstring above. + pop_theta = theta if population_theta is None else population_theta + + Ft_grid_raw = _empirical_cdf(pop_theta, t_grid) num_p_batches = Ft_grid_raw.reshape(-1, n_grid).shape[0] - - # Broadcast lambda to match theta's batch dimension - lam_b = jnp.broadcast_to(lam, theta.shape[:-1]) + + # Broadcast lambda to match the population's leading (non-genotype) + # dimensions, which must agree with theta's leading dimensions. + lam_b = jnp.broadcast_to(lam, pop_theta.shape[:-1]) flat_lam = lam_b.reshape(-1) - + Ft_grid = Ft_grid_raw.reshape(-1, n_grid) - integration_shape = theta.shape[:-1] - + integration_shape = pop_theta.shape[:-1] + else: raise ValueError(f"Unsupported theta_dist: {theta_dist}") diff --git a/src/tfscreen/tfmodel/generative/components/transformation/empirical.py b/src/tfscreen/tfmodel/generative/components/transformation/empirical.py index 690a846f..3072bb0e 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/empirical.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/empirical.py @@ -24,6 +24,14 @@ def get_priors(): # Bake the theta_dist for the update function update_thetas = partial(congression.update_thetas, theta_dist="empirical") +# The empirical background CDF is estimated from raw per-genotype theta +# samples (see _congression._empirical_cdf), so it is only well-calibrated +# when built from the full genotype population rather than a training +# minibatch or a handful of requested genotypes. jax_model uses this flag to +# decide whether to compute (or expect an externally supplied) +# population-wide theta reference before calling update_thetas. +NEEDS_FULL_POPULATION_THETA = True + def get_extract_specs(ctx): lam_df = pd.DataFrame({"parameter": ["lam"], "map_all": [0]}) diff --git a/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py b/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py index 80d00d03..d19a0241 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py @@ -25,6 +25,12 @@ def get_priors(): # Bake the theta_dist for the update function update_thetas = partial(congression.update_thetas, theta_dist="logit_norm") +# logit_norm's background CDF is the smooth analytic Logit-Normal(mu, sigma), +# not a raw-sample empirical CDF, so it needs no population-wide theta +# reference — mu/sigma already update smoothly with SVI regardless of which +# genotypes are in the current batch. See empirical.py for the contrasting case. +NEEDS_FULL_POPULATION_THETA = False + def get_extract_specs(ctx): lam_df = pd.DataFrame({"parameter": ["lam"], "map_all": [0]}) diff --git a/src/tfscreen/tfmodel/generative/components/transformation/single.py b/src/tfscreen/tfmodel/generative/components/transformation/single.py index 205c14b4..00ef8c1e 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/single.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/single.py @@ -32,11 +32,16 @@ def guide(name: str, def update_thetas(theta, params, mask=None): """ Pass-through update_thetas for single transformation. - + Returns theta unchanged. """ return theta + +# No congression correction is applied at all in single-plasmid mode, so +# there is nothing that needs a population-wide theta reference. +NEEDS_FULL_POPULATION_THETA = False + def get_hyperparameters(): """ No hyperparameters for single transformation. diff --git a/src/tfscreen/tfmodel/generative/model.py b/src/tfscreen/tfmodel/generative/model.py index 10860140..820649e1 100644 --- a/src/tfscreen/tfmodel/generative/model.py +++ b/src/tfscreen/tfmodel/generative/model.py @@ -78,7 +78,8 @@ def jax_model(data: DataClass, ln_cfu0_model = control["ln_cfu0"] activity_model = control["activity"] dk_geno_model = control["dk_geno"] - transformation_model, transformation_update = control["transformation"] + transformation_model, transformation_update, transformation_needs_population = \ + control["transformation"] theta_growth_noise_model = control["theta_growth_noise"] theta_rescale = control["theta_rescale"] growth_transition_model = control["growth_transition"] @@ -144,9 +145,45 @@ def jax_model(data: DataClass, # theta_growth shape: (..., titrant_name, titrant_conc, geno) or scattered # Result broadcasts to interaction of (rep, pre) and (titrant) # Parameters passed as tuple - corr_theta_growth = transformation_update(theta_growth, - params=trans_params, - mask=data.growth.congression_mask) + if transformation_needs_population: + # The congression correction's background CDF must be estimated from + # the full genotype population, not whatever subset of genotypes is + # active in this particular forward pass (a training minibatch, or a + # handful of genotypes requested at prediction time) — see + # transformation/_congression.py::update_thetas. When the caller + # hasn't supplied one explicitly (data.growth.external_theta_population), + # compute it locally by re-running calc_theta over every genotype. + # This is only correct when data.growth already spans the full + # population, which holds during SVI training (genotype minibatching + # never shrinks data.growth.num_genotype — see tensors/batch.py) but + # NOT for prediction code paths that subset genotypes; those must + # supply external_theta_population themselves. + if data.growth.external_theta_population is not None: + population_theta_growth = data.growth.external_theta_population + else: + # Deliberately leave scatter_theta untouched (rather than forcing + # it to 0) so population_theta_growth's leading (non-genotype) + # dimensions match theta_growth's exactly -- update_thetas relies + # on that alignment when broadcasting the correction back onto + # theta_growth's shape. + num_genotype = data.growth.num_genotype + full_population_idx = jnp.arange(num_genotype) + full_population_data = data.growth.replace( + batch_idx=full_population_idx, + geno_theta_idx=full_population_idx, + ) + population_theta_growth = calc_theta(theta, full_population_data) + + corr_theta_growth = transformation_update( + theta_growth, + params=trans_params, + mask=data.growth.congression_mask, + population_theta=population_theta_growth, + ) + else: + corr_theta_growth = transformation_update(theta_growth, + params=trans_params, + mask=data.growth.congression_mask) noisy_theta_growth = theta_growth_noise_model("theta_growth_noise", corr_theta_growth, diff --git a/src/tfscreen/tfmodel/inference/run_inference.py b/src/tfscreen/tfmodel/inference/run_inference.py index 1a210f38..b8e36293 100644 --- a/src/tfscreen/tfmodel/inference/run_inference.py +++ b/src/tfscreen/tfmodel/inference/run_inference.py @@ -409,10 +409,16 @@ def _get_genotype_dim_map(self): if site["type"] not in ["sample", "deterministic"]: continue - # Check plate stack first (most robust) + # Check plate stack first (most robust). Require the plate size to + # match the main genotype count (probe_size or full num_genotype) so + # that subset plates — e.g. the binding-observer's genotype plate, + # which covers only calibration genotypes — are not mistaken for the + # main genotype plate. + num_genotype = self.model.data.num_genotype in_plate = False for frame in site.get("cond_indep_stack", []): - if "genotype" in frame.name.lower(): + if ("genotype" in frame.name.lower() + and frame.size in (probe_size, num_genotype)): dim_map[name] = frame.dim in_plate = True break @@ -442,6 +448,133 @@ def _get_genotype_dim_map(self): return dim_map + @staticmethod + def _genotype_chunk_indices(total_num_genotypes, forward_batch_size): + """ + Build a (num_chunks, forward_batch_size) array of genotype indices + covering ``total_num_genotypes``, padding the final chunk (if + ``total_num_genotypes`` is not evenly divisible) by repeating the + last valid genotype index. Padding is trimmed back off after the + forward pass by :meth:`_merge_scan_chunks`, so the duplicated rows + never reach the caller. + + Returns + ------- + jnp.ndarray, shape (num_chunks, forward_batch_size) + """ + num_chunks = -(-total_num_genotypes // forward_batch_size) + padded_total = num_chunks * forward_batch_size + idx = jnp.arange(total_num_genotypes) + pad = padded_total - total_num_genotypes + if pad > 0: + pad_idx = jnp.full((pad,), total_num_genotypes - 1, dtype=idx.dtype) + idx = jnp.concatenate([idx, pad_idx]) + return idx.reshape(num_chunks, forward_batch_size) + + @staticmethod + def _merge_scan_chunks(stacked, axis, total_size): + """ + Collapse the leading chunk axis produced by `lax.scan` back into the + genotype axis it was sliced from, restoring genotype order and + trimming any padding added by :meth:`_genotype_chunk_indices`. + + ``stacked`` has shape ``(num_chunks, *per_chunk_shape)`` where + ``per_chunk_shape`` has the genotype axis at position ``axis`` + (possibly negative, as returned by ``_get_genotype_dim_map``). The + chunk axis is moved to sit immediately before the genotype axis (so + that flattening reproduces chunk-major, i.e. genotype-index, order + matching how `_genotype_chunk_indices` laid out the index blocks), + then merged via reshape and trimmed to ``total_size``. + + Parameters + ---------- + stacked : jnp.ndarray + Per-chunk results stacked along a new leading axis by `lax.scan`. + axis : int + Genotype-axis position within a single chunk's shape (i.e. as + given by ``dim_map``, *not* accounting for the leading chunk + axis). + total_size : int + True (unpadded) number of genotypes to trim down to. + + Returns + ------- + jnp.ndarray + Array with the chunk axis removed and the genotype axis + restored to length ``total_size`` at its original position. + """ + per_chunk_ndim = stacked.ndim - 1 + pos_axis = axis if axis >= 0 else per_chunk_ndim + axis + + moved = jnp.moveaxis(stacked, 0, pos_axis) + shape = moved.shape + new_shape = ( + shape[:pos_axis] + + (shape[pos_axis] * shape[pos_axis + 1],) + + shape[pos_axis + 2:] + ) + merged = moved.reshape(new_shape) + return jax.lax.slice_in_dim(merged, 0, total_size, axis=pos_axis) + + def _build_genotype_chunk_scanner(self, dim_map, sites_to_save): + """ + Compile a `lax.scan`-based forward pass over genotype chunks. + + Replaces the old per-chunk Python loop, which rebuilt a + `Predictive` object and re-traced the model on every iteration + (~39k times for a 200k-genotype dataset at default batch sizes). + Here the chunk body is traced once and compiled into a single + `lax.scan`, mirroring the on-device loop `run_optimization` already + uses for the SVI update step (`fast_scan`). The returned function is + built once per `get_posteriors` call and reused across every + posterior sampling batch, so only the first call pays tracing cost. + + Parameters + ---------- + dim_map : dict + Site name -> genotype-axis index, as returned by + `_get_genotype_dim_map`. + sites_to_save : list of str or None + If given, restricts the merged per-chunk output to these sites. + + Returns + ------- + callable + ``scan_fn(data, latents, key, indices_2d) -> (final_key, stacked)`` + where ``stacked`` is a dict of site name -> array with an extra + leading chunk axis (to be collapsed by `_merge_scan_chunks`). + """ + model_fn = self.model.jax_model + get_batch = self.model.get_batch + priors = self.model.priors + + def chunk_fn(data, latents, key, batch_indices): + batch_latents = { + k: jnp.take(v, batch_indices, axis=dim_map[k]) if k in dim_map else v + for k, v in latents.items() + } + batch_data = get_batch(data, batch_indices) + + key, subkey = jax.random.split(key) + forward_sampler = Predictive(model_fn, posterior_samples=batch_latents) + batch_pred = forward_sampler(subkey, priors=priors, data=batch_data) + + # Predictions take precedence over latents of the same name, + # matching the original collection order (predictions first, + # latents only added if not already present). + merged = dict(batch_latents) + merged.update(batch_pred) + if sites_to_save is not None: + merged = {k: v for k, v in merged.items() if k in sites_to_save} + + return key, merged + + @jax.jit + def scan_fn(data, latents, key, indices_2d): + return jax.lax.scan(partial(chunk_fn, data, latents), key, indices_2d) + + return scan_fn + def get_posteriors(self, svi, svi_state, @@ -455,7 +588,10 @@ def get_posteriors(self, Uses `numpyro.infer.Predictive` to sample from the posterior distribution defined by the guide and parameters. Handles large - datasets by batching predictions and writing to disk (HDF5). + datasets by batching predictions and writing to disk (HDF5). The + forward pass over genotype batches runs as a single compiled + `lax.scan` (see `_build_genotype_chunk_scanner`) rather than a + Python loop that reconstructs `Predictive` once per chunk. Parameters ---------- @@ -485,7 +621,7 @@ def get_posteriors(self, # Get the mapping of site names to genotype dimension dim_map = self._get_genotype_dim_map() - total_num_genotypes = self.model.data.num_genotype + total_num_genotypes = self.model.data.num_genotype # Adjust sampling_batch_size if smaller than num_posterior_samples sampling_batch_size = min(sampling_batch_size, num_posterior_samples) @@ -499,9 +635,15 @@ def get_posteriors(self, params=params, num_samples=sampling_batch_size) + # Build the genotype-chunk index blocks and the compiled forward + # scanner once; both are reused, unchanged, across every posterior + # sampling batch below. + indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) + scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + # Prepare HDF5 file h5_file = f"{out_prefix}_posterior.h5" - + samples_written = 0 with h5py.File(h5_file, 'w') as hf: @@ -513,70 +655,33 @@ def get_posteriors(self, priors=self.model.priors, data=full_data) - # Sample batches of genotypes - batch_collector = {} - for start_idx in range(0, total_num_genotypes, forward_batch_size): - - end_idx = min(start_idx + forward_batch_size, total_num_genotypes) - batch_indices = jnp.arange(start_idx, end_idx) - - # Slice latent samples using the dim_map - batch_latents = {} - for k, v in latent_samples.items(): - if k in dim_map: - batch_latents[k] = jnp.take(v, jnp.arange(start_idx, end_idx), axis=dim_map[k]) - else: - batch_latents[k] = v - - # Get a batch of data - batch_data = self.model.get_batch(data_on_gpu, batch_indices) - - # Forward pass for this batch - forward_sampler = Predictive(self.model.jax_model, - posterior_samples=batch_latents) - sample_key = self.get_key() - batch_pred = forward_sampler(sample_key, - priors=self.model.priors, - data=batch_data) - - # Collect all samples (latents + predictions) for this batch - # Predictions from forward pass - for k, v in batch_pred.items(): - if sites_to_save is not None and k not in sites_to_save: - continue - if k not in batch_collector: - batch_collector[k] = [] - batch_collector[k].append(jax.device_get(v)) - - # Latents that weren't in predictions (e.g. guide-only parameters) - for k, v in batch_latents.items(): - if k in batch_pred: - continue - if sites_to_save is not None and k not in sites_to_save: - continue - - if k not in batch_collector: - batch_collector[k] = [] - - # If global (not in dim_map), only add on first genotype batch - if k not in dim_map: - if start_idx == 0: - batch_collector[k].append(jax.device_get(v)) - else: - # Geno-specific, always add - batch_collector[k].append(jax.device_get(v)) - - # Concatenate genotype batches for this latent batch + # Forward pass over all genotype chunks in one compiled scan + forward_key = self.get_key() + _, stacked = scan_fn(data_on_gpu, latent_samples, forward_key, indices_2d) + + # Collapse the chunk axis back into genotype order; global + # (non-dim_map) sites are identical across chunks, so just + # take the first chunk's value. this_batch_results = {} - for k, v_list in batch_collector.items(): + for k, v in stacked.items(): if k in dim_map: - # Concatenate along the genotype dimension (same as originally traced) - axis = dim_map[k] - this_batch_results[k] = np.concatenate(v_list, axis=axis) + this_batch_results[k] = np.asarray( + self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + ) else: - # Global parameter, just take the first (and only) entry - this_batch_results[k] = v_list[0] - + this_batch_results[k] = np.asarray(v[0]) + + # latent_sampler always draws a full sampling_batch_size of + # samples (fixed at construction); trim the final batch down + # to the number of samples actually still needed when + # num_posterior_samples isn't evenly divisible by + # sampling_batch_size. + this_batch_size = min(sampling_batch_size, + num_posterior_samples - samples_written) + this_batch_results = { + k: v[:this_batch_size] for k, v in this_batch_results.items() + } + # Write to file batch_size_actual = next(iter(this_batch_results.values())).shape[0] for k, v in this_batch_results.items(): @@ -594,7 +699,7 @@ def get_posteriors(self, # Add metadata to HDF5 file hf.attrs["num_samples"] = samples_written - + # Force flush to disk to avoid read issues on cluster file systems hf.flush() @@ -1404,6 +1509,12 @@ def pe_fn(flat_p): sampling_batch_size = min(sampling_batch_size, num_posterior_samples) num_latent_batches = -(-num_posterior_samples // sampling_batch_size) + # Build the genotype-chunk index blocks and the compiled forward + # scanner once; both are reused, unchanged, across every posterior + # sampling batch below (see get_posteriors / _build_genotype_chunk_scanner). + indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) + scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + h5_file = f"{out_prefix}_posterior.h5" samples_written = 0 @@ -1431,50 +1542,18 @@ def pe_fn(flat_p): for k, v in batch_unconstrained.items() } - # Forward pass in genotype batches, mirroring get_posteriors - batch_collector = {} - for start_idx in range(0, total_num_genotypes, forward_batch_size): - - end_idx = min(start_idx + forward_batch_size, total_num_genotypes) - batch_indices = jnp.arange(start_idx, end_idx) - - batch_latents = { - k: jnp.take(v, batch_indices, axis=dim_map[k]) - if k in dim_map else v - for k, v in latent_samples.items() - } - - batch_data = self.model.get_batch(data_on_gpu, batch_indices) - forward_sampler = Predictive(self.model.jax_model, - posterior_samples=batch_latents) - pred_key = self.get_key() - batch_pred = forward_sampler(pred_key, - priors=self.model.priors, - data=batch_data) - - for k, v in batch_pred.items(): - if sites_to_save is not None and k not in sites_to_save: - continue - batch_collector.setdefault(k, []).append(jax.device_get(v)) + # Forward pass over all genotype chunks in one compiled scan + forward_key = self.get_key() + _, stacked = scan_fn(data_on_gpu, latent_samples, forward_key, indices_2d) - for k, v in batch_latents.items(): - if k in batch_pred: - continue - if sites_to_save is not None and k not in sites_to_save: - continue - if k not in dim_map: - if start_idx == 0: - batch_collector.setdefault(k, []).append(jax.device_get(v)) - else: - batch_collector.setdefault(k, []).append(jax.device_get(v)) - - # Concatenate genotype batches this_batch = {} - for k, v_list in batch_collector.items(): + for k, v in stacked.items(): if k in dim_map: - this_batch[k] = np.concatenate(v_list, axis=dim_map[k]) + this_batch[k] = np.asarray( + self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + ) else: - this_batch[k] = v_list[0] + this_batch[k] = np.asarray(v[0]) # Write to HDF5 batch_size_actual = next(iter(this_batch.values())).shape[0] @@ -1529,51 +1608,22 @@ def get_nuts_posteriors(self, h5_file = f"{out_prefix}_posterior.h5" - # Forward pass in genotype batches (all MCMC samples at once) - batch_collector = {} - for start_idx in tqdm(range(0, total_num_genotypes, forward_batch_size), - desc="computing posteriors"): - - end_idx = min(start_idx + forward_batch_size, total_num_genotypes) - batch_indices = jnp.arange(start_idx, end_idx) - - batch_latents = { - k: jnp.take(v, batch_indices, axis=dim_map[k]) - if k in dim_map else v - for k, v in mcmc_samples.items() - } + # Forward pass over all genotype chunks (all MCMC samples at once) + # in a single compiled scan instead of a Python loop that rebuilds + # `Predictive` per chunk (see get_posteriors / _build_genotype_chunk_scanner). + indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) + scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + forward_key = self.get_key() + _, stacked = scan_fn(data_on_gpu, mcmc_samples, forward_key, indices_2d) - batch_data = self.model.get_batch(data_on_gpu, batch_indices) - forward_sampler = Predictive(self.model.jax_model, - posterior_samples=batch_latents) - pred_key = self.get_key() - batch_pred = forward_sampler(pred_key, - priors=self.model.priors, - data=batch_data) - - for k, v in batch_pred.items(): - if sites_to_save is not None and k not in sites_to_save: - continue - batch_collector.setdefault(k, []).append(jax.device_get(v)) - - for k, v in batch_latents.items(): - if k in batch_pred: - continue - if sites_to_save is not None and k not in sites_to_save: - continue - if k not in dim_map: - if start_idx == 0: - batch_collector.setdefault(k, []).append(jax.device_get(v)) - else: - batch_collector.setdefault(k, []).append(jax.device_get(v)) - - # Concatenate genotype batches results = {} - for k, v_list in batch_collector.items(): + for k, v in stacked.items(): if k in dim_map: - results[k] = np.concatenate(v_list, axis=dim_map[k]) + results[k] = np.asarray( + self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + ) else: - results[k] = v_list[0] + results[k] = np.asarray(v[0]) with h5py.File(h5_file, "w") as hf: for k, v in results.items(): diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index ae454484..06038002 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -553,7 +553,66 @@ def _setup_batching(growth_genotypes, return out - +# Theta components that cannot yet supply a full-population theta reference +# for the "empirical" transformation's congression correction. Unlike +# hill_mut/hill_geno/thermo.*, which already assemble per-genotype parameters +# for the full library on every forward pass (batching only gathers a subset +# of an already-full-size ThetaParam), categorical_geno only ever samples +# batch_size-worth of per-genotype offsets per call. Wiring it up to +# "empirical" would silently reproduce the population-CDF bug the +# NEEDS_FULL_POPULATION_THETA mechanism exists to fix (see +# transformation/_congression.py and generative/model.py), rather than +# raising — so it's blocked explicitly here until categorical_geno gets its +# own full-population code path. +_THETA_MODELS_INCOMPATIBLE_WITH_EMPIRICAL = frozenset({"categorical_geno"}) + + +def _check_theta_transformation_compatibility(theta, transformation, binding_only=False): + """ + Raise a clear error for known theta/transformation combinations that + would silently produce incorrect results rather than failing loudly. + + Parameters + ---------- + theta : str + Name of the requested theta component (model_registry["theta"] key). + transformation : str + Name of the requested transformation component + (model_registry["transformation"] key). + binding_only : bool, optional + Whether the model is being built in binding-only mode. In that mode + jax_model returns before ever touching the transformation/congression + code path (see generative/model.py's early `if binding_only: ... + return`), so the transformation setting is inert and this check does + not apply. Default False. + + Raises + ------ + ValueError + If `transformation == "empirical"` and `theta` is a component that + cannot supply a full-population theta reference for the congression + correction, and the model is not binding-only. + """ + if binding_only: + return + + if (transformation == "empirical" + and theta in _THETA_MODELS_INCOMPATIBLE_WITH_EMPIRICAL): + raise ValueError( + f"theta='{theta}' is not compatible with transformation='empirical'. " + "The empirical congression correction requires a theta reference " + f"covering the full genotype population, but '{theta}' only ever " + "assembles theta for the genotypes in the current batch/request " + "(see categorical_geno.define_model's batch_size-scoped " + "logit_theta_offset plate). Using it with transformation='empirical' " + "would silently reproduce the population-CDF bug this check exists " + "to prevent, rather than raise. Use transformation='single' or " + "'logit_norm' with this theta model, or choose a theta component " + "that already assembles full-population parameters (hill_geno, " + "hill_mut, or a thermo.* component)." + ) + + class ModelOrchestrator: """ Manages the data wrangling and configuration for the JAX growth model. @@ -665,6 +724,10 @@ def __init__(self, self._thermo_data = thermo_data self._binding_weight = binding_weight + _check_theta_transformation_compatibility( + self._theta, self._transformation, binding_only=self._binding_only + ) + self._initialize_data() self._initialize_classes() @@ -1296,10 +1359,15 @@ def _initialize_classes(self): component_module.run_model, component_module.get_population_moments) elif key == "transformation": - main_control_kwargs[key] = (component_module.define_model, - component_module.update_thetas) - guide_control_kwargs[key] = (component_module.guide, - component_module.update_thetas) + needs_full_population = getattr( + component_module, "NEEDS_FULL_POPULATION_THETA", False + ) + main_control_kwargs[key] = (component_module.define_model, + component_module.update_thetas, + needs_full_population) + guide_control_kwargs[key] = (component_module.guide, + component_module.update_thetas, + needs_full_population) elif key == "condition_growth": main_control_kwargs[key] = component_module.define_model guide_control_kwargs[key] = component_module.guide diff --git a/src/tfscreen/tfmodel/scripts/fit_model_cli.py b/src/tfscreen/tfmodel/scripts/fit_model_cli.py index 15c505bf..5440ed13 100644 --- a/src/tfscreen/tfmodel/scripts/fit_model_cli.py +++ b/src/tfscreen/tfmodel/scripts/fit_model_cli.py @@ -451,6 +451,9 @@ def fit_model(config_file, adam_final_step_size=adam_final_step_size, adam_clip_norm=adam_clip_norm, elbo_num_particles=elbo_num_particles, + convergence_tolerance=convergence_tolerance, + convergence_window=convergence_window, + patience=patience, checkpoint_interval=pre_map_num_epoch, max_num_epochs=pre_map_num_epoch, init_param_jitter=0.0, diff --git a/src/tfscreen/tfmodel/scripts/predict_growth_cli.py b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py index e1dbd3c3..ebd44982 100644 --- a/src/tfscreen/tfmodel/scripts/predict_growth_cli.py +++ b/src/tfscreen/tfmodel/scripts/predict_growth_cli.py @@ -1,7 +1,9 @@ import pandas as pd from tfscreen.tfmodel.configuration_io import read_configuration from tfscreen.tfmodel.inference.checkpoint_io import resolve_param_file +from tfscreen.tfmodel.inference.posteriors import load_posteriors from tfscreen.tfmodel.analysis.prediction import predict +from tfscreen.tfmodel.analysis.batch_sizing import estimate_genotype_batch_size from tfscreen.util.cli import generalized_main, read_lines @@ -77,11 +79,12 @@ def predict_growth(config_file, Number of posterior samples to run through the model when computing quantiles. If None, all available samples are used. genotype_batch_size : int or None, optional - Maximum number of genotypes per predict() call. When set, the genotype - list is split into chunks of this size, each chunk is predicted - separately, and the results are concatenated. Reduces peak GPU memory - at the cost of one JAX re-compilation per batch. If None (default), all - genotypes are predicted in a single call. + Maximum number of genotypes per predict() call. The genotype list is + split into chunks of this size, each chunk is predicted separately, + and the results are concatenated. Reduces peak memory at the cost of + one JAX re-compilation per batch. If None (default), a batch size is + estimated automatically from the available device memory and the + per-genotype tensor cost; pass an explicit value to override. """ file_genotypes = read_lines(genotypes_file) if genotypes_file else [] titrant_names = read_lines(titrant_names_file) if titrant_names_file else None @@ -108,11 +111,25 @@ def predict_growth(config_file, training_concs = list(orchestrator.growth_df["titrant_conc"].unique()) titrant_concs = sorted(set(training_concs) | set(file_concs)) if file_concs else None - # When batching is requested and genotypes is still None (no file restriction), - # resolve the full list explicitly so it can be split into chunks. - if genotype_batch_size is not None and genotypes is None: + # Batching (manual or auto-sized) requires an explicit genotype list to + # split into chunks; resolve it when no file restriction narrowed it. + if genotypes is None: genotypes = list(orchestrator.growth_df["genotype"].unique()) + if genotype_batch_size is None: + _, resolved_posteriors = load_posteriors(param_file, q_to_get=None) + first_key = next(iter(resolved_posteriors.keys())) + total_available = resolved_posteriors[first_key].shape[0] + n_for_quantiles = (total_available if num_marginal_samples is None + else min(num_marginal_samples, total_available)) + genotype_batch_size = estimate_genotype_batch_size( + orchestrator, + predict_sites=["growth_pred"], + num_marginal_samples=n_for_quantiles, + ) + print(f"Auto-sized genotype_batch_size to {genotype_batch_size} " + f"genotypes based on available memory.", flush=True) + # Binding genotypes (those with direct theta_obs measurements) must appear # in every batch so the binding TensorManager is never empty. try: diff --git a/tests/smoke-tests/test_prediction_smoke.py b/tests/smoke-tests/test_prediction_smoke.py index 2000d69c..f5951fd9 100644 --- a/tests/smoke-tests/test_prediction_smoke.py +++ b/tests/smoke-tests/test_prediction_smoke.py @@ -84,11 +84,17 @@ def test_prediction_smoke(growth_smoke_csv, with pytest.raises(ValueError, match="is plated on .* and cannot be expanded"): # 4. Test categorical theta restriction (as requested) - # Create model with categorical theta + # Create model with categorical theta. transformation must be + # something other than the default "empirical": categorical_geno + # cannot supply the full-population theta reference "empirical" + # needs (see model_orchestrator._check_theta_transformation_compatibility), + # and that's a separate concern from the conc-expansion restriction + # this block is testing. model_cat = ModelOrchestrator( growth_df=growth_smoke_csv, binding_df=binding_smoke_csv, - theta="categorical_geno" + theta="categorical_geno", + transformation="logit_norm" ) # Generate a valid posterior file for model_cat diff --git a/tests/tfscreen/tfmodel/analysis/test_batch_sizing.py b/tests/tfscreen/tfmodel/analysis/test_batch_sizing.py new file mode 100644 index 00000000..68447daa --- /dev/null +++ b/tests/tfscreen/tfmodel/analysis/test_batch_sizing.py @@ -0,0 +1,171 @@ +import pytest +import pandas as pd + +from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator +from tfscreen.tfmodel.analysis.batch_sizing import ( + estimate_bytes_per_genotype, + get_available_memory_bytes, + estimate_genotype_batch_size, + _dtype_itemsize, +) + + +@pytest.fixture +def dummy_orchestrator(): + """Minimal ModelOrchestrator (2 genotypes) for tensor-shape inspection.""" + growth_df = pd.DataFrame({ + "library": ["lib"] * 4, + "genotype": ["wt", "wt", "M42V", "M42V"], + "titrant_name": ["tit1"] * 4, + "titrant_conc": [0.0, 1.0, 0.0, 1.0], + "condition_pre": ["pre-1"] * 4, + "condition_sel": ["sel+1"] * 4, + "t_pre": [10.0] * 4, + "t_sel": [0.0, 20.0, 0.0, 20.0], + "ln_cfu": [0.0, 5.0, 0.0, 3.0], + "ln_cfu_std": [0.1] * 4, + "replicate": [1, 1, 1, 1], + }) + binding_df = pd.DataFrame({ + "genotype": ["wt", "M42V"], + "titrant_name": ["tit1", "tit1"], + "titrant_conc": [0.5, 0.5], + "theta_obs": [0.5, 0.2], + "theta_std": [0.01, 0.01], + }) + return ModelOrchestrator(growth_df, binding_df) + + +class TestEstimateBytesPerGenotype: + """Unit tests for estimate_bytes_per_genotype.""" + + def test_matches_hand_computed_formula(self, dummy_orchestrator): + tensor_shape = dummy_orchestrator.growth_tm.tensor_shape + other_axes_product = 1 + for size in tensor_shape[:-1]: + other_axes_product *= size + + n_samples = 25 + predict_sites = ["growth_pred", "theta_growth_pred"] + result = estimate_bytes_per_genotype( + dummy_orchestrator, predict_sites, + num_marginal_samples=n_samples, + overhead_multiplier=1.0, + ) + expected = (other_axes_product * n_samples * len(predict_sites) + * _dtype_itemsize()) + assert result == pytest.approx(expected) + + def test_scales_with_overhead_multiplier(self, dummy_orchestrator): + base = estimate_bytes_per_genotype( + dummy_orchestrator, ["growth_pred"], + num_marginal_samples=10, overhead_multiplier=1.0, + ) + scaled = estimate_bytes_per_genotype( + dummy_orchestrator, ["growth_pred"], + num_marginal_samples=10, overhead_multiplier=3.0, + ) + assert scaled == pytest.approx(base * 3.0) + + def test_defaults_num_marginal_samples_to_one(self, dummy_orchestrator): + result = estimate_bytes_per_genotype( + dummy_orchestrator, ["growth_pred"], + num_marginal_samples=None, overhead_multiplier=1.0, + ) + expected = estimate_bytes_per_genotype( + dummy_orchestrator, ["growth_pred"], + num_marginal_samples=1, overhead_multiplier=1.0, + ) + assert result == pytest.approx(expected) + + def test_empty_predict_sites_treated_as_one_site(self, dummy_orchestrator): + result = estimate_bytes_per_genotype( + dummy_orchestrator, [], + num_marginal_samples=10, overhead_multiplier=1.0, + ) + expected = estimate_bytes_per_genotype( + dummy_orchestrator, ["growth_pred"], + num_marginal_samples=10, overhead_multiplier=1.0, + ) + assert result == pytest.approx(expected) + + +class _FakeDevice: + """Stand-in for a jax.Device exposing only memory_stats().""" + + def __init__(self, stats): + self._stats = stats + + def memory_stats(self): + return self._stats + + +class TestGetAvailableMemoryBytes: + """Unit tests for get_available_memory_bytes.""" + + def test_uses_bytes_limit_when_available(self, mocker): + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.jax.devices", + return_value=[_FakeDevice({"bytes_limit": 1_000_000_000})], + ) + result = get_available_memory_bytes(safety_fraction=0.5) + assert result == 500_000_000 + + def test_falls_back_to_system_memory_when_stats_none(self, mocker): + """CPU backend returns None from memory_stats(); must fall back.""" + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.jax.devices", + return_value=[_FakeDevice(None)], + ) + mocker.patch( + "os.sysconf", + side_effect=lambda name: {"SC_PAGE_SIZE": 4096, + "SC_PHYS_PAGES": 1000}[name], + ) + result = get_available_memory_bytes(safety_fraction=0.5) + assert result == int(4096 * 1000 * 0.5) + + def test_falls_back_when_bytes_limit_key_missing(self, mocker): + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.jax.devices", + return_value=[_FakeDevice({"peak_bytes_in_use": 123})], + ) + mocker.patch( + "os.sysconf", + side_effect=lambda name: {"SC_PAGE_SIZE": 4096, + "SC_PHYS_PAGES": 2000}[name], + ) + result = get_available_memory_bytes(safety_fraction=1.0) + assert result == 4096 * 2000 + + +class TestEstimateGenotypeBatchSize: + """Unit tests for estimate_genotype_batch_size.""" + + def test_batch_size_matches_budget_over_cost(self, dummy_orchestrator, mocker): + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.get_available_memory_bytes", + return_value=1_000_000, + ) + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.estimate_bytes_per_genotype", + return_value=10_000, + ) + result = estimate_genotype_batch_size( + dummy_orchestrator, ["growth_pred"], num_marginal_samples=10, + ) + assert result == 100 + + def test_clamped_to_at_least_one(self, dummy_orchestrator, mocker): + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.get_available_memory_bytes", + return_value=10, + ) + mocker.patch( + "tfscreen.tfmodel.analysis.batch_sizing.estimate_bytes_per_genotype", + return_value=10_000_000, + ) + result = estimate_genotype_batch_size( + dummy_orchestrator, ["growth_pred"], num_marginal_samples=10, + ) + assert result == 1 diff --git a/tests/tfscreen/tfmodel/analysis/test_prediction.py b/tests/tfscreen/tfmodel/analysis/test_prediction.py index 808f3db4..83f2dd8e 100644 --- a/tests/tfscreen/tfmodel/analysis/test_prediction.py +++ b/tests/tfscreen/tfmodel/analysis/test_prediction.py @@ -3,10 +3,17 @@ import numpy as np import jax.numpy as jnp import numpyro.distributions as dist +import warnings from unittest.mock import MagicMock, patch from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator -from tfscreen.tfmodel.analysis.prediction import copy_orchestrator, _convert_map_params, _align_site_to_tm_dims, predict +from tfscreen.tfmodel.analysis.prediction import ( + copy_orchestrator, + _convert_map_params, + _align_site_to_tm_dims, + _build_population_theta_reference, + predict, +) @pytest.fixture def dummy_orchestrator(): @@ -496,3 +503,184 @@ def __call__(self, rng_key, **kwargs): "calibration model) will be randomly re-sampled from the " "default prior, producing wildly incorrect predictions." ) + + +# --------------------------------------------------------------------------- +# _build_population_theta_reference +# --------------------------------------------------------------------------- + +class TestBuildPopulationThetaReference: + + def test_returns_none_and_warns_when_theta_growth_pred_missing(self): + """MAP checkpoints store guide params, not deterministic sites, so + theta_growth_pred won't be present -- must warn and return None + rather than raising, so predict() can still run (without the fix).""" + with pytest.warns(UserWarning, match="theta_growth_pred"): + result = _build_population_theta_reference({"some_other_param": np.zeros((5,))}) + assert result is None + + def test_reduces_across_sample_axis_via_median(self): + """With more samples than max_samples, the result must be the median + over only the first max_samples draws, with the sample axis removed.""" + # Shape (10, 2, 3): 10 samples, 2x3 spatial. + rng = np.random.default_rng(0) + theta_growth_pred = rng.uniform(size=(10, 2, 3)) + fake_posteriors = {"theta_growth_pred": theta_growth_pred} + + result = _build_population_theta_reference(fake_posteriors, max_samples=4) + + expected = np.median(theta_growth_pred[:4], axis=0) + assert result.shape == (2, 3) + assert jnp.allclose(result, expected) + + def test_uses_all_samples_when_fewer_than_max(self): + theta_growth_pred = np.arange(2 * 4).reshape(2, 4).astype(float) # (2 samples, 4 genotypes) + fake_posteriors = {"theta_growth_pred": theta_growth_pred} + + result = _build_population_theta_reference(fake_posteriors, max_samples=20) + + expected = np.median(theta_growth_pred, axis=0) + assert jnp.allclose(result, expected) + + +# --------------------------------------------------------------------------- +# predict() threading of the population reference through genotype subsets +# --------------------------------------------------------------------------- + +class TestPredictPopulationReferenceThreading: + """ + Verify predict() builds a full-population theta reference and threads it + into pred_data whenever the configured transformation needs one (see + generative/model.py / transformation/_congression.py), and that a + genotype-subset request still gets a reference sized to the *true* full + population, not the requested subset -- this is the core mechanism that + fixes the wt/congression bug (predict() previously only ever saw whatever + genotype subset was requested). + """ + + def _capture_pred_data(self, mocker): + """Patch Predictive to record the `data` kwarg passed to it, without + changing its behavior.""" + captured = {} + real_predictive_class = __import__( + "numpyro.infer", fromlist=["Predictive"] + ).Predictive + + class CapturingPredictive: + def __init__(self, *args, **kwargs): + self._inner = real_predictive_class(*args, **kwargs) + + def __call__(self, rng_key, **kwargs): + captured["data"] = kwargs.get("data") + return self._inner(rng_key, **kwargs) + + mocker.patch( + "tfscreen.tfmodel.analysis.prediction.Predictive", + CapturingPredictive, + ) + return captured + + def _fake_posteriors_with_theta_growth_pred(self, orchestrator): + """Build a 1-sample fake posterior dict covering every latent sample + site (as in TestPredictPriorsPropagate) plus the theta_growth_pred + deterministic site, so _build_population_theta_reference has + something to read.""" + from numpyro.handlers import seed, trace as nptrace + + seeded = seed(orchestrator.jax_model, rng_seed=0) + model_tr = nptrace(seeded).get_trace( + data=orchestrator.data, + priors=orchestrator.priors, + ) + fake_posteriors = { + name: np.zeros((1,) + site["value"].shape) + for name, site in model_tr.items() + if site["type"] == "sample" and not site.get("is_observed", False) + } + fake_posteriors["theta_growth_pred"] = np.asarray( + model_tr["theta_growth_pred"]["value"] + )[np.newaxis, ...] + return fake_posteriors + + def test_genotype_subset_still_gets_full_population_sized_reference( + self, dummy_orchestrator, mocker): + """dummy_orchestrator defaults to theta='hill_geno', + transformation='empirical' (NEEDS_FULL_POPULATION_THETA=True). + Requesting a single genotype must still populate + pred_data.growth.external_theta_population with the FULL genotype + count (2 in this fixture), not 1.""" + fake_posteriors = self._fake_posteriors_with_theta_growth_pred(dummy_orchestrator) + captured = self._capture_pred_data(mocker) + + predict( + dummy_orchestrator, + fake_posteriors, + predict_sites=["growth_pred"], + num_samples=None, + genotypes=["wt"], + ) + + pred_data = captured["data"] + assert pred_data is not None + population = pred_data.growth.external_theta_population + assert population is not None + + true_num_genotype = dummy_orchestrator.data.growth.num_genotype + assert population.shape[-1] == true_num_genotype + assert true_num_genotype > 1, ( + "fixture must have more than one genotype for this test to be meaningful" + ) + + def test_no_population_reference_when_transformation_does_not_need_one( + self, mocker): + """With transformation='single' (NEEDS_FULL_POPULATION_THETA=False), + predict() must not build or thread a population reference at all -- + pred_data.growth.external_theta_population must stay None, and no + 'theta_growth_pred not found' warning should fire even when it truly + isn't in the posterior dict.""" + 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], + "condition_pre": ["pre-1", "pre-1", "pre-1", "pre-1"], + "condition_sel": ["sel+1", "sel+1", "sel+1", "sel+1"], + "t_pre": [10.0, 10.0, 10.0, 10.0], + "t_sel": [0.0, 20.0, 0.0, 20.0], + "ln_cfu": [0.0, 5.0, 0.0, 3.0], + "ln_cfu_std": [0.1, 0.1, 0.1, 0.1], + "replicate": [1, 1, 1, 1], + }) + binding_df = pd.DataFrame({ + "genotype": ["wt", "M42V"], + "titrant_name": ["tit1", "tit1"], + "titrant_conc": [0.5, 0.5], + "theta_obs": [0.5, 0.2], + "theta_std": [0.01, 0.01], + }) + single_orchestrator = ModelOrchestrator(growth_df, binding_df, transformation="single") + + from numpyro.handlers import seed, trace as nptrace + seeded = seed(single_orchestrator.jax_model, rng_seed=0) + model_tr = nptrace(seeded).get_trace( + data=single_orchestrator.data, priors=single_orchestrator.priors, + ) + fake_posteriors = { + name: np.zeros((1,) + site["value"].shape) + for name, site in model_tr.items() + if site["type"] == "sample" and not site.get("is_observed", False) + } + + captured = self._capture_pred_data(mocker) + + with warnings.catch_warnings(): + warnings.simplefilter("error") + predict( + single_orchestrator, + fake_posteriors, + predict_sites=["growth_pred"], + num_samples=None, + genotypes=["wt"], + ) + + assert captured["data"].growth.external_theta_population is None diff --git a/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py b/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py new file mode 100644 index 00000000..ea2f15c0 --- /dev/null +++ b/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py @@ -0,0 +1,154 @@ +""" +Cross-component API-contract test for theta components used with +transformation="empirical". + +The congression correction (transformation/_congression.py) needs a theta +reference covering the *full* genotype population, not just whatever +genotypes are active in the current forward pass. generative/model.py +gets this "for free" for hill_mut, hill_geno, and the thermo.* components by +re-calling run_model with batch_idx = geno_theta_idx = arange(num_genotype) +against the already-full-size ThetaParam these components assemble in +define_model/guide (see model_orchestrator._THETA_MODELS_INCOMPATIBLE_WITH_EMPIRICAL +and model_orchestrator._check_theta_transformation_compatibility for the one +component, categorical_geno, that does not yet satisfy this contract and is +rejected outright rather than silently mishandled). + +This test locks in the contract for the components that DO support it: +run_model(theta_param, subset_data) must equal +run_model(theta_param, full_population_data)[..., subset_positions] whenever +subset_data.batch_idx is an arbitrary (non-prefix, reordered) selection of +genotypes and subset_data.geno_theta_idx = arange(len(batch_idx)) — the +convention tensors.batch.get_batch() always produces. + +thermo.* components are intentionally NOT covered here — see the separate +follow-up investigating a suspected pre-existing batch_idx-composition bug +in their run_model. +""" +from collections import namedtuple + +import jax.numpy as jnp +import pytest +from numpyro.handlers import substitute + +from tfscreen.tfmodel.generative.components.theta import hill_mut, hill_geno +from tfscreen.genetics.build_mut_geno_matrix import build_mut_sparse_indices + + +# --------------------------------------------------------------------------- +# hill_mut +# --------------------------------------------------------------------------- + +_HillMutData = namedtuple("_HillMutData", [ + "num_titrant_name", "num_titrant_conc", "num_genotype", "log_titrant_conc", + "geno_theta_idx", "scatter_theta", "num_mutation", "num_pair", + "mut_geno_matrix", "mut_nnz_mut_idx", "mut_nnz_geno_idx", + "pair_nnz_pair_idx", "pair_nnz_geno_idx", "batch_idx", +]) + + +def _hill_mut_full_data(): + """6 genotypes: wt(0), 4 single mutants(1-4), 1 double mutant(5).""" + num_genotype = 6 + mut_geno = jnp.array([ + [0, 1, 0, 0, 0, 1], # mutation A present in genotypes 1, 5 + [0, 0, 1, 0, 0, 0], # mutation B present in genotype 2 + [0, 0, 0, 1, 0, 0], # mutation C present in genotype 3 + [0, 0, 0, 0, 1, 1], # mutation D present in genotypes 4, 5 + ], dtype=float) + mut_nnz_mut_idx, mut_nnz_geno_idx = build_mut_sparse_indices(mut_geno) + + return _HillMutData( + num_titrant_name=1, + num_titrant_conc=4, + num_genotype=num_genotype, + log_titrant_conc=jnp.linspace(-6, 2, 4), + geno_theta_idx=jnp.arange(num_genotype, dtype=jnp.int32), + scatter_theta=0, + num_mutation=4, + num_pair=0, + mut_geno_matrix=mut_geno, + mut_nnz_mut_idx=mut_nnz_mut_idx, + mut_nnz_geno_idx=mut_nnz_geno_idx, + pair_nnz_pair_idx=jnp.zeros(0, dtype=jnp.int32), + pair_nnz_geno_idx=jnp.zeros(0, dtype=jnp.int32), + batch_idx=jnp.arange(num_genotype, dtype=jnp.int32), + ) + + +def test_hill_mut_subset_matches_full_population_indexed_down(): + full_data = _hill_mut_full_data() + name = "theta" + priors = hill_mut.get_priors() + guesses = hill_mut.get_guesses(name, full_data) + # Non-zero, non-symmetric offsets so genotypes are genuinely distinguishable. + guesses[f"{name}_d_logit_low_offset"] = jnp.array([[0.8, -1.2, 0.3, -0.5]]) + guesses[f"{name}_sigma_d_logit_low"] = jnp.ones(1) + + theta_param = substitute(hill_mut.define_model, data=guesses)( + name=name, data=full_data, priors=priors) + + # Full population (identity batch/geno_theta indices). + theta_full = hill_mut.run_model(theta_param, full_data) # (T, C, 6) + + # A deliberately non-trivial (reordered, non-prefix) subset: genotypes + # 4, 1, 5 in that order — exactly what get_batch() would produce for + # idx=[4, 1, 5] (batch_idx=idx, geno_theta_idx=arange(3)). + subset_global_idx = jnp.array([4, 1, 5], dtype=jnp.int32) + subset_data = full_data._replace( + batch_idx=subset_global_idx, + geno_theta_idx=jnp.arange(len(subset_global_idx), dtype=jnp.int32), + ) + theta_subset = hill_mut.run_model(theta_param, subset_data) # (T, C, 3) + + expected = theta_full[:, :, subset_global_idx] + assert jnp.allclose(theta_subset, expected) + + +# --------------------------------------------------------------------------- +# hill_geno +# --------------------------------------------------------------------------- + +_HillGenoData = namedtuple("_HillGenoData", [ + "num_titrant_name", "num_titrant_conc", "num_genotype", "batch_size", + "batch_idx", "scale_vector", "log_titrant_conc", "geno_theta_idx", + "scatter_theta", +]) + + +def _hill_geno_full_data(): + num_genotype = 5 + return _HillGenoData( + num_titrant_name=1, + num_titrant_conc=3, + num_genotype=num_genotype, + batch_size=num_genotype, + batch_idx=jnp.arange(num_genotype, dtype=jnp.int32), + scale_vector=jnp.ones(num_genotype, dtype=float), + log_titrant_conc=jnp.linspace(-5, 5, 3), + geno_theta_idx=jnp.arange(num_genotype, dtype=jnp.int32), + scatter_theta=0, + ) + + +def test_hill_geno_subset_matches_full_population_indexed_down(): + full_data = _hill_geno_full_data() + name = "theta" + priors = hill_geno.get_priors() + guesses = hill_geno.get_guesses(name, full_data) + # Non-zero, non-symmetric offsets so genotypes are genuinely distinguishable. + guesses[f"{name}_logit_low_offset"] = jnp.array([[0.5, -0.3, 1.1, -0.9, 0.2]]) + + theta_param = substitute(hill_geno.define_model, data=guesses)( + name=name, data=full_data, priors=priors) + + theta_full = hill_geno.run_model(theta_param, full_data) # (T, C, 5) + + subset_global_idx = jnp.array([3, 0, 4], dtype=jnp.int32) + subset_data = full_data._replace( + batch_idx=subset_global_idx, + geno_theta_idx=jnp.arange(len(subset_global_idx), dtype=jnp.int32), + ) + theta_subset = hill_geno.run_model(theta_param, subset_data) # (T, C, 3) + + expected = theta_full[:, :, subset_global_idx] + assert jnp.allclose(theta_subset, expected) diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py b/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py index e856627d..a7e567d6 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py @@ -113,6 +113,82 @@ def test_update_thetas_empirical_values(): assert jnp.all(res >= theta - 1e-6) +# ------------------------------------------------------------------------- +# population_theta: population-wide background CDF for empirical mode +# ------------------------------------------------------------------------- + +def test_update_thetas_population_theta_defaults_to_theta(): + """Omitting population_theta must reproduce the pre-existing behaviour of + building the background CDF from theta itself (backward compatibility).""" + theta = jnp.array([[0.1, 0.5, 0.9]]) + lam = 1.0 + params = (lam,) + + res_default = transformation_congression.update_thetas( + theta, params=params, theta_dist="empirical") + res_explicit_none = transformation_congression.update_thetas( + theta, params=params, theta_dist="empirical", population_theta=None) + + assert jnp.allclose(res_default, res_explicit_none) + + +def test_update_thetas_population_theta_changes_correction(): + """A population_theta that differs from theta must change the correction: + the empirical CDF (and hence the congression-corrected values) should + reflect where theta falls in the *population*, not in itself.""" + theta = jnp.array([[0.5, 0.5, 0.5]]) + lam = 1.0 + params = (lam,) + + # theta is smack in the middle of a population that is itself centered + # at 0.5 -> minimal correction expected either way, so use an asymmetric + # population instead: one where 0.5 sits near the *bottom* of the range. + low_population = jnp.array([[0.4, 0.45, 0.5, 0.9, 0.95]]) + high_population = jnp.array([[0.05, 0.1, 0.5, 0.55, 0.6]]) + + res_low_pop = transformation_congression.update_thetas( + theta, params=params, theta_dist="empirical", population_theta=low_population) + res_high_pop = transformation_congression.update_thetas( + theta, params=params, theta_dist="empirical", population_theta=high_population) + + # Same theta, different reference populations -> different corrections. + assert not jnp.allclose(res_low_pop, res_high_pop) + + +def test_update_thetas_population_theta_uses_own_shape_for_lambda_broadcast(): + """population_theta may have a different (larger) trailing genotype + dimension than theta; the correction must still broadcast to theta's + shape without error, using population_theta's leading dims for lambda.""" + theta = jnp.array([[0.2, 0.8]]) # (1, 2) — the "batch" being corrected + population_theta = jnp.linspace(0.0, 1.0, 50).reshape(1, 50) # (1, 50) — full population + lam = 1.0 + params = (lam,) + + res = transformation_congression.update_thetas( + theta, params=params, theta_dist="empirical", population_theta=population_theta) + + assert res.shape == theta.shape + assert jnp.all(jnp.isfinite(res)) + + +def test_update_thetas_population_theta_ignored_for_logit_norm(): + """population_theta must be a no-op for logit_norm mode, which uses the + smooth analytic (mu, sigma) CDF rather than raw samples.""" + theta = jnp.array([[0.1, 0.5, 0.9]]) + lam = 1.0 + mu = jnp.array([[0.0]]) + sigma = jnp.array([[1.0]]) + params = (lam, mu, sigma) + + res_without = transformation_congression.update_thetas( + theta, params=params, theta_dist="logit_norm") + res_with = transformation_congression.update_thetas( + theta, params=params, theta_dist="logit_norm", + population_theta=jnp.array([[0.99, 0.99, 0.99]])) + + assert jnp.allclose(res_without, res_with) + + # ------------------------------------------------------------------------- # Model Interface # ------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py index 45c0daed..25453f07 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py @@ -12,6 +12,12 @@ def test_get_hyperparameters_mode(): assert params["mode"] == "empirical" +def test_needs_full_population_theta_flag(): + """Empirical mode's background CDF is built from raw genotype samples, so + it must request a population-wide theta reference from jax_model.""" + assert empirical.NEEDS_FULL_POPULATION_THETA is True + + def test_get_priors_mode(): priors = empirical.get_priors() assert isinstance(priors, congression.ModelPriors) diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py index 687c35b6..881e5678 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py @@ -13,6 +13,12 @@ def test_get_hyperparameters_mode(): assert params["mode"] == "logit_norm" +def test_needs_full_population_theta_flag(): + """logit_norm's background CDF is the smooth analytic (mu, sigma) family, + not raw samples, so it must not request a population-wide theta reference.""" + assert logit_norm.NEEDS_FULL_POPULATION_THETA is False + + def test_get_priors_mode(): priors = logit_norm.get_priors() assert isinstance(priors, congression.ModelPriors) diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test_single.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_single.py index fc553f15..8d13b492 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test_single.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test_single.py @@ -44,3 +44,9 @@ def test_update_thetas(): # With different params res2 = transformation_single.update_thetas(theta, params=(100.0, 5.0, 0.1)) assert jnp.array_equal(res2, theta) + + +def test_needs_full_population_theta_flag(): + """Single-plasmid mode applies no congression correction at all, so it + must not request a population-wide theta reference.""" + assert transformation_single.NEEDS_FULL_POPULATION_THETA is False diff --git a/tests/tfscreen/tfmodel/generative/test_model.py b/tests/tfscreen/tfmodel/generative/test_model.py index 5c22a159..8025f09c 100644 --- a/tests/tfscreen/tfmodel/generative/test_model.py +++ b/tests/tfscreen/tfmodel/generative/test_model.py @@ -15,7 +15,17 @@ # --- Mocks --- # Define minimal mocks for the nested data structures -MockGrowthData = namedtuple("MockGrowthData", ["t_pre", "t_sel", "congression_mask"]) +class MockGrowthData(namedtuple("MockGrowthData", [ + "t_pre", "t_sel", "congression_mask", "num_genotype", + "external_theta_population", "batch_idx", "geno_theta_idx", + "scatter_theta"])): + """Namedtuple with a flax-struct-like ``.replace()`` for exercising the + full-population congression branch in jax_model without a real GrowthData.""" + + def replace(self, **kwargs): + return self._replace(**kwargs) + + MockBindingData = namedtuple("MockBindingData", []) MockData = namedtuple("MockData", ["growth", "binding"]) @@ -34,7 +44,16 @@ def mock_data(): t_pre = jnp.array(2.0) t_sel = jnp.array(3.0) - growth = MockGrowthData(t_pre=t_pre, t_sel=t_sel, congression_mask="mock_mask") + growth = MockGrowthData( + t_pre=t_pre, t_sel=t_sel, congression_mask="mock_mask", + num_genotype=1, external_theta_population=None, + batch_idx=jnp.array([0]), geno_theta_idx=jnp.array([0]), + # Deliberately non-default (1, not 0) so tests can confirm jax_model + # preserves it rather than silently resetting it when building the + # full-population data view (see + # test_jax_model_population_needed_computes_locally). + scatter_theta=1, + ) binding = MockBindingData() return MockData(growth=growth, binding=binding) @@ -82,7 +101,9 @@ def mock_control(): dk_geno_model = MagicMock(return_value=0.0) # dk_geno transformation_model = MagicMock(return_value=(1.0, 1.0, 1.0)) # (lam, mu, sigma) - transformation_update = MagicMock(side_effect=lambda t, params, mask=None: t) # pass-through + transformation_update = MagicMock( + side_effect=lambda t, params, mask=None, population_theta=None: t + ) # pass-through # Noise models just pass through or add noise. Let's pass through for simplicity. theta_binding_noise_model = MagicMock(side_effect=lambda n, x, p: x) @@ -101,7 +122,7 @@ def mock_control(): "ln_cfu0": ln_cfu0_model, "activity": activity_model, "dk_geno": dk_geno_model, - "transformation": (transformation_model, transformation_update), + "transformation": (transformation_model, transformation_update, False), "theta_binding_noise": theta_binding_noise_model, "theta_growth_noise": theta_growth_noise_model, "growth_noise": growth_noise_model, @@ -223,4 +244,86 @@ def test_jax_model_guide_flow(mock_data, mock_priors, mock_control): assert args_growth[2] is None args_binding, _ = mock_control["observe_binding"].call_args - assert args_binding[2] is None \ No newline at end of file + assert args_binding[2] is None + + +# --------------------------------------------------------------------------- +# transformation_needs_population wiring (congression full-population fix) +# --------------------------------------------------------------------------- + +def test_jax_model_population_not_needed_skips_extra_calc_theta( + mock_data, mock_priors, mock_control): + """ + When the transformation component doesn't need a population reference + (the "single" / "logit_norm" case, needs_population=False), calc_theta + must be called exactly twice (binding, growth) and transformation_update + must not receive a population_theta kwarg at all. + """ + assert mock_control["transformation"][2] is False + + with numpyro.handlers.seed(rng_seed=0): + jax_model(mock_data, mock_priors, **mock_control) + + assert mock_control["theta"][1].call_count == 2 + + _, kwargs = mock_control["transformation"][1].call_args + assert "population_theta" not in kwargs + + +def test_jax_model_population_needed_computes_locally( + mock_data, mock_priors, mock_control): + """ + When needs_population=True and no external override is supplied + (data.growth.external_theta_population is None — the training-time case), + jax_model must compute the population reference itself by calling + calc_theta a third time against a full-population data view (batch_idx / + geno_theta_idx spanning arange(num_genotype)). scatter_theta must be left + untouched (not reset to 0) so the result's leading dimensions match + theta_growth's exactly, which update_thetas relies on for broadcasting. + """ + transformation_model, transformation_update, _ = mock_control["transformation"] + mock_control["transformation"] = (transformation_model, transformation_update, True) + + with numpyro.handlers.seed(rng_seed=0): + jax_model(mock_data, mock_priors, **mock_control) + + # binding, growth, and the extra population pass + assert mock_control["theta"][1].call_count == 3 + + third_call_data = mock_control["theta"][1].call_args_list[2].args[1] + assert jnp.array_equal(third_call_data.batch_idx, jnp.arange(mock_data.growth.num_genotype)) + assert jnp.array_equal(third_call_data.geno_theta_idx, jnp.arange(mock_data.growth.num_genotype)) + assert third_call_data.scatter_theta == mock_data.growth.scatter_theta + + _, kwargs = transformation_update.call_args + # calc_theta's mock is `lambda t, d: t * 2.0`; theta == 10.0 either way, + # so the population call reduces to the same 20.0 as the growth call. + assert jnp.isclose(kwargs["population_theta"], 20.0) + + +def test_jax_model_population_needed_uses_external_override( + mock_data, mock_priors, mock_control): + """ + When needs_population=True and data.growth.external_theta_population is + already supplied (the prediction-time case, where data.growth may only + span a genotype subset), jax_model must use it directly rather than + computing a local (and, in that scenario, wrong) full-population value — + so calc_theta must be called only twice, not three times. + """ + transformation_model, transformation_update, _ = mock_control["transformation"] + mock_control["transformation"] = (transformation_model, transformation_update, True) + + external_population = jnp.array(999.0) + growth_with_override = mock_data.growth.replace( + external_theta_population=external_population + ) + data_with_override = mock_data._replace(growth=growth_with_override) + + with numpyro.handlers.seed(rng_seed=0): + jax_model(data_with_override, mock_priors, **mock_control) + + # No extra local population pass — only binding + growth. + assert mock_control["theta"][1].call_count == 2 + + _, kwargs = transformation_update.call_args + assert kwargs["population_theta"] is external_population \ No newline at end of file diff --git a/tests/tfscreen/tfmodel/generative/test_model_math.py b/tests/tfscreen/tfmodel/generative/test_model_math.py index 862f2c5b..4e6ac533 100644 --- a/tests/tfscreen/tfmodel/generative/test_model_math.py +++ b/tests/tfscreen/tfmodel/generative/test_model_math.py @@ -124,7 +124,9 @@ def _build_control(mock_data, real_priors, is_guide=False): "activity": activity_fixed.define_model, "dk_geno": dk_geno_fixed.define_model, "growth_transition": growth_transition_instant.define_model, - "transformation": (transformation_single.define_model, transformation_single.update_thetas), + "transformation": (transformation_single.define_model, + transformation_single.update_thetas, + transformation_single.NEEDS_FULL_POPULATION_THETA), "theta_growth_noise": noise_zero.define_model, "theta_binding_noise": noise_zero.define_model, "growth_noise": growth_noise_zero.define_model, diff --git a/tests/tfscreen/tfmodel/inference/test_run_inference.py b/tests/tfscreen/tfmodel/inference/test_run_inference.py index e1ca94dd..113e9c17 100644 --- a/tests/tfscreen/tfmodel/inference/test_run_inference.py +++ b/tests/tfscreen/tfmodel/inference/test_run_inference.py @@ -169,79 +169,259 @@ def test_run_optimization_nan_explosion(mocker): with pytest.raises(RuntimeError, match="model exploded"): ri.run_optimization(mock_svi, max_num_epochs=1, convergence_check_interval=1, checkpoint_interval=1) -def test_get_posteriors(tmpdir, mocker): - model = MockModel() - ri = RunInference(model, seed=42) - out_prefix = os.path.join(tmpdir, "test") - - mock_svi = mocker.Mock() - mock_svi.guide = mocker.Mock() - mock_svi.get_params.return_value = {} - - # Mock Predictive - mock_predictive = mocker.patch("tfscreen.tfmodel.inference.run_inference.Predictive") - mock_latent_sampler = mock_predictive.return_value - mock_latent_sampler.return_value = {"param": jnp.zeros((10, 10))} # Batch size 10, 10 genotypes - - mocker.patch("jax.device_get", side_effect=lambda x: x) - - ri.get_posteriors(mock_svi, "state", out_prefix, num_posterior_samples=20, sampling_batch_size=10) - - assert os.path.exists(f"{out_prefix}_posterior.h5") +# ============================================================================= +# get_posteriors — real model + component guide, no Predictive mocking +# ============================================================================= +# +# get_posteriors now runs its genotype-batch forward pass as a single +# compiled `lax.scan` (see `_build_genotype_chunk_scanner` / +# `_merge_scan_chunks` / `_genotype_chunk_indices` in run_inference.py) +# instead of a Python loop that rebuilt `Predictive` once per chunk. Mocking +# `Predictive` with a fixed call-count `side_effect` list (the old test +# strategy) no longer reflects how the code calls it, so these tests run a +# real tiny numpyro model + component guide end-to-end and check actual +# numeric/index correctness instead. + +def _component_jax_model(data, priors): + """One global + one per-genotype parameter, plus a deterministic site + that echoes the genotype index — used to catch any genotype-order + scrambling introduced by batching/stitching.""" + global_p = numpyro.sample("global_p", dist.Normal(0., 1.)) + with numpyro.plate("shared_genotype_plate", data.num_genotype, dim=-1): + numpyro.sample("geno_p", dist.Normal(global_p, 1.)) + numpyro.deterministic("geno_idx_check", data.batch_idx.astype(jnp.float32)) -def test_get_posteriors_batching_logic(tmpdir, mocker): - model = MockModel() - ri = RunInference(model, seed=42) - out_prefix = os.path.join(tmpdir, "test_batching") - - mock_svi = mocker.Mock() - mock_svi.guide = mocker.Mock() - mock_svi.get_params.return_value = {} - - # Mock Predictive to return different sizes - mock_predictive = mocker.patch("tfscreen.tfmodel.inference.run_inference.Predictive") - mock_sampler = mock_predictive.return_value - # num_samples=25, sampling_batch_size=10 -> 3 batches (10, 10, 5) - # Each loop has 1 latent call and 1 forward call (forward_batch_size=512 > 5 genotypes) - # Total 6 calls. - mock_sampler.side_effect = [ - {"p": jnp.zeros((10, 5))}, # latent 1 - {"obs": jnp.zeros((10, 5))}, # forward 1 - {"p": jnp.zeros((10, 5))}, # latent 2 - {"obs": jnp.zeros((10, 5))}, # forward 2 - {"p": jnp.zeros((5, 5))}, # latent 3 - {"obs": jnp.zeros((5, 5))} # forward 3 - ] - - mocker.patch("jax.device_get", side_effect=lambda x: x) - - ri.get_posteriors(mock_svi, "state", out_prefix, num_posterior_samples=25, sampling_batch_size=10) - assert os.path.exists(f"{out_prefix}_posterior.h5") -def test_get_posteriors_full_logic(tmpdir, mocker): - model = MockModel() - ri = RunInference(model, seed=42) - out_prefix = os.path.join(tmpdir, "test_full") - - mock_svi = mocker.Mock() - mock_svi.get_params.return_value = {} - - # 465-466: global parameter - # 479-480: concatenate multiple forward batches (5 genotypes each) - mock_predictive = mocker.patch("tfscreen.tfmodel.inference.run_inference.Predictive") - mock_sampler = mock_predictive.return_value - mock_sampler.side_effect = [ - {"global_p": jnp.zeros((1, 1)), "geno_p": jnp.zeros((1, 10))}, # latent - {"obs": jnp.zeros((1, 5))}, # forward 1 - {"obs": jnp.zeros((1, 5))}, # forward 2 - ] - - mocker.patch("jax.device_get", side_effect=lambda x: x) - - ri.get_posteriors(mock_svi, "state", out_prefix, num_posterior_samples=1, - sampling_batch_size=1, forward_batch_size=5) +def _component_jax_model_guide(data, priors): + """Mean-field guide matching `_component_jax_model`.""" + global_loc = numpyro.param("global_loc", 0.0) + global_scale = numpyro.param("global_scale", 1.0, + constraint=dist.constraints.positive) + numpyro.sample("global_p", dist.Normal(global_loc, global_scale)) + + with numpyro.plate("shared_genotype_plate", data.num_genotype, dim=-1): + geno_loc = numpyro.param("geno_loc", jnp.zeros(data.num_genotype)) + geno_scale = numpyro.param("geno_scale", jnp.ones(data.num_genotype), + constraint=dist.constraints.positive) + numpyro.sample("geno_p", dist.Normal(geno_loc, geno_scale)) + + +class ComponentModel: + """Minimal RunInference-compatible model wrapper with both a generative + model and a component (mean-field) guide, for exercising get_posteriors + end-to-end.""" + + def __init__(self, num_genotype=10): + self.data = LaplaceData(num_genotype=num_genotype, + batch_idx=jnp.arange(num_genotype)) + self.priors = {} + self.jax_model = _component_jax_model + self.jax_model_guide = _component_jax_model_guide + + def get_batch(self, data, indices): + return LaplaceData(num_genotype=len(indices), batch_idx=indices) + + def get_random_idx(self, key=None, num_batches=1): + if num_batches == 1: + return np.array([0]) + return np.zeros((num_batches, 1), dtype=int) + + +def _component_svi(model, seed=0): + """Initialize (but don't train) a component-guide SVI for `model`.""" + ri = RunInference(model, seed=seed) + svi = ri.setup_svi(guide_type="component") + svi_state = svi.init(ri.get_key(), priors=model.priors, data=model.data) + return ri, svi, svi_state + + +def test_get_posteriors_creates_h5(tmpdir): + model = ComponentModel(num_genotype=5) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_create")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=4, sampling_batch_size=4) + assert os.path.exists(f"{out_prefix}_posterior.h5") + +def test_get_posteriors_output_shapes(tmpdir): + num_genotype = 6 + num_samples = 10 + model = ComponentModel(num_genotype=num_genotype) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_shapes")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=num_samples, sampling_batch_size=4, + forward_batch_size=num_genotype) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + assert hf["global_p"].shape == (num_samples,) + assert hf["geno_p"].shape == (num_samples, num_genotype) + assert hf.attrs["num_samples"] == num_samples + + +def test_get_posteriors_sampling_batch_uneven(tmpdir): + """num_posterior_samples not evenly divisible by sampling_batch_size.""" + num_genotype = 4 + num_samples = 7 # 7 = 3 + 3 + 1 + model = ComponentModel(num_genotype=num_genotype) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_uneven")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=num_samples, sampling_batch_size=3, + forward_batch_size=num_genotype) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + assert hf.attrs["num_samples"] == num_samples + assert hf["geno_p"].shape[0] == num_samples + + +def test_get_posteriors_sites_to_save(tmpdir): + model = ComponentModel(num_genotype=5) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_filtered")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=3, sampling_batch_size=3, + sites_to_save=["geno_p"]) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + assert "geno_p" in hf + assert "global_p" not in hf + + +def test_get_posteriors_genotype_order_preserved_full_batch(tmpdir): + """forward_batch_size == num_genotype (single, unpadded chunk).""" + num_genotype = 7 + model = ComponentModel(num_genotype=num_genotype) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_full")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=4, sampling_batch_size=4, + forward_batch_size=num_genotype) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + idx_check = hf["geno_idx_check"][:] + + expected = np.tile(np.arange(num_genotype), (4, 1)) + np.testing.assert_array_equal(idx_check, expected) + + +def test_get_posteriors_genotype_order_preserved_ragged_batches(tmpdir): + """forward_batch_size that doesn't evenly divide num_genotype must still + produce correctly-ordered, unpadded output. + + Regression test for past genotype-index scrambling bugs in the + batching/stitching logic: 7 genotypes with forward_batch_size=3 forces + chunks of (3, 3, 1), internally padded to (3, 3, 3) and trimmed back by + `_merge_scan_chunks`. + """ + num_genotype = 7 + model = ComponentModel(num_genotype=num_genotype) + ri, svi, svi_state = _component_svi(model) + out_prefix = str(tmpdir.join("post_ragged")) + + ri.get_posteriors(svi, svi_state, out_prefix, + num_posterior_samples=3, sampling_batch_size=3, + forward_batch_size=3) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + idx_check = hf["geno_idx_check"][:] + geno_p = hf["geno_p"][:] + + expected = np.tile(np.arange(num_genotype), (3, 1)) + np.testing.assert_array_equal(idx_check, expected) + assert geno_p.shape == (3, num_genotype) + + +def test_get_posteriors_chunking_matches_unchunked_latents(tmpdir): + """Sampled latent values (geno_p, global_p) must be identical regardless + of forward_batch_size: latents are drawn once on the full dataset before + genotype chunking even starts, and (since RNG consumption inside + get_posteriors no longer depends on forward_batch_size) the two runs + draw from identical PRNG streams.""" + num_genotype = 9 + + model_a = ComponentModel(num_genotype=num_genotype) + ri_a, svi_a, state_a = _component_svi(model_a, seed=11) + out_a = str(tmpdir.join("post_a")) + ri_a.get_posteriors(svi_a, state_a, out_a, + num_posterior_samples=2, sampling_batch_size=2, + forward_batch_size=num_genotype) + + model_b = ComponentModel(num_genotype=num_genotype) + ri_b, svi_b, state_b = _component_svi(model_b, seed=11) + out_b = str(tmpdir.join("post_b")) + ri_b.get_posteriors(svi_b, state_b, out_b, + num_posterior_samples=2, sampling_batch_size=2, + forward_batch_size=4) # ragged: chunks of 4, 4, 1 + + with h5py.File(f"{out_a}_posterior.h5", "r") as hf_a, \ + h5py.File(f"{out_b}_posterior.h5", "r") as hf_b: + np.testing.assert_allclose(hf_a["geno_p"][:], hf_b["geno_p"][:], rtol=1e-5) + np.testing.assert_allclose(hf_a["global_p"][:], hf_b["global_p"][:], rtol=1e-5) + + +# ============================================================================= +# _genotype_chunk_indices / _merge_scan_chunks — pure indexing-math tests +# ============================================================================= + +def test_genotype_chunk_indices_exact_divisor(): + idx = np.asarray(RunInference._genotype_chunk_indices(6, 3)) + np.testing.assert_array_equal(idx, [[0, 1, 2], [3, 4, 5]]) + + +def test_genotype_chunk_indices_padding_repeats_last_valid_index(): + idx = np.asarray(RunInference._genotype_chunk_indices(7, 3)) + np.testing.assert_array_equal(idx, [[0, 1, 2], [3, 4, 5], [6, 6, 6]]) + + +def test_genotype_chunk_indices_single_chunk_smaller_than_batch(): + idx = np.asarray(RunInference._genotype_chunk_indices(2, 5)) + np.testing.assert_array_equal(idx, [[0, 1, 1, 1, 1]]) + + +def test_merge_scan_chunks_positive_axis_no_padding(): + # 2 chunks, per-chunk shape (samples=2, genotypes=3), genotype axis=1 + chunk0 = jnp.array([[0., 1., 2.], [10., 11., 12.]]) + chunk1 = jnp.array([[3., 4., 5.], [13., 14., 15.]]) + stacked = jnp.stack([chunk0, chunk1], axis=0) # (2, 2, 3) + + merged = RunInference._merge_scan_chunks(stacked, axis=1, total_size=6) + + expected = jnp.array([[0., 1., 2., 3., 4., 5.], + [10., 11., 12., 13., 14., 15.]]) + np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) + + +def test_merge_scan_chunks_trims_padding(): + # total real genotypes = 5, forward_batch_size=3 -> chunks (0,1,2),(3,4,4) + chunk0 = jnp.array([[0., 1., 2.]]) + chunk1 = jnp.array([[3., 4., 4.]]) # last entry is padding (duplicate of idx 4) + stacked = jnp.stack([chunk0, chunk1], axis=0) + + merged = RunInference._merge_scan_chunks(stacked, axis=1, total_size=5) + + expected = jnp.array([[0., 1., 2., 3., 4.]]) + np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) + + +def test_merge_scan_chunks_negative_axis(): + # genotype axis = -1 (last axis) of a per-chunk shape (samples, genotypes) + chunk0 = jnp.array([[0., 1.], [10., 11.]]) + chunk1 = jnp.array([[2., 3.], [12., 13.]]) + stacked = jnp.stack([chunk0, chunk1], axis=0) # (2, 2, 2) + + merged = RunInference._merge_scan_chunks(stacked, axis=-1, total_size=4) + + expected = jnp.array([[0., 1., 2., 3.], [10., 11., 12., 13.]]) + np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) + def test_run_optimization_restore(tmpdir, mocker): model = MockModel() ri = RunInference(model, seed=42) @@ -747,10 +927,16 @@ class LaplaceData: def _laplace_jax_model(data, priors): - """One global + one per-genotype parameter, no observations.""" + """One global + one per-genotype parameter, no observations. + + Also emits a deterministic site that echoes the genotype index, so + tests can directly verify genotype order survives forward-batching + (rather than just checking output shapes). + """ global_p = numpyro.sample("global_p", dist.Normal(0., 1.)) with numpyro.plate("shared_genotype_plate", data.num_genotype, dim=-1): numpyro.sample("geno_p", dist.Normal(global_p, 1.)) + numpyro.deterministic("geno_idx_check", data.batch_idx.astype(jnp.float32)) class LaplaceModel: @@ -840,6 +1026,35 @@ def test_get_laplace_posteriors_forward_batching(tmpdir): assert hf["geno_p"].shape == (num_samples, num_genotype) +def test_get_laplace_posteriors_genotype_order_preserved_ragged_batches(tmpdir): + """forward_batch_size that doesn't evenly divide num_genotype must still + produce correctly-ordered, unpadded output. + + Regression test for the genotype-batch lax.scan stitching logic shared + with get_posteriors: 5 genotypes with forward_batch_size=2 forces chunks + of (2, 2, 1), internally padded to (2, 2, 2) and trimmed back. + """ + num_genotype = 5 + num_samples = 6 + model = LaplaceModel(num_genotype=num_genotype) + ri, map_params = _laplace_map_params(model) + + out_prefix = str(tmpdir.join("laplace_order")) + ri.get_laplace_posteriors( + map_params=map_params, + out_prefix=out_prefix, + num_posterior_samples=num_samples, + sampling_batch_size=num_samples, + forward_batch_size=2, + ) + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + idx_check = hf["geno_idx_check"][:] + + expected = np.tile(np.arange(num_genotype), (num_samples, 1)) + np.testing.assert_array_equal(idx_check, expected) + + def test_get_laplace_posteriors_sampling_batching(tmpdir): """num_posterior_samples not evenly divisible by sampling_batch_size works.""" num_genotype = 4 @@ -982,6 +1197,27 @@ def test_get_nuts_posteriors_forward_batching(tmpdir): assert hf["geno_p"].shape == (num_samples, num_genotype) +def test_get_nuts_posteriors_genotype_order_preserved_ragged_batches(tmpdir): + """forward_batch_size that doesn't evenly divide num_genotype must still + produce correctly-ordered, unpadded output (same lax.scan stitching path + as get_posteriors / get_laplace_posteriors).""" + num_genotype = 7 + num_samples = 5 + model = LaplaceModel(num_genotype=num_genotype) + ri = RunInference(model, seed=0) + samples = _fake_mcmc_samples(num_samples, num_genotype) + + out_prefix = str(tmpdir.join("nuts_order")) + ri.get_nuts_posteriors(samples, out_prefix=out_prefix, + forward_batch_size=3) # chunks of 3, 3, 1 + + with h5py.File(f"{out_prefix}_posterior.h5", "r") as hf: + idx_check = hf["geno_idx_check"][:] + + expected = np.tile(np.arange(num_genotype), (num_samples, 1)) + np.testing.assert_array_equal(idx_check, expected) + + def test_get_nuts_posteriors_num_samples_in_attrs(tmpdir): """num_samples attribute in HDF5 reflects the actual sample count.""" num_genotype = 3 diff --git a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py index 21d26e93..64658c9e 100644 --- a/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py @@ -29,10 +29,19 @@ def _write_lines(path, lines): fh.write("\n".join(str(x) for x in lines) + "\n") +def _fake_load_posteriors(param_file, q_to_get=None): + """Fake for load_posteriors: (q_dict, posteriors) with a known sample count.""" + return {}, {"param1": np.zeros((10, 1))} + + @pytest.fixture def mock_orchestrator(): orchestrator = MagicMock() orchestrator.growth_df = _make_growth_df(["wt", "A1B"], [0.0, 1.0]) + # tensor_shape's last dim is genotype count (2); other axes product = 1. + # Needed by estimate_genotype_batch_size, which auto-sizing now calls + # whenever genotype_batch_size is left at its default of None. + orchestrator.growth_tm.tensor_shape = (1, 1, 1, 1, 1, 1, 2) return orchestrator @@ -62,6 +71,10 @@ def fake_predict(**kwargs): "tfscreen.tfmodel.scripts" ".predict_growth_cli.predict", side_effect=fake_predict, + ), patch( + "tfscreen.tfmodel.scripts" + ".predict_growth_cli.load_posteriors", + side_effect=_fake_load_posteriors, ): yield calls @@ -73,8 +86,12 @@ def fake_predict(**kwargs): class TestPredictGrowthDefaults: def test_no_files_passes_none_genotypes(self, mock_predict, tmp_path): + """genotypes is resolved to the full training list (not None), since + auto-sizing (the default when genotype_batch_size is unset) needs an + explicit list to size batches against. Functionally equivalent to the + old None sentinel, which predict() also interprets as "all genotypes".""" predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out")) - assert mock_predict["genotypes"] is None + assert sorted(mock_predict["genotypes"]) == ["A1B", "wt"] def test_no_files_passes_none_concs(self, mock_predict, tmp_path): predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out")) @@ -163,10 +180,13 @@ def test_only_files_concs_restricts_to_file(self, mock_predict, tmp_path): assert 1.0 not in mock_predict["titrant_conc"] def test_only_files_no_file_falls_through_to_none(self, mock_predict, tmp_path): + """With no genotypes_file, genotypes falls through to all training + genotypes (resolved to an explicit list for auto-sizing), same as the + old None-sentinel behavior predict() would have used anyway.""" predict_growth("cfg.yaml", "post.h5", only_files=True, out_prefix=str(tmp_path / "out")) - assert mock_predict["genotypes"] is None + assert sorted(mock_predict["genotypes"]) == ["A1B", "wt"] assert mock_predict["titrant_conc"] is None @@ -193,7 +213,7 @@ def test_titrant_names_file_does_not_affect_predict_call(self, mock_predict, tmp titrant_names_file=nf, out_prefix=str(tmp_path / "out")) # titrant_names_file must not influence genotypes or concs passed to predict - assert mock_predict["genotypes"] is None + assert sorted(mock_predict["genotypes"]) == ["A1B", "wt"] assert mock_predict["titrant_conc"] is None @@ -224,6 +244,11 @@ def fake_predict(**kwargs): ".predict_growth_cli.predict", side_effect=fake_predict, ), + patch( + "tfscreen.tfmodel.scripts" + ".predict_growth_cli.load_posteriors", + side_effect=_fake_load_posteriors, + ), ] def test_pkl_param_file_calls_resolve(self, mock_orchestrator, tmp_path): @@ -235,7 +260,7 @@ def fake_resolve(pf, orchestrator, op): return "resolved.h5" patches = self._make_fixtures(mock_orchestrator) - with patches[0], patches[1], patch( + with patches[0], patches[1], patches[2], patch( "tfscreen.tfmodel.scripts" ".predict_growth_cli.resolve_param_file", side_effect=fake_resolve, @@ -254,7 +279,7 @@ def fake_resolve(pf, orchestrator, op): return pf patches = self._make_fixtures(mock_orchestrator) - with patches[0], patches[1], patch( + with patches[0], patches[1], patches[2], patch( "tfscreen.tfmodel.scripts" ".predict_growth_cli.resolve_param_file", side_effect=fake_resolve, @@ -274,7 +299,7 @@ def fake_predict(**kwargs): "titrant_conc": [0.0], "q0.5": [10.0]}) patches = self._make_fixtures(mock_orchestrator) - with patches[0], patch( + with patches[0], patches[2], patch( "tfscreen.tfmodel.scripts" ".predict_growth_cli.predict", side_effect=fake_predict, @@ -298,7 +323,7 @@ def fake_predict(**kwargs): "titrant_conc": [0.0], "q0.5": [10.0]}) patches = self._make_fixtures(mock_orchestrator) - with patches[0], patch( + with patches[0], patches[2], patch( "tfscreen.tfmodel.scripts" ".predict_growth_cli.predict", side_effect=fake_predict, @@ -322,7 +347,7 @@ def fake_predict(**kwargs): "titrant_conc": [0.0], "q0.5": [10.0]}) patches = self._make_fixtures(mock_orchestrator) - with patches[0], patch( + with patches[0], patches[2], patch( "tfscreen.tfmodel.scripts" ".predict_growth_cli.predict", side_effect=fake_predict, @@ -367,13 +392,15 @@ def _patch_stack(self, mock_orchestrator, fake_predict): side_effect=lambda pf, orchestrator, op: pf), patch("tfscreen.tfmodel.scripts.predict_growth_cli.predict", side_effect=fake_predict), + patch("tfscreen.tfmodel.scripts.predict_growth_cli.load_posteriors", + side_effect=_fake_load_posteriors), ] def test_no_batching_when_batch_size_none(self, mock_orchestrator, tmp_path): """genotype_batch_size=None → predict called exactly once.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out"), genotype_batch_size=None) @@ -383,7 +410,7 @@ def test_batch_size_larger_than_total_single_call(self, mock_orchestrator, tmp_p """genotype_batch_size > n_genotypes → still a single predict call.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out"), genotype_batch_size=1000) @@ -393,7 +420,7 @@ def test_batch_size_1_two_genotypes_two_calls(self, mock_orchestrator, tmp_path) """genotype_batch_size=1 with 2 training genotypes → 2 predict calls.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out"), genotype_batch_size=1) @@ -403,7 +430,7 @@ def test_batch_each_call_gets_one_genotype(self, mock_orchestrator, tmp_path): """With batch_size=1, each predict call receives exactly 1 genotype.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out"), genotype_batch_size=1) @@ -414,7 +441,7 @@ def test_batch_covers_all_genotypes(self, mock_orchestrator, tmp_path): """All training genotypes appear across the batched predict calls.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=str(tmp_path / "out"), genotype_batch_size=1) @@ -427,7 +454,7 @@ def test_batch_results_concatenated_in_csv(self, mock_orchestrator, tmp_path): fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) out = str(tmp_path / "out") - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=out, genotype_batch_size=1) @@ -438,7 +465,7 @@ def test_batch_resolves_none_genotypes_from_orchestrator(self, mock_orchestrator """When genotypes would be None, batching resolves from orchestrator.growth_df.""" fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: # No genotypes_file → genotypes=None without batching; with batching # it must be resolved so the list can be split. predict_growth("cfg.yaml", "post.h5", @@ -454,7 +481,7 @@ def test_batch_with_file_genotypes_splits_file_list(self, mock_orchestrator, tmp _write_lines(gf, ["wt", "A1B"]) fake_predict, all_calls = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", genotypes_file=gf, only_files=True, @@ -469,7 +496,7 @@ def test_batch_in_training_data_correct_across_batches(self, mock_orchestrator, fake_predict, _ = self._make_fake_predict(mock_orchestrator) patches = self._patch_stack(mock_orchestrator, fake_predict) out = str(tmp_path / "out") - with patches[0], patches[1], patches[2]: + with patches[0], patches[1], patches[2], patches[3]: predict_growth("cfg.yaml", "post.h5", out_prefix=out, genotype_batch_size=1) diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index b22c2fff..76108c77 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -15,6 +15,7 @@ _build_growth_tm, _build_binding_tm, _setup_batching, + _check_theta_transformation_compatibility, get_batch ) from tfscreen.tfmodel.generative.components.growth.linear import _parse_condition_label @@ -430,6 +431,115 @@ def test_initialize_classes_logic(mocker): assert model._theta == "categorical_geno" +@pytest.mark.parametrize("transformation_key, expected_needs_population", [ + ("single", False), + ("logit_norm", False), + ("empirical", True), +]) +def test_transformation_control_kwargs_carry_needs_population_flag( + mocker, transformation_key, expected_needs_population): + """ + main_control_kwargs["transformation"] must be a 3-tuple whose third + element reflects the *real* transformation component's + NEEDS_FULL_POPULATION_THETA flag (empirical=True; single/logit_norm=False) + — this is the wiring jax_model relies on to decide whether it needs a + population-wide theta reference for the congression correction. + """ + import tfscreen.tfmodel.generative.components.transformation as transformation_pkg + + mock_growth_tm = create_mock_tm(is_growth=True) + mock_binding_tm = create_mock_tm(is_growth=False) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_growth_tm", return_value=mock_growth_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_binding_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_binding_tm", return_value=mock_binding_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._setup_batching", return_value={"batch_idx": jnp.array([0]), "batch_size": 1, "scale_vector": jnp.array([1.0]), "num_binding": 0}) + mocker.patch("tfscreen.tfmodel.model_orchestrator.populate_dataclass", return_value=MagicMock()) + + real_transformation_module = getattr(transformation_pkg, transformation_key) + + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", { + "condition_growth": {"independent": MagicMock()}, + "growth_transition": {"instant": MagicMock()}, + "ln_cfu0": {"hierarchical": MagicMock()}, + "dk_geno": {"hierarchical_geno": MagicMock()}, + "activity": {"horseshoe_geno": MagicMock()}, + # Use a mocked "hill_geno" stand-in (not "categorical_geno") so this + # wiring test doesn't trip the real theta/transformation compatibility + # check exercised separately below. + "theta": {"hill_geno": MagicMock()}, + "transformation": {transformation_key: real_transformation_module}, + "theta_rescale": {"passthrough": MagicMock()}, + "theta_growth_noise": {"logit_normal": MagicMock()}, + "theta_binding_noise": {"zero": MagicMock()}, + "growth_noise": {"zero": MagicMock()}, + "sample_offset": {"zero": MagicMock()}, + "observe_binding": MagicMock(), + "observe_growth": MagicMock() + }, clear=True): + for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", + "activity", "theta", "theta_growth_noise", "theta_binding_noise", + "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_priors.return_value = {} + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_guesses.return_value = {} + + model = ModelOrchestrator( + "g.csv", "b.csv", + theta="hill_geno", + transformation=transformation_key, + condition_growth="independent", + growth_transition="instant", + ) + + transformation_control = model.main_control_kwargs["transformation"] + assert len(transformation_control) == 3 + assert transformation_control[2] is expected_needs_population + + +# --------------------------------------------------------------------------- +# _check_theta_transformation_compatibility +# --------------------------------------------------------------------------- + +def test_check_theta_transformation_compatibility_rejects_categorical_geno_empirical(): + """categorical_geno cannot supply a full-population theta reference, so + pairing it with transformation='empirical' must raise, not silently + reproduce the population-CDF bug.""" + with pytest.raises(ValueError, match="categorical_geno.*empirical|empirical.*categorical_geno"): + _check_theta_transformation_compatibility("categorical_geno", "empirical") + + +@pytest.mark.parametrize("transformation_key", ["single", "logit_norm"]) +def test_check_theta_transformation_compatibility_allows_categorical_geno_elsewhere( + transformation_key): + """categorical_geno is fine with transformation models that don't need a + population-wide theta reference.""" + _check_theta_transformation_compatibility("categorical_geno", transformation_key) + + +@pytest.mark.parametrize("theta_key", ["hill_geno", "hill_mut", "some_thermo_variant"]) +def test_check_theta_transformation_compatibility_allows_other_theta_with_empirical( + theta_key): + """Any theta component other than the known-incompatible ones must be + allowed with transformation='empirical' (including forward-compatibility + with theta components this check has never heard of).""" + _check_theta_transformation_compatibility(theta_key, "empirical") + + +def test_model_orchestrator_rejects_categorical_geno_with_empirical(): + """ + End-to-end: constructing a ModelOrchestrator with the incompatible pair + must raise before any data loading happens (no growth_df/binding_df I/O + needed for this to fire — "g.csv"/"b.csv" are never touched). + """ + with pytest.raises(ValueError, match="categorical_geno"): + ModelOrchestrator( + "g.csv", "b.csv", + theta="categorical_geno", + transformation="empirical", + ) + + def test_model_class_properties(initialized_model_class): model = initialized_model_class model._jax_model = "jm" From b0ca8293b53b345354f49efa8e275782e770edf5 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Fri, 3 Jul 2026 16:06:53 -0700 Subject: [PATCH 04/30] test fix --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 4875 +++++++++++++++-- reports/junit/junit.xml | 2 +- .../tfmodel/test_model_orchestrator.py | 15 + 5 files changed, 4372 insertions(+), 524 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 80ba1187..e5362f24 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.24%coverage96.24% \ No newline at end of file +coverage: 96.32%coverage96.32% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 7cfca822..af66d7fa 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3642tests3642 \ No newline at end of file +tests: 3697tests3697 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index efdfa29f..c0f0e49d 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1,3 +1,3872 @@ +./build/lib/tfscreen/__init__.py:19:1: W391 blank line at end of file +./build/lib/tfscreen/__version__.py:5:16: W291 trailing whitespace +./build/lib/tfscreen/analysis/__init__.py:13:1: W391 blank line at end of file +./build/lib/tfscreen/analysis/cat_response/__init__.py:2:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/__init__.py:3:55: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: C901 'cat_fit' is too complex (19) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:25:80: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:26:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:42:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:51:51: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:87:49: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:88:40: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:51: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:90:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:91:40: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:92:48: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:94:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:108:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:110:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:115:48: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:117:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:124:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:125:47: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:72: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:74: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:130:13: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:148:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:150:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:155:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:172:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:174:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:55: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:62: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:57: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:65: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:191:9: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:192:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:204:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:205:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:206:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:207:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:209:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:5: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:32: W292 no newline at end of file +./build/lib/tfscreen/analysis/cat_response/cat_response.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/cat_response.py:23:73: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:26:78: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:44:74: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:45:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:46:26: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:51:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:57:43: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:97:43: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:98:26: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:130:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:134:34: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:138:42: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:141:56: W292 no newline at end of file +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:21:1: C901 'cat_response' is too complex (11) +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:91:56: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: C901 'mutant_cycle_pivot' is too complex (11) +./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/extract_epistasis.py:33:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:34:25: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:78:25: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:96:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:113:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:125:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:129:1: C901 'extract_epistasis' is too complex (12) +./build/lib/tfscreen/analysis/extract_epistasis.py:133:47: E252 missing whitespace around parameter equals +./build/lib/tfscreen/analysis/extract_epistasis.py:133:48: E252 missing whitespace around parameter equals +./build/lib/tfscreen/analysis/extract_epistasis.py:159:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:183:36: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:184:27: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:187:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:192:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:201:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:208:55: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:208:60: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:208:65: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:210:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:216:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:223:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:229:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:231:10: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:233:30: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/stats_test_suite.py:8:31: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:8:42: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:55:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:66:52: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:104:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:134:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:143:26: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:144:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:148:5: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/stats_test_suite.py:149:22: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:150:15: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:151:26: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:155:21: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:156:24: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:157:24: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:158:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:159:21: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:161:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:163:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/build_cycles.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/build_cycles.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/build_cycles.py:69:26: W291 trailing whitespace +./build/lib/tfscreen/genetics/build_cycles.py:78:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/build_mut_geno_matrix.py:5:1: C901 'build_mut_geno_matrix' is too complex (17) +./build/lib/tfscreen/genetics/combine_mutation_effects.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/combine_mutation_effects.py:11:50: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:32:73: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:34:71: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:35:21: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:65:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:73:27: E261 at least two spaces before inline comment +./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E117 over-indented +./build/lib/tfscreen/genetics/combine_mutation_effects.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:89:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:104:25: W292 no newline at end of file +./build/lib/tfscreen/genetics/count_mutation_backgrounds.py:8:1: C901 'count_mutation_backgrounds' is too complex (12) +./build/lib/tfscreen/genetics/data.py:25:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:26:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:27:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:28:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:29:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:30:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:31:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:32:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:33:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:34:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:35:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:36:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:37:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:38:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:41:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:42:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:43:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:44:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:45:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:46:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:46:28: W292 no newline at end of file +./build/lib/tfscreen/genetics/expand_genotype_columns.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/expand_genotype_columns.py:16:51: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:47:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:64:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:77:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:79:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/expand_genotype_columns.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:95:41: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:96:31: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:105:14: W292 no newline at end of file +./build/lib/tfscreen/genetics/genotype_sorting.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/genotype_sorting.py:9:58: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:11:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:16:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:17:74: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:18:81: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:19:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:20:35: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:29:11: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:37:41: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:43:79: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:51:74: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:53:30: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:53:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:57:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:70:39: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:86:37: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:86:46: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:89:55: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:92:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:100:67: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:140:8: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:141:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E117 over-indented +./build/lib/tfscreen/genetics/genotype_sorting.py:218:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:221:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/genotype_sorting.py:221:32: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:221:50: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:240:40: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:273:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:274:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:292:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:298:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/get_single_with_wt.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/get_single_with_wt.py:46:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:55:59: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:58:38: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:59:38: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:60:39: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:63:11: E124 closing bracket does not match visual indentation +./build/lib/tfscreen/genetics/get_single_with_wt.py:65:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:66:52: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:78:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/get_single_with_wt.py:80:49: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/get_single_with_wt.py:87:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:90:69: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:93:37: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:94:61: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:97:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:107:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/library_manager.py:76:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:94:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:158:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:159:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/library_manager.py:169:22: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:181:5: C901 'LibraryManager._parse_and_validate' is too complex (12) +./build/lib/tfscreen/genetics/library_manager.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:226:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:235:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:244:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:250:9: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:251:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:254:27: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:254:36: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:258:32: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:258:46: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:51: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:58: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:70: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:300:48: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:300:94: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:307:35: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:309:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:310:49: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:311:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:313:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:316:37: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:316:49: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:318:30: E701 multiple statements on one line (colon) +./build/lib/tfscreen/genetics/library_manager.py:321:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:324:18: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/genetics/library_manager.py:373:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:378:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:380:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:386:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:415:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:421:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:427:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:466:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:467:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:471:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:476:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:478:25: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:478:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:479:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:482:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:488:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:493:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:526:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:527:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:528:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:555:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:560:73: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:560:82: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:561:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:562:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:562:55: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:562:63: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:563:39: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:563:43: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:564:34: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:564:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:566:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:568:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:605:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:611:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:613:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:616:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:617:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:648:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:650:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:656:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:657:31: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:661:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:663:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:665:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:695:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:698:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:703:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:708:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:710:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:712:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:713:30: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:721:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:740:28: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:740:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:748:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:776:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:781:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:787:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:790:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:791:39: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:794:72: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:795:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:798:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:806:9: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:807:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:810:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:811:15: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:825:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:838:79: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:839:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:840:34: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:841:58: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:845:64: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:853:37: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:854:27: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:856:40: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:859:1: W391 blank line at end of file +./build/lib/tfscreen/mle/__init__.py:16:1: W391 blank line at end of file +./build/lib/tfscreen/mle/curve_models/__init__.py:4:77: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:5:42: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:11:77: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:16:76: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:18:29: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:52:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:53:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:54:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:55:22: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:58:28: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:59:28: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:60:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:61:24: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:62:27: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:65:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:66:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:67:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:68:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:69:30: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:72:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:73:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:74:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:75:25: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:76:28: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:79:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:80:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:81:37: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:82:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:83:35: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:86:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:87:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:88:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:89:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:90:33: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:93:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:94:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:95:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:96:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:97:30: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:100:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:101:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:102:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:103:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:104:29: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:104:55: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:107:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:108:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:109:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:110:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:111:34: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:114:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:115:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:116:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:117:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:117:33: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/guesses.py:3:69: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:25:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:25:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:42:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:42:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:45:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:65:23: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:69:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:89:23: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:109:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:110:24: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:114:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:129:35: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:130:24: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:134:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:150:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:155:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:165:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:181:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:196:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:212:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:215:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:217:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:222:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:225:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:243:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:247:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:250:26: E225 missing whitespace around operator +./build/lib/tfscreen/mle/curve_models/guesses.py:252:10: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:257:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:257:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:260:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:271:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:271:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:274:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:274:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:277:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:288:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:288:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:291:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:291:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:294:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:305:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:305:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:308:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:308:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:311:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:322:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:322:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:324:1: W391 blank line at end of file +./build/lib/tfscreen/mle/curve_models/models.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:38:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:39:26: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:40:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:41:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:68:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:70:51: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:75:25: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:88:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:91:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:130:27: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:42: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:132:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:203:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:206:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:206:41: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:207:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:207:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:210:38: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:211:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:213:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:213:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:214:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:251:30: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:251:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:252:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:254:30: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:254:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:255:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:259:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:262:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:301:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:304:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:316:28: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:326:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:26:72: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:29:56: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:34:72: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:36:69: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:41:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:71:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:77:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:123:5: E301 expected 1 blank line, found 0 +./build/lib/tfscreen/mle/fit_manager.py:186:62: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:223:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:225:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:227:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:247:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:250:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:269:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:272:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:291:24: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:294:41: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:320:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:337:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:340:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:344:5: E303 too many blank lines (2) +./build/lib/tfscreen/mle/fit_manager.py:344:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:425:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:456:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:473:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/__init__.py:7:1: W391 blank line at end of file +./build/lib/tfscreen/mle/fitters/_util.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/_util.py:5:14: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:5:24: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:5:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:6:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/_util.py:19:18: E225 missing whitespace around operator +./build/lib/tfscreen/mle/fitters/_util.py:21:44: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/_util.py:27:34: W292 no newline at end of file +./build/lib/tfscreen/mle/fitters/least_squares.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/least_squares.py:42:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:43:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:44:5: E303 too many blank lines (2) +./build/lib/tfscreen/mle/fitters/least_squares.py:44:76: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:47:38: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/least_squares.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:119:18: F541 f-string is missing placeholders +./build/lib/tfscreen/mle/fitters/least_squares.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:126:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/matrix_nls.py:13:76: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:35: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:39: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:56:52: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:67:54: W292 no newline at end of file +./build/lib/tfscreen/mle/fitters/matrix_wls.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/matrix_wls.py:27:81: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:30:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:42:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:52:40: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:54:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:55:52: W292 no newline at end of file +./build/lib/tfscreen/mle/predict_with_error.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/predict_with_error.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/predict_with_error.py:42:36: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:54:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/predict_with_error.py:57:43: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:61:45: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:74:32: W292 no newline at end of file +./build/lib/tfscreen/plot/__init__.py:36:63: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:13:1: C901 'cat_fits' is too complex (11) +./build/lib/tfscreen/plot/cat_fits.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/cat_fits.py:13:15: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:13:17: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:99:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:99:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:113:80: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:119:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:120:74: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:121:14: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:123:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:123:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:128:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:128:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:137:53: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:147:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:147:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:163:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:163:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:171:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:172:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:173:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:174:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:175:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:176:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:187:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:187:5: W292 no newline at end of file +./build/lib/tfscreen/plot/corner.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/corner.py:11:76: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:12:23: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:17:66: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:19:80: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:38:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/corner.py:39:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:47:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:63: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:73: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:54:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:55:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:64:15: W292 no newline at end of file +./build/lib/tfscreen/plot/default_styles.py:17:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:17:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:17:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:27:8: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:28:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:29:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:33:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:34:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:38:8: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:39:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:40:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:44:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:45:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:46:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:47:14: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:54:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:55:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:56:13: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:56:16: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/default_styles.py:58:41: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:59:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:59:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:59:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:62:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:63:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:63:32: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/default_styles.py:64:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:65:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:66:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:70:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:71:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:72:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:73:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:74:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:79:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:79:21: W291 trailing whitespace +./build/lib/tfscreen/plot/default_styles.py:80:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:81:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:82:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:83:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:84:2: W292 no newline at end of file +./build/lib/tfscreen/plot/err_vs_mag.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/err_vs_mag.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/err_vs_mag.py:20:34: W291 trailing whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:33:55: W291 trailing whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:43:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:44:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:49:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:49:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:55:5: E303 too many blank lines (3) +./build/lib/tfscreen/plot/err_vs_mag.py:57:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:62:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:37: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:50: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:63:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:64:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:70:14: W292 no newline at end of file +./build/lib/tfscreen/plot/err_zscore.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/err_zscore.py:21:77: W291 trailing whitespace +./build/lib/tfscreen/plot/err_zscore.py:22:37: W291 trailing whitespace +./build/lib/tfscreen/plot/err_zscore.py:52:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:52:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:53:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:54:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:54:51: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:57:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:58:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:72:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:73:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:73:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:73:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:78:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:79:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:41: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:16:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/est_v_real_summary.py:24:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/est_v_real_summary.py:54:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/est_v_real_summary.py:57:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:70:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:72:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/est_v_real_summary.py:72:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:72:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:72:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:102:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:106:1: W391 blank line at end of file +./build/lib/tfscreen/plot/geno_trajectory.py:29:1: C901 'plot_geno_trajectory' is too complex (14) +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:15:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:17:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:19:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:23:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:26:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:32:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:33:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:42:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:44:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:17:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:18:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:20:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:24:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:26:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:27:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:39:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:41:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:15:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:19:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:20:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:21:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:23:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:25:17: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:33:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:73: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:74: E262 inline comment should start with '# ' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:50:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:52:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:6:18: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: C901 '_build_heatmap_collection' is too complex (11) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:88:38: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:90:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:93:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:107:55: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:110:55: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:125:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:126:48: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:129:68: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:142:33: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:143:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:13: E221 multiple spaces before operator +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:28: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:151:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:154:33: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:155:16: E221 multiple spaces before operator +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:156:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:34: E203 whitespace before ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:34: E203 whitespace before ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:41: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:41: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:160:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:66: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: C901 '_build_color_mapper' is too complex (13) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:217:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:39: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:243:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:276:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:280:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:281:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:338:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:373:40: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:375:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:382:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:385:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:388:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:443:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:448:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:456:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:457:1: C901 'heatmap' is too complex (13) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:509:76: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:528:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:531:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:561:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:569:53: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:570:5: F841 local variable 'e' is assigned to but never used +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:580:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:589:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:590:39: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:37: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:57: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:593:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:596:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:612:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:615:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:620:20: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:621:69: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:622:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:625:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:629:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:636:35: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:637:34: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:638:32: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:639:37: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:643:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:644:57: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:645:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:647:72: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:56: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:671:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:672:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:679:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:680:19: W292 no newline at end of file +./build/lib/tfscreen/plot/helper.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:28:78: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:29:40: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:31:55: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:51:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:60:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:62:71: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:64:61: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:69:47: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:70:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:74:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:84:76: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:93:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:100:17: W292 no newline at end of file +./build/lib/tfscreen/plot/hill_fit.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/plot_theta_fits.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/plot_theta_fits.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:84:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:84:50: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:86:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:88:73: E225 missing whitespace around operator +./build/lib/tfscreen/plot/plot_theta_fits.py:89:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:92:52: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:95:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:98:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:98:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:102:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:102:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:105:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:108:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:108:46: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:115:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:121:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:124:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:130:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:133:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:139:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:141:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:144:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:153:1: W391 blank line at end of file +./build/lib/tfscreen/plot/uncertainty_calibration.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/uncertainty_calibration.py:21:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/uncertainty_calibration.py:24:63: W291 trailing whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:65:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:71:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:71:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:84:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:84:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:15: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:18: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:89:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:41: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:46: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:93:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:94:18: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:97:14: W292 no newline at end of file +./build/lib/tfscreen/plot/xy_corr.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/xy_corr.py:24:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/xy_corr.py:63:47: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:64:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:69:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:69:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:88:17: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/plot/xy_corr.py:89:17: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/plot/xy_corr.py:91:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:62: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:67: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:93:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:94:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:97:14: W292 no newline at end of file +./build/lib/tfscreen/process_raw/_counts_io.py:110:16: F541 f-string is missing placeholders +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:30:69: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:77:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:110:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:147:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:191:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:193:41: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:194:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:197:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:200:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:203:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:212:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:213:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:214:64: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:229:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:49: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:66: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:238:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:241:52: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:21:14: E401 multiple imports on one line +./build/lib/tfscreen/process_raw/fastq_to_counts.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/fastq_to_counts.py:26:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:69:44: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:104:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:113:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:136:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:137:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:138:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:139:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:144:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:149:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:156:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:188:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:194:15: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:204:42: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/fastq_to_counts.py:207:42: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/fastq_to_counts.py:208:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:216:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:219:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:220:40: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:223:54: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:226:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:233:66: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:247:18: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:249:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:260:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:262:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:263:45: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:266:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:267:5: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:290:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:296:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:46: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:302:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:303:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:304:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:305:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:306:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:318:50: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:319:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:322:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:324:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:326:58: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:32: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:332:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:334:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:32: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:336:57: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:338:35: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:347:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:348:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:9: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:5: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:30: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:361:15: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:364:79: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:365:79: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:367:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:368:21: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:371:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:377:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:380:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:381:20: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:403:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:405:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:406:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:410:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:411:43: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:435:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:440:65: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:451:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:458:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:459:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:460:78: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:464:40: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:34: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:471:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:476:34: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:481:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:482:45: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:487:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:35: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:44: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:496:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:497:40: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:506:68: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:511:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:43: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:516:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:526:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:529:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:34: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:44: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:546:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:553:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:47: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:558:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:565:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:567:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:30: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:39: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:571:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:574:22: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:576:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:579:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:580:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:581:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:584:78: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:586:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:594:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:595:66: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:596:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:600:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:602:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:603:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:604:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:605:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:610:27: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:612:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:613:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:614:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:618:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:623:62: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:624:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:625:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:652:50: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:653:50: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:664:1: W391 blank line at end of file +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:28: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:29: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:26: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:27: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:21: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:22: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:75:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:79:44: W292 no newline at end of file +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:25:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:26:39: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:46:87: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:47:87: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:56:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:64:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:66:71: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:82:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:83:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:85:51: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:88:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:96:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:105:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:142:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:165:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:168:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:173:45: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:181:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:182:43: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:25: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:40: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:207:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:237:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:257:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:258:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:259:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:260:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E117 over-indented +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:291:27: E231 missing whitespace after ':' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:292:25: E231 missing whitespace after ':' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:296:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:297:69: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:298:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:299:72: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:300:54: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:314:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:337:67: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:348:71: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:354:71: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:357:80: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:361:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:374:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:389:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:396:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:397:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:398:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:399:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:400:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:401:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:403:57: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:406:59: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:407:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:410:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:411:31: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:413:37: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:417:39: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:418:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:420:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:77:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:78:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:79:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:86:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/__init__.py:29:2: W292 no newline at end of file +./build/lib/tfscreen/simulate/binding_params.py:225:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) +./build/lib/tfscreen/simulate/binding_params.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:290:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:292:13: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:293:13: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:296:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:298:12: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:299:12: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:318:21: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:321:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:321:43: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:323:23: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:324:23: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:330:32: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:332:28: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:333:28: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:336:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:350:14: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:350:31: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:352:10: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:352:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:353:10: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:353:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:383:22: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:385:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:386:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:389:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:391:15: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/build_sample_dataframes.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/build_sample_dataframes.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file +./build/lib/tfscreen/simulate/library_prediction.py:28:1: C901 'library_prediction' is too complex (14) +./build/lib/tfscreen/simulate/library_prediction.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used +./build/lib/tfscreen/simulate/run_simulation.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/run_simulation.py:17:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:18:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:21:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:22:23: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:62: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:24:47: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:25:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:34:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:38:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:50:38: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:50:39: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:51:39: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:51:40: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:53:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:56:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:71:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:72:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:82:46: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:88:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:88:62: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:91:26: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:92:29: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:93:33: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:94:25: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:95:25: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:96:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:100:50: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:101:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:106:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:107:1: W391 blank line at end of file +./build/lib/tfscreen/simulate/sample_theta.py:170:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:171:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:172:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:173:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:174:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:175:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:176:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:119:15: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:120:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:121:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:126:20: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:127:22: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:128:21: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:147:48: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:148:14: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:149:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:154:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:167:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:170:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:171:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:172:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:175:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:177:25: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:179:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:193:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:45:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:46:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:71:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:72:1: C901 '_check_dict_number' is too complex (13) +./build/lib/tfscreen/simulate/selection_experiment.py:72:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:158:1: C901 '_check_cf' is too complex (25) +./build/lib/tfscreen/simulate/selection_experiment.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:199:57: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:223:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:224:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:290:1: C901 '_check_lib_spec' is too complex (12) +./build/lib/tfscreen/simulate/selection_experiment.py:290:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:347:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:369:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:422:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:438:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:446:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:446:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:456:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:466:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:509:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:513:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:514:75: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:524:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:527:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:573:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:584:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:585:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:588:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:592:55: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:598:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:603:30: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:604:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:608:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:678:50: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:678:52: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:680:75: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:682:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:683:46: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:684:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:685:67: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:735:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:752:79: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:758:29: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:800:43: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:806:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:807:18: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:813:79: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:815:33: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:820:80: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:825:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:831:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:842:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:885:73: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:890:76: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:907:25: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1015:26: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:52: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:60: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1023:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1024:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1032:42: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1041:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1042:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1044:63: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1052:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1059:28: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1061:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1062:24: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1069:79: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1074:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1075:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1077:36: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1079:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1089:128: E501 line too long (145 > 127 characters) +./build/lib/tfscreen/simulate/selection_experiment.py:1090:128: E501 line too long (145 > 127 characters) +./build/lib/tfscreen/simulate/selection_experiment.py:1094:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1095:72: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1099:34: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1106:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1108:20: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1108:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1109:20: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1111:32: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1112:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1124:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1132:41: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1139:49: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1141:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1146:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:37: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:45: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:61: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1152:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:1187:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1208:57: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1209:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1212:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1212:39: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1217:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1223:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1226:19: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1234:33: E261 at least two spaces before inline comment +./build/lib/tfscreen/simulate/selection_experiment.py:1235:49: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1236:37: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:1238:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1239:76: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1241:19: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1243:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1251:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1252:43: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1256:41: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/selection_experiment.py:1259:49: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1283:71: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1291:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1292:76: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1297:11: F541 f-string is missing placeholders +./build/lib/tfscreen/simulate/selection_experiment.py:1302:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1319:6: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/simulate/selection_experiment.py:1326:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1327:48: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1328:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1329:33: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1332:1: W391 blank line at end of file +./build/lib/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) +./build/lib/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (18) +./build/lib/tfscreen/simulate/thermo_to_growth.py:626:41: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/__init__.py:2:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:3:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:18:65: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:22:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:23:19: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:26:66: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:30:72: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:33:26: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:37:37: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:40:9: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:41:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:43:56: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:46:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:33:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:34:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:35:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:119:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:120:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:121:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:122:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:474:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:511:1: C901 'summarize_sbc' is too complex (16) +./build/lib/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/extraction.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/extraction.py:103:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:182:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:260:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:261:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:262:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:317:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:369:1: C901 'extract_growth_predictions' is too complex (11) +./build/lib/tfscreen/tfmodel/analysis/extraction.py:468:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:487:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:489:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:490:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:41:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/prediction.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:71:1: C901 'copy_orchestrator' is too complex (11) +./build/lib/tfscreen/tfmodel/analysis/prediction.py:198:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:244:1: C901 'predict' is too complex (22) +./build/lib/tfscreen/tfmodel/analysis/prediction.py:305:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:371:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:374:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:379:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:382:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:383:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:387:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:394:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:403:58: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/analysis/prediction.py:406:26: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:406:26: E117 over-indented +./build/lib/tfscreen/tfmodel/analysis/prediction.py:409:25: E122 continuation line missing indentation or outdented +./build/lib/tfscreen/tfmodel/analysis/prediction.py:415:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prior_predictive.py:104:33: E203 whitespace before ':' +./build/lib/tfscreen/tfmodel/configuration_io.py:19:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (31) +./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:190:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:193:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:195:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:196:40: E713 test for membership should be 'not in' +./build/lib/tfscreen/tfmodel/configuration_io.py:202:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:203:31: E713 test for membership should be 'not in' +./build/lib/tfscreen/tfmodel/configuration_io.py:209:18: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:225:33: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/configuration_io.py:237:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:251:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:251:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/configuration_io.py:253:1: C901 'read_configuration' is too complex (20) +./build/lib/tfscreen/tfmodel/configuration_io.py:253:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:289:128: E501 line too long (139 > 127 characters) +./build/lib/tfscreen/tfmodel/configuration_io.py:297:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:298:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:299:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:300:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:306:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:318:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:333:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:338:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/data_class.py:42:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:104:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/data_class.py:121:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:123:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:214:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/data_class.py:221:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:222:5: E266 too many leading '#' for block comment +./build/lib/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:17:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:48:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:51:45: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:59:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:60:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:71:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:78:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:108:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:47:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:100:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:104:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:108:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:118:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:57: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:126:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:164:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:166:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:170:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:178:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:182:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:57: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:210:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:246:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:250:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:269:7: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:54:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:112:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:24:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:63:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:64:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:65:38: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:66:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:71:45: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:76:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:88:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:96:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:104:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:105:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:117:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:120:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:121:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:64: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:39: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:126:39: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:127:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:129:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:131:67: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:134:38: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:135:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:137:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:146:45: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:151:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:163:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:175:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:185:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:219:64: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:220:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:224:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:243:7: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:72:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:141:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:19:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:33:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:42:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:45:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:53:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:63:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:70:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:82:21: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:84:47: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:93:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:98:14: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:38:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:39:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:42:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:43:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:49:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:96:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:100:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:105:106: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:108:33: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:111:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:113:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:121:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:169:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:170:80: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:83: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:97: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:175:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:177:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:178:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:179:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:183:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:189:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:197:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:203:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:221:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:267:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:269:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:277:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:284:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:287:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:292:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:307:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:309:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:311:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:312:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:313:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:314:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:316:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:317:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:319:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:320:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:323:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:334:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:335:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:336:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:343:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:344:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:345:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:348:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:351:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:352:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:355:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:358:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:362:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:92:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:237:40: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:260:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:274:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:280:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:282:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:283:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:284:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:285:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:286:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:287:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:288:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:289:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:290:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:313:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:135:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:23:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:52:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:53:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:73:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:79:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:40:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:41:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:42:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:95:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:101:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:213:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:230:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:295:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:333:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:370:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:420:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:421:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:422:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:423:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:424:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:425:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:426:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:427:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:428:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:449:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:450:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:452:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:474:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:483:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:488:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:491:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:505:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:508:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:518:46: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:562:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:567:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:568:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:569:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:584:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:588:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:592:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:593:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:595:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:599:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:609:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:134:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:239:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:275:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:317:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:318:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:319:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:320:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:321:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:322:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:323:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:324:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:325:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:326:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:344:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:345:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:378:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:383:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:384:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:385:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:396:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:402:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:403:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:405:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:423:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:435:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:10:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:27:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:28:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:67:6: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:89:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:93:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:94:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:95:65: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:96:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:97:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:102:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:107:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:120:41: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:129:68: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:133:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:136:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:158:26: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:175:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:185:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:194:48: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:18:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:19:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:47:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:95:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:104:48: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:126:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:225:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:282:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:285:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:415:41: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:454:27: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:507:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:545:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:549:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:550:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:552:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:553:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:567:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:573:18: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:160:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:166:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:167:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:170:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:176:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:178:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:179:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:182:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:186:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:259:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:261:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:262:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:74: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:269:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:270:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:271:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:274:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:312:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:321:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:326:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:330:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:335:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:339:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:344:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:349:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:353:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:357:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:361:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:369:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:372:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:375:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:378:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:384:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:388:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:390:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:74: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:399:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:400:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:401:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:403:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:405:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:464:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:466:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:469:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:482:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:484:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:485:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:490:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:492:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:493:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:498:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:500:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:501:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:506:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:508:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:509:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:514:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:516:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:517:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:520:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:521:70: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:522:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:526:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:14: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:565:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:568:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:571:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:572:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:598:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:599:50: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:600:46: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:602:50: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:603:52: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:604:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:606:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:607:51: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:608:47: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:610:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:611:51: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:612:47: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:632:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:666:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:674:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:675:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:676:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:678:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:680:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:683:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:685:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:686:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:771:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:773:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:774:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:777:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:779:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:780:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:792:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:820:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:882:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:885:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:193:76: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:300:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:301:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:302:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:38: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:367:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:370:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:608:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:610:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:611:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:73: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:71: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:71: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:700:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:702:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:705:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:714:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:748:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:750:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:751:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:755:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:756:70: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:757:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:761:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:14: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:846:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1013:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1015:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1016:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1017:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1018:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1019:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1020:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1029:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1031:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1032:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1033:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1035:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1036:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1040:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1042:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1043:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1086:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1141:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1154:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1157:14: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:188:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:189:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:190:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:386:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:387:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:396:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:399:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:401:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:403:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:409:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:411:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:414:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:416:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:422:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:424:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:426:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:429:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:430:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:431:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:432:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:444:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:446:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:447:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:473:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:474:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:496:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:497:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:498:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:499:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:501:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:505:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:506:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:507:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:508:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:510:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:514:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:516:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:519:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:523:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:529:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:533:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:534:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:535:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:536:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:539:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:540:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:600:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:603:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:607:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:610:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:614:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:633:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:649:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:650:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:662:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:663:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:664:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:665:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:666:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:667:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:668:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:669:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:670:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:671:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:797:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:798:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:799:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:801:12: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:85:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:222:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:223:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:228:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:229:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:233:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:234:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:260:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:270:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:332:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:337:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:339:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:343:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:347:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:349:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:351:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:353:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:364:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:406:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:408:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:410:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:411:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:412:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:414:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:418:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:431:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:434:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:435:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:471:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:479:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:481:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:482:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:483:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:484:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:485:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:486:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:497:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:498:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:499:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:500:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:501:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:504:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:505:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:516:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:518:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:556:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:105:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:259:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:264:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:267:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:270:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:271:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:305:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:320:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:363:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:388:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:389:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:392:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:396:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:400:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:402:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:404:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:406:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:408:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:423:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:465:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:467:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:469:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:470:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:471:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:473:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:477:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:490:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:493:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:494:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:515:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:536:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:539:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:542:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:546:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:550:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:563:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:565:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:566:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:567:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:578:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:579:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:580:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:582:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:585:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:586:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:717:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:757:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:181:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:268:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:298:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:366:17: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:183:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:184:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:185:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:240:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:393:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:394:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:408:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:410:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:412:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:414:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:415:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:420:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:422:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:425:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:427:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:433:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:435:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:437:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:439:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:440:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:442:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:443:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:444:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:445:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:457:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:459:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:460:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:481:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:485:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:489:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:512:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:513:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:514:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:515:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:517:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:521:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:522:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:523:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:524:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:526:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:530:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:532:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:535:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:539:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:545:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:549:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:550:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:551:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:552:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:555:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:556:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:618:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:621:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:625:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:628:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:632:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:635:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:636:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:653:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:655:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:674:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:675:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:687:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:688:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:689:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:690:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:691:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:692:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:693:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:694:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:695:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:696:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:770:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:778:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:786:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:806:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:826:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:827:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:828:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:830:12: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:242:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:248:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:249:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:253:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:254:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:297:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:365:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:369:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:371:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:374:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:378:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:380:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:382:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:386:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:395:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:441:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:444:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:445:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:446:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:447:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:449:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:453:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:466:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:469:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:470:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:507:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:513:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:519:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:520:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:521:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:522:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:523:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:524:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:525:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:537:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:538:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:539:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:540:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:541:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:542:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:545:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:546:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:557:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:559:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:597:25: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:690:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:707:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:708:38: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:727:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:104:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:258:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:263:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:266:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:269:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:270:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:309:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:324:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:368:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:393:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:394:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:397:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:401:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:405:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:407:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:409:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:411:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:413:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:417:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:432:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:478:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:480:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:482:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:483:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:484:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:486:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:490:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:503:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:506:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:507:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:529:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:544:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:546:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:548:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:550:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:552:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:556:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:564:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:566:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:567:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:568:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:578:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:580:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:582:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:583:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:584:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:587:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:588:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:666:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:701:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:722:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:762:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:104:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:155:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:229:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:245:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:275:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:335:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:352:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:359:15: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:236:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:237:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:238:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:276:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:299:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:535:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:571:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:575:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:577:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:578:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:579:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:591:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:592:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:602:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:603:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:604:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:605:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:606:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:607:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:608:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:609:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:679:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:684:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:696:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:699:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:704:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:168:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:200:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:201:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:206:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:207:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:239:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:272:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:290:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:296:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:301:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:304:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:306:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:357:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:359:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:361:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:362:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:363:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:365:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:382:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:385:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:386:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:403:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:416:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:420:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:421:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:422:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:423:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:424:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:426:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:436:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:437:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:438:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:439:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:442:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:443:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:514:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:518:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:530:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:533:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:537:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:555:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:557:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:182:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:190:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:231:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:250:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:252:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:269:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:292:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:302:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:304:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:306:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:330:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:332:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:333:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:334:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:336:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:358:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:363:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:380:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:384:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:395:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:397:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:405:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:418:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:420:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:428:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:432:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:438:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:443:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:444:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:445:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:448:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:449:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:450:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:451:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:521:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:525:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:537:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:540:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:544:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:562:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:133:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:137:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:142:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:143:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:165:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:233:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:236:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:242:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:248:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:274:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:341:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:355:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:360:15: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:160:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:198:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:199:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:221:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:222:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:264:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:269:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:273:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:275:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:23: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:284:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:286:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:288:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:290:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:308:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:310:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:311:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:312:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:128: E501 line too long (140 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:316:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:128: E501 line too long (140 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:324:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:327:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:330:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:336:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:344:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:360:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:361:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:393:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:394:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:395:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:396:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:397:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:398:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:399:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:402:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:412:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:413:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:424:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:425:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:426:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:427:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:428:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:429:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:430:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:431:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:484:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:489:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:490:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:495:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:498:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:502:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:503:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:108:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:111:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:135:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:136:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:141:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:142:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:171:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:205:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:223:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:229:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:234:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:236:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:238:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:240:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:241:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:242:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:247:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:264:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:281:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:284:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:285:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:286:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:287:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:293:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:306:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:309:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:310:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:327:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:343:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:344:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:345:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:346:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:347:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:348:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:349:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:361:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:362:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:363:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:364:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:365:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:368:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:369:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:423:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:428:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:434:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:439:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:442:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:446:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:465:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:124:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:132:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:165:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:174:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:176:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:196:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:197:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:214:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:231:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:237:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:246:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:248:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:250:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:251:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:272:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:274:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:278:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:296:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:297:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:298:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:300:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:314:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:318:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:319:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:331:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:340:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:352:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:354:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:357:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:358:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:359:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:362:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:363:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:364:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:376:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:377:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:378:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:379:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:382:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:383:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:384:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:385:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:437:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:438:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:442:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:446:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:449:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:454:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:457:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:461:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:480:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:115:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:116:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:121:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:126:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:127:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:144:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:210:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:211:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:214:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:220:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:226:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:248:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:308:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:322:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:323:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:327:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:328:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:99:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:110:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:111:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:112:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:76:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:91:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:102:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:86:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:115:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:171:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:181:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/nn.py:62:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:15:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:33:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:66:68: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:72:31: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:82:72: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:116:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:126:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:136:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:142:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:147:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:155:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:157:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:161:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:165:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:169:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:172:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:174:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:184:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:187:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:191:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:212:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:221:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:229:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:250:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:259:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:285:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:287:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:311:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:332:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:344:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:348:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:371:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:394:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:401:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:426:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:430:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:433:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:435:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:437:21: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:460:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:462:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:463:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:464:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:466:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:470:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:473:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:40:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:21:25: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:24:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:32:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:35:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:40:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:46:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:52:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/model.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/model.py:44:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/model.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/model.py:104:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:105:24: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:105:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:134:36: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:135:24: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:135:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:195:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/model.py:196:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/model.py:239:28: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:240:28: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:246:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:82: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:51:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:67:11: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:68: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:89: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:73:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:95:5: F841 local variable 'nu' is assigned to but never used +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:97:11: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/registry.py:57:29: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/registry.py:58:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/registry.py:61:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:62:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:63:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:64:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:66:14: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:67:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:68:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:70:14: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:71:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:72:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:74:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:75:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:76:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:77:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:78:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:79:24: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:81:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:86:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:90:12: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:91:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:92:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:93:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:94:19: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:95:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:96:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:97:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:98:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:99:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:100:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:101:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:102:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:103:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:104:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:105:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:106:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:108:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:109:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:110:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:111:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:113:26: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:114:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:115:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:117:19: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:118:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:119:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:121:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:122:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:123:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:125:24: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:126:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:127:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:128:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:129:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:130:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:131:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:133:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:134:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: C901 'load_posteriors' is too complex (12) +./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/inference/posteriors.py:117:17: F841 local variable 'e' is assigned to but never used +./build/lib/tfscreen/tfmodel/inference/run_inference.py:21:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:29:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:30:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:31:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:32:1: E302 expected 2 blank lines, found 0 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:35:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:36:69: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:22: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:28: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:57:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:63:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:65:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:79:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:87:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:93:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:98:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:105:34: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:107:87: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:123:58: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:124:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:129:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:132:5: C901 'RunInference.run_optimization' is too complex (18) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:223:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:224:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:238:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:241:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:242:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:251:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:253:53: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:261:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:288:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:299:48: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:304:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:308:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:318:128: E501 line too long (177 > 127 characters) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:324:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:325:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:332:60: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:346:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:347:50: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/inference/run_inference.py:718:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:753:31: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:765:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:766:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:31: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:787:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:788:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:789:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:790:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:791:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:798:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:799:31: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:881:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:895:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:898:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:899:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:908:36: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:915:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:915:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:917:61: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:966:5: E303 too many blank lines (4) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:26: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1010:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1022:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1024:32: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1024:42: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1075:5: C901 'RunInference.get_map_posteriors' is too complex (13) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1313:50: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1354:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1357:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1370:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1374:30: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1377:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1381:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1387:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:37:1: E303 too many blank lines (3) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:71:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:74:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:25: E222 multiple spaces after operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:79:42: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:83:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:83:88: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:30: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:63: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:104:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:118:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:123:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:125:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/model_orchestrator.py:208:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:211:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:211:73: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:214:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:215:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:216:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:217:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:219:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:220:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:221:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:222:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:225:63: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:226:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:227:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:237:63: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:42: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:68: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:243:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:72: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:286:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:295:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:295:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:296:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:299:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:305:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:334:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/model_orchestrator.py:366:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:367:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:368:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:370:23: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:371:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:372:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:376:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:455:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:520:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:523:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:528:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:529:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:536:30: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:540:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:556:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:557:1: E303 too many blank lines (3) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:577:82: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:582:87: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:585:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:590:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:672:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:672:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:697:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:698:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:700:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:48: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:702:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:702:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:703:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:707:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:708:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:713:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:720:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:722:10: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:722:10: E116 unexpected indentation (comment) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:724:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:727:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:729:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:731:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:743:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:751:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:773:38: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:774:41: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:774:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:775:44: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:775:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:776:40: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:776:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:777:46: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:777:71: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:779:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:786:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:798:40: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:844:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:845:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:846:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:847:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:887:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:890:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:891:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:892:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:896:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:897:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:898:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:899:38: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:901:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:912:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:912:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:915:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:916:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:921:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:922:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:923:58: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:925:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:938:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:941:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:947:86: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:949:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:956:77: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1012:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1013:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1014:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1015:39: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1022:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1024:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1100:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1101:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1103:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1176:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1196:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1198:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1199:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1201:68: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1202:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1203:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1204:40: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1221:42: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1222:43: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:40: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:53: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1292:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1295:69: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1299:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1301:69: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1311:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1313:9: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1366:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1371:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1385:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1395:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1405:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1419:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1422:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1451:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1463:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1475:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1481:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1482:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1483:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1484:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1485:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1486:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1487:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1488:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1489:29: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1490:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1491:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1492:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1493:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1494:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1495:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:192:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:193:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:194:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:195:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:196:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:197:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:198:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:199:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:200:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:201:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:202:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:203:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:204:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:205:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:223:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:225:59: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:226:58: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:227:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:228:55: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:229:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:230:59: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:231:63: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:232:55: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:234:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:124:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:126:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:130:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:245:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:247:51: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:251:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:514:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:516:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:517:53: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:518:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:519:66: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:520:66: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:521:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:522:65: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:523:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:524:72: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:525:74: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:527:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used +./build/lib/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:106:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:107:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:198:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:199:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:204:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:268:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:269:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:270:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:273:1: C901 '_inject_calibration_priors' is too complex (21) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:464:1: C901 '_build_csv_updates' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:522:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:523:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:662:1: C901 '_apply_guesses_updates' is too complex (12) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:814:1: E303 too many blank lines (3) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:818:1: E302 expected 2 blank lines, found 3 +./build/lib/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) +./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) +./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:521:1: C901 'summarize_fit' is too complex (59) +./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) +./build/lib/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/batch.py:44:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:46:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:47:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:48:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:49:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:50:69: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:51:69: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:52:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:53:67: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:86:63: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:95:28: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:101:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:22: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:27: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:80:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:107:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:111:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:113:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:118:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:119:50: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:148:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:161:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:179:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:183:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:184:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:200:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:204:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:236:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:238:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:244:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:282:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:295:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:302:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:308:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:314:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:315:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:320:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:321:55: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:322:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:331:34: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:334:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:339:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:357:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:361:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:365:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:366:55: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:367:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:377:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:379:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:395:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:398:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:405:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:409:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:410:82: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:422:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:429:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:435:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:451:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:452:43: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:458:66: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:460:51: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:466:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:467:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:469:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:476:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:477:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:487:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:493:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:502:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:512:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:517:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:528:1: W391 blank line at end of file +./build/lib/tfscreen/util/__init__.py:71:2: W292 no newline at end of file +./build/lib/tfscreen/util/cli/__init__.py:16:1: W391 blank line at end of file +./build/lib/tfscreen/util/cli/generalized_main.py:1:11: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:5:1: C901 'generalized_main' is too complex (15) +./build/lib/tfscreen/util/cli/generalized_main.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/cli/generalized_main.py:13:78: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:14:46: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:24:69: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:27:51: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:30:51: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:57:77: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:58:36: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:69:30: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:75:74: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:85:58: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:87:34: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:87:48: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:92:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:94:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:97:39: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:104:45: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:104:59: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:104:75: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:105:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/__init__.py:28:2: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/add_group_columns.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/add_group_columns.py:8:79: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:9:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:10:82: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:12:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:13:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:25:75: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:42:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:43:12: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:47:36: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:52:29: E211 whitespace before '(' +./build/lib/tfscreen/util/dataframe/add_group_columns.py:65:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:70:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:73:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:80:51: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:81:51: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:90:21: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/check_columns.py:4:1: E303 too many blank lines (3) +./build/lib/tfscreen/util/dataframe/check_columns.py:4:21: E231 missing whitespace after ',' +./build/lib/tfscreen/util/dataframe/check_columns.py:35:30: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:3:1: F811 redefinition of unused 'np' from line 1 +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:74:44: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:63:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:65:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:68:5: E303 too many blank lines (2) +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:89:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:90:76: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:91:22: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:105:36: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:111:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:112:24: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:62:1: W391 blank line at end of file +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:80:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:95:37: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:9:14: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: C901 'get_scaled_cfu' is too complex (17) +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:62:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:76:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:130:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:131:14: W292 no newline at end of file +./build/lib/tfscreen/util/io/read_dataframe.py:7:1: C901 'read_dataframe' is too complex (16) +./build/lib/tfscreen/util/io/read_dataframe.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/io/read_dataframe.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/io/read_dataframe.py:84:27: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/util/io/read_dataframe.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/io/read_dataframe.py:102:14: W292 no newline at end of file +./build/lib/tfscreen/util/io/read_yaml.py:31:1: C901 'read_yaml' is too complex (12) +./build/lib/tfscreen/util/numerical/array_search.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/array_search.py:48:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/array_search.py:80:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:82:31: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/numerical/array_search.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:97:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:98:37: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/broadcast_args.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/broadcast_args.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/broadcast_args.py:90:1: W391 blank line at end of file +./build/lib/tfscreen/util/numerical/padding.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/padding.py:29:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:34:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:41:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:43:48: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/padding.py:44:36: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/padding.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:50:30: E203 whitespace before ':' +./build/lib/tfscreen/util/numerical/padding.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:53:21: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/transform.py:10:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/transform.py:189:36: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/xfill.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/xfill.py:14:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:32:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:58:14: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/util/numerical/xfill.py:58:14: E117 over-indented +./build/lib/tfscreen/util/numerical/xfill.py:58:29: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/numerical/xfill.py:79:20: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:50:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:57:22: E231 missing whitespace after ',' +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:70:71: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:71:34: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:74:23: W292 no newline at end of file +./build/lib/tfscreen/util/validation/check.py:37:1: C901 'check_number' is too complex (12) +./build/lib/tfscreen/util/validation/check.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/validation/check.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/validation/check.py:118:18: W292 no newline at end of file ./scripts/generate_struct_ensemble.py:266:11: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:272:24: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:433:18: E221 multiple spaces before operator @@ -1464,6 +5333,13 @@ ./src/tfscreen/tfmodel/__init__.py:41:77: W291 trailing whitespace ./src/tfscreen/tfmodel/__init__.py:43:56: W291 trailing whitespace ./src/tfscreen/tfmodel/__init__.py:46:1: W391 blank line at end of file +./src/tfscreen/tfmodel/analysis/batch_sizing.py:33:34: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:34:34: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:35:34: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:119:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:120:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:121:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/batch_sizing.py:122:35: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/analysis/error_calibration.py:474:32: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/analysis/error_calibration.py:511:1: C901 'summarize_sbc' is too complex (16) ./src/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace @@ -1483,23 +5359,22 @@ ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator ./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: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/prediction.py:13:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/prediction.py:72:1: C901 'copy_orchestrator' is too complex (11) +./src/tfscreen/tfmodel/analysis/prediction.py:199:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/prediction.py:306:1: C901 'predict' is too complex (24) +./src/tfscreen/tfmodel/analysis/prediction.py:449:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:452:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:457:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:460:67: W291 trailing whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:461:76: W291 trailing whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:465:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:472:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:481:58: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/analysis/prediction.py:484:26: E111 indentation is not a multiple of 4 +./src/tfscreen/tfmodel/analysis/prediction.py:484:26: E117 over-indented +./src/tfscreen/tfmodel/analysis/prediction.py:487:25: E122 continuation line missing indentation or outdented +./src/tfscreen/tfmodel/analysis/prediction.py:493: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 @@ -1531,12 +5406,12 @@ ./src/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) ./src/tfscreen/tfmodel/data_class.py:42:76: W291 trailing whitespace -./src/tfscreen/tfmodel/data_class.py:104:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/data_class.py:121:49: W291 trailing whitespace -./src/tfscreen/tfmodel/data_class.py:123:76: W291 trailing whitespace -./src/tfscreen/tfmodel/data_class.py:214:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/data_class.py:221:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/data_class.py:222:5: E266 too many leading '#' for block comment +./src/tfscreen/tfmodel/data_class.py:116:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/data_class.py:133:49: W291 trailing whitespace +./src/tfscreen/tfmodel/data_class.py:135:76: W291 trailing whitespace +./src/tfscreen/tfmodel/data_class.py:226:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/data_class.py:233:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/data_class.py:234:5: E266 too many leading '#' for block comment ./src/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 @@ -3124,66 +6999,60 @@ ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:66:68: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:72:31: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:82:72: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:116:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:118:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:122:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:126:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:136:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:142:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:147:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:155:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:157:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:161:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:165:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:169:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:172:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:174:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:131:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:156:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:162:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:167:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:175:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:184:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:187:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:191:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:212:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:221:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:229:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:250:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:259:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:285:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:28: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:287:35: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:311:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:332:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:344:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:21: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:348:28: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:371:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:394:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:401:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:181:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:185:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:189:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:192:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:194:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:197:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:204:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:207:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:211:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:232:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:241:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:249:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:270:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:279:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:305:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:28: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:307:35: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:331:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:352:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:364:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:21: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:368:28: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:391:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:414:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:426:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:430:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:433:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:435:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:437:21: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:460:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:462:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:463:54: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:464:79: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:466:74: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:470:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:473:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:441:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:446:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:450:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:453:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:455:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:457:21: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:480:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:482:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:483:54: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:484:79: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:486:74: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:490:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:493:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:40:36: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:46:36: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 @@ -3194,24 +7063,23 @@ ./src/tfscreen/tfmodel/generative/components/transformation/single.py:23:21: W291 trailing whitespace ./src/tfscreen/tfmodel/generative/components/transformation/single.py:24:28: W291 trailing whitespace ./src/tfscreen/tfmodel/generative/components/transformation/single.py:32:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/single.py:35:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/single.py:40:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/single.py:46:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/single.py:52:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/single.py:45:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/single.py:51:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/single.py:57:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/model.py:12:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/model.py:44:54: W291 trailing whitespace ./src/tfscreen/tfmodel/generative/model.py:46:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/model.py:104:37: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:105:24: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:105:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:134:36: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:135:24: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:135:44: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:195:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/model.py:196:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/model.py:239:28: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:240:28: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:246:1: W391 blank line at end of file +./src/tfscreen/tfmodel/generative/model.py:105:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:106:24: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:106:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:135:36: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:136:24: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:136:44: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:232:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/model.py:233:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/model.py:276:28: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:277:28: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:283:1: W391 blank line at end of file ./src/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' @@ -3338,58 +7206,48 @@ ./src/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) ./src/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/inference/run_inference.py:445:5: C901 'RunInference.get_posteriors' is too complex (18) -./src/tfscreen/tfmodel/inference/run_inference.py:488:59: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:504:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:519:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:533:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:535:71: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:579:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:597:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:613:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:615:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/inference/run_inference.py:615:37: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:615:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:648:31: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:660:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:661:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:668:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/inference/run_inference.py:668:31: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:668:41: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:682:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:683:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:684:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:685:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:686:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:693:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:694:31: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:776:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:790:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:793:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:794:49: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:803:36: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:810:27: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:810:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:812:61: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:861:5: E303 too many blank lines (4) -./src/tfscreen/tfmodel/inference/run_inference.py:902:26: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:902:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:905:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:917:41: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:919:32: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:919:42: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:970:5: C901 'RunInference.get_map_posteriors' is too complex (13) -./src/tfscreen/tfmodel/inference/run_inference.py:1208:50: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/inference/run_inference.py:1249:29: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1252:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1257:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1265:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1269:30: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1272:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1276:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1282:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1285:5: C901 'RunInference.get_laplace_posteriors' is too complex (16) -./src/tfscreen/tfmodel/inference/run_inference.py:1495:5: C901 'RunInference.get_nuts_posteriors' is too complex (12) +./src/tfscreen/tfmodel/inference/run_inference.py:718:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:720:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/inference/run_inference.py:720:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:720:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:753:31: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:765:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:766:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:773:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/inference/run_inference.py:773:31: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:773:41: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:787:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:788:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:789:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:790:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:791:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:798:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:799:31: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:881:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:895:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:898:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:899:49: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:908:36: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:915:27: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:915:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:917:61: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:966:5: E303 too many blank lines (4) +./src/tfscreen/tfmodel/inference/run_inference.py:1007:26: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1007:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1010:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1022:41: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1024:32: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1024:42: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1075:5: C901 'RunInference.get_map_posteriors' is too complex (13) +./src/tfscreen/tfmodel/inference/run_inference.py:1313:50: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/inference/run_inference.py:1354:29: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1357:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1370:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1374:30: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1377:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1381:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1387:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:37:1: E303 too many blank lines (3) ./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 ',' @@ -3453,134 +7311,130 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:529:57: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:536:30: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:540:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:556:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:557:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/model_orchestrator.py:577:82: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:582:87: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:585:84: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:590:79: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:672:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) -./src/tfscreen/tfmodel/model_orchestrator.py:672:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:697:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:698:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:700:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:701:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:701:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:701:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:702:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:702:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:703:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:707:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:708:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:713:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:720:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:722:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:722:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:724:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:727:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:729:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:731:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:743:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:751:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:773:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:774:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:774:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:775:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:775:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:776:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:776:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:777:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:777:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:779:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:786:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:791:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:791:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:791:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:798:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:844:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:845:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:846:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:847:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:887:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:890:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:891:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:892:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:896:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:897:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:898:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:899:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:901:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:912:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:912:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:915:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:916:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:921:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:922:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:923:58: 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:934:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:938:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:941:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:947:86: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:949:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:956:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1012:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1013:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1014:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1015:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1022:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1024:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1100:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1101:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1103:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1176:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) -./src/tfscreen/tfmodel/model_orchestrator.py:1196:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1198:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1199:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1201:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1202:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1203:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1204:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1221:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1222:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1223:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1223:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1223:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1223:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1223:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1292:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1295:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1299:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1301:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1311:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1313:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1366:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1371:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1385:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1395:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1405:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1419:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1422:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1451:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:636:82: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:641:87: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:644:84: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:649:79: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:735:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:735:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:760:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:761:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:763:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:764:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:764:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:764:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:765:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:765:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:766:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:770:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:771:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:776:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:783:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:785:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:785:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:787:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:790:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:792:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:794:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:806:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:814:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:836:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:837:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:837:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:838:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:838:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:839:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:839:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:840:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:840:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:842:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:849:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:854:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:854:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:854:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:861:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:907:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:908:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:909:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:910:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:950:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:953:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:954:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:955:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:959:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:960:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:961:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:962:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:964:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:975:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:975:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:978:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:979:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:984:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:985:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:986:58: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:988:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:993:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:997:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1001:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1004:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1010:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1012:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1019:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1075:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1076:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1077:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1078:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1085:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1086:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1087:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1163:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1164:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1166:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1239:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) +./src/tfscreen/tfmodel/model_orchestrator.py:1259:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1261:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1262:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1264:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1265:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1266:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1267:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1284:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1285:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1355:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1358:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1379:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1381:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1434:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1439:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1453:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:1463:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1475:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1481:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1482:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1483:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1484:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1485:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1486:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1487:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1488:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1489:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1490:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1491:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1492:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1493:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1494:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1495:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1473:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1487:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1490:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1519:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1531:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1543:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1549:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1550:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1551:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1552:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1553:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1554:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1555:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1556:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1557:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1558:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1559:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1560:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1561:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1562:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1563: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 @@ -3620,19 +7474,20 @@ ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:245:39: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:247:51: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:251:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:511:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:513:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:514:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:515:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:516:66: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:517:66: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:514:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:516:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:517:53: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:518:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:519:65: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:520:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:521:72: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:522:74: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/fit_model_cli.py:524:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:122:5: F841 local variable 'binding_set' is assigned to but never used +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:519:66: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:520:66: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:521:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:522:65: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:523:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:524:72: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:525:74: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/fit_model_cli.py:527:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:106:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:107:23: E221 multiple spaces before operator @@ -4069,8 +7924,8 @@ ./tests/smoke-tests/test_prediction_smoke.py:69:1: W293 blank line contains whitespace ./tests/smoke-tests/test_prediction_smoke.py:81:33: E261 at least two spaces before inline comment ./tests/smoke-tests/test_prediction_smoke.py:85:1: W293 blank line contains whitespace -./tests/smoke-tests/test_prediction_smoke.py:93:1: W293 blank line contains whitespace -./tests/smoke-tests/test_prediction_smoke.py:101:50: W291 trailing whitespace +./tests/smoke-tests/test_prediction_smoke.py:99:1: W293 blank line contains whitespace +./tests/smoke-tests/test_prediction_smoke.py:107:50: W291 trailing whitespace ./tests/smoke-tests/test_run_growth_analysis_smoke.py:21:1: E302 expected 2 blank lines, found 1 ./tests/smoke-tests/test_run_growth_analysis_smoke.py:27:1: W293 blank line contains whitespace ./tests/smoke-tests/test_run_growth_analysis_smoke.py:37:1: W293 blank line contains whitespace @@ -5364,6 +9219,8 @@ ./tests/tfscreen/simulate/test_thermo_to_growth.py:229:35: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_thermo_to_growth.py:1437:1: E402 module level import not at top of file ./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_batch_sizing.py:123:40: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/analysis/test_batch_sizing.py:136:40: E127 continuation line over-indented for visual indent ./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 @@ -5484,18 +9341,17 @@ ./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/analysis/test_prediction.py:7:1: F401 'unittest.mock.MagicMock' imported but unused +./tests/tfscreen/tfmodel/analysis/test_prediction.py:7:1: F401 'unittest.mock.patch' imported but unused +./tests/tfscreen/tfmodel/analysis/test_prediction.py:18:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:45:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:54:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:66:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:76:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:80:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:83:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:87:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:97: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 @@ -5884,6 +9740,7 @@ ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:200:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:220:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:379:44: W292 no newline at end of file +./tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py:30:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:4:1: F401 'numpyro.distributions as dist' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:5:1: F401 'numpyro.handlers.trace' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:41:1: E302 expected 2 blank lines, found 1 @@ -6510,15 +10367,15 @@ ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:103:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:104:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:109:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:126:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:131:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:135:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:141:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:148:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:161:1: W293 blank line contains whitespace -./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.py:202:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:207:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:211:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:217:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:224:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:237:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:242:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:245:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:261: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 @@ -6680,49 +10537,51 @@ ./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:18:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:39:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:46:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:60:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:77:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:84:47: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:85:61: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:86:53: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:87:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:92:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:95:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:98:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:99:61: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:100:49: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:101:48: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:102:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:103:67: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:107:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:138:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:151:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:158:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:162:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:165:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:168:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:173:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/test_model.py:176:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:179:76: W291 trailing 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:187:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:193:25: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/test_model.py:197:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:203:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:205:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:207:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:210:42: E261 at least two spaces before inline comment ./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.py:222:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/test_model.py:231:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:234:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:240:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:245:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/test_model.py:329:61: 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_model_math.py:128:27: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/generative/test_model_math.py:129:27: E128 continuation line under-indented for visual indent ./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 @@ -6954,61 +10813,35 @@ ./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:185:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:425:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:429:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:434:5: E722 do not use bare 'except' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:436:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:439:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:442: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:449:128: E501 line too long (131 > 127 characters) ./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/inference/test_run_inference.py:459:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:500:32: E741 ambiguous variable name 'l' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:602:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:605:5: F841 local variable 'mock_seed' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_run_inference.py:606:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:614:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:619:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:623:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:627:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:631:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:635:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:638:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:646:1: E303 too many blank lines (3) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:655:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:662:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:735:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1118:25: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1118:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1119: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 @@ -7110,9 +10943,8 @@ ./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 -./tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py:274:35: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_predict_growth_cli.py:299:35: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_predict_theta_cli.py:4:1: F401 'os' imported but unused ./tests/tfscreen/tfmodel/scripts/test_predict_theta_cli.py:7:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/scripts/test_predict_theta_cli.py:8:1: F401 'unittest.mock.call' imported but unused @@ -7277,87 +11109,88 @@ ./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: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:299:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:322:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:328:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:330:76: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:353:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:361:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:362:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:372:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:48: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:50: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:52: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:54: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:56: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:377:58: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:378:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:386:112: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:386:128: E501 line too long (191 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:391:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:394:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:398:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:405:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:424:128: E501 line too long (198 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:429:128: E501 line too long (167 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:477:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:478:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:481:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:489:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:495:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:496:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:498:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:500:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:512:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:517:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:525:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:533:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:544:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:547:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:554:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:561:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:569:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:574:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:579:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:585:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:594:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:598:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:608:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:609:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:611:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:612:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:624:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:626:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:630:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:639:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:640:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:643:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:646:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:909:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1306:34: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1550:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1557:10: W292 no newline at end of file +./tests/tfscreen/tfmodel/test_model_orchestrator.py:34:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:53:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:62:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:78:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:86:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:99:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:109:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:115:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:119:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:131:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:154:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:171: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:456:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:602:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:603:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:606:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:614:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:621:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:623:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:625:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:637:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:642:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:650:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:658:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:669:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:672:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:679:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:686:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:694:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:699:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:704:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:710:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:719:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:723:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:733:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:734:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:736:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:737:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:749:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:755:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:764:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:765:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:768:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:771:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1034:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1431:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1675:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1682: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 @@ -7660,52 +11493,52 @@ ./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 -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) -11 E117 over-indented -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 -186 E127 continuation line over-indented for visual indent -78 E128 continuation line under-indented for visual indent +92 C901 'cat_fit' is too complex (19) +20 E111 indentation is not a multiple of 4 +9 E114 indentation is not a multiple of 4 (comment) +8 E116 unexpected indentation (comment) +16 E117 over-indented +2 E122 continuation line missing indentation or outdented +3 E124 closing bracket does not match visual indentation +12 E125 continuation line with same indent as next logical line +246 E127 continuation line over-indented for visual indent +141 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 ',' -4 E211 whitespace before '(' -1833 E221 multiple spaces before operator -26 E222 multiple spaces after operator -8 E225 missing whitespace around operator -1102 E231 missing whitespace after ',' -103 E251 unexpected spaces around keyword / parameter equals -14 E252 missing whitespace around parameter equals -225 E261 at least two spaces before inline comment -1 E262 inline comment should start with '# ' +72 E201 whitespace after '[' +48 E202 whitespace before ']' +10 E203 whitespace before ',' +8 E211 whitespace before '(' +3021 E221 multiple spaces before operator +27 E222 multiple spaces after operator +16 E225 missing whitespace around operator +1990 E231 missing whitespace after ',' +127 E251 unexpected spaces around keyword / parameter equals +28 E252 missing whitespace around parameter equals +236 E261 at least two spaces before inline comment +2 E262 inline comment should start with '# ' 2 E265 block comment should start with '# ' -2 E266 too many leading '#' for block comment +3 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword -1 E301 expected 1 blank line, found 0 -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 +2 E301 expected 1 blank line, found 0 +953 E302 expected 2 blank lines, found 1 +91 E303 too many blank lines (2) +24 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 -37 E402 module level import not at top of file -84 E501 line too long (145 > 127 characters) -46 E701 multiple statements on one line (colon) -5 E712 comparison to True should be 'if cond is True:' or 'if cond:' -2 E713 test for membership should be 'not in' +2 E401 multiple imports on one line +54 E402 module level import not at top of file +137 E501 line too long (145 > 127 characters) +60 E701 multiple statements on one line (colon) +7 E712 comparison to True should be 'if cond is True:' or 'if cond:' +4 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def -20 E741 ambiguous variable name 'l' -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 -42 F841 local variable 'e' is assigned to but never used -638 W291 trailing whitespace -86 W292 no newline at end of file -1630 W293 blank line contains whitespace -30 W391 blank line at end of file -7662 +27 E741 ambiguous variable name 'l' +281 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +18 F541 f-string is missing placeholders +5 F811 redefinition of unused 'np' from line 1 +56 F841 local variable 'e' is assigned to but never used +1079 W291 trailing whitespace +134 W292 no newline at end of file +2188 W293 blank line contains whitespace +51 W391 blank line at end of file +11495 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 43fbb36d..3759cc2e 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/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 76108c77..50a18ec4 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -540,6 +540,21 @@ def test_model_orchestrator_rejects_categorical_geno_with_empirical(): ) +def test_check_theta_transformation_compatibility_binding_only_skips_check(): + """ + In binding-only mode jax_model returns before ever reaching the + transformation/congression code path (see generative/model.py's early + `if binding_only: ... return`), so the transformation setting is inert + and categorical_geno + empirical must be allowed. Regression test for + the smoke-test failure where tfs-configure-model's binding-only pipeline + (theta="categorical_geno", transformation left at its "empirical" + default) was incorrectly rejected by this check. + """ + _check_theta_transformation_compatibility( + "categorical_geno", "empirical", binding_only=True + ) + + def test_model_class_properties(initialized_model_class): model = initialized_model_class model._jax_model = "jm" From 9965669ffd0df87b341fcb87de06f382de49c6cf Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Fri, 3 Jul 2026 16:32:08 -0700 Subject: [PATCH 05/30] fixed batching bug in thermo models --- .../theta/thermo/O2_C12_K5_U0_a/thermo.py | 3 +- .../theta/thermo/O2_C12_K5_U1_a/thermo.py | 3 +- .../theta/thermo/O2_C4_K3_U0_a/thermo.py | 3 +- .../theta/thermo/O2_C4_K3_U1_a/thermo.py | 3 +- .../theta/test_full_population_contract.py | 85 ++++++++++++++++++- .../theta/thermo/O2_C12_K5_U0_a/test_PK.py | 3 + .../thermo/O2_C12_K5_U0_a/test_thermo.py | 55 ++++++++++-- .../theta/thermo/O2_C12_K5_U1_a/test_PK.py | 3 + .../thermo/O2_C12_K5_U1_a/test_thermo.py | 67 ++++++++++++--- .../theta/thermo/O2_C4_K3_U0_a/test_PK.py | 3 + .../theta/thermo/O2_C4_K3_U0_a/test_thermo.py | 48 ++++++++++- .../theta/thermo/O2_C4_K3_U1_a/test_PK.py | 3 + .../theta/thermo/O2_C4_K3_U1_a/test_thermo.py | 45 +++++++++- 13 files changed, 300 insertions(+), 24 deletions(-) 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 dcaa91c5..4ca4043d 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 @@ -206,7 +206,8 @@ def run_model(theta_param: ThetaParam, data) -> jnp.ndarray: theta_param.op_total, ) # (T, C, G) - theta_calc = theta_all[:, :, data.geno_theta_idx] # (T, C, num_obs) + geno_idx = data.batch_idx[data.geno_theta_idx] + theta_calc = theta_all[:, :, geno_idx] # (T, C, num_obs) if data.scatter_theta == 1: theta_calc = theta_calc[None, None, None, None, :, :, :] 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 258b2136..4e951875 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 @@ -181,7 +181,8 @@ def run_model(theta_param: ThetaParam, data) -> jnp.ndarray: theta_param.op_total, ) # (T, C, G) - theta_calc = theta_all[:, :, data.geno_theta_idx] # (T, C, num_obs) + geno_idx = data.batch_idx[data.geno_theta_idx] + theta_calc = theta_all[:, :, geno_idx] # (T, C, num_obs) if data.scatter_theta == 1: theta_calc = theta_calc[None, None, None, None, :, :, :] 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 853f9975..6d0e2b6b 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 @@ -192,7 +192,8 @@ def run_model(theta_param: ThetaParam, data) -> jnp.ndarray: theta_param.op_total, ) # (T, C, G) - theta_calc = theta_all[:, :, data.geno_theta_idx] # (T, C, num_obs) + geno_idx = data.batch_idx[data.geno_theta_idx] + theta_calc = theta_all[:, :, geno_idx] # (T, C, num_obs) if data.scatter_theta == 1: theta_calc = theta_calc[None, None, None, None, :, :, :] 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 bda89f8d..13975823 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 @@ -168,7 +168,8 @@ def run_model(theta_param: ThetaParam, data) -> jnp.ndarray: theta_param.op_total, ) # (T, C, G) - theta_calc = theta_all[:, :, data.geno_theta_idx] # (T, C, num_obs) + geno_idx = data.batch_idx[data.geno_theta_idx] + theta_calc = theta_all[:, :, geno_idx] # (T, C, num_obs) if data.scatter_theta == 1: theta_calc = theta_calc[None, None, None, None, :, :, :] diff --git a/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py b/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py index ea2f15c0..9bb64aa7 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py @@ -20,10 +20,14 @@ genotypes and subset_data.geno_theta_idx = arange(len(batch_idx)) — the convention tensors.batch.get_batch() always produces. -thermo.* components are intentionally NOT covered here — see the separate -follow-up investigating a suspected pre-existing batch_idx-composition bug -in their run_model. +thermo.* components (O2_C4_K3_U0_a, O2_C4_K3_U1_a, O2_C12_K5_U0_a, +O2_C12_K5_U1_a) previously violated this contract: run_model indexed +theta_all directly by geno_theta_idx without composing through batch_idx, +silently selecting the wrong (first-N-prefix) genotypes whenever batch_idx +was a non-trivial (batched or subset) selection. Fixed in thermo.py's +shared run_model; covered below alongside hill_mut/hill_geno. """ +import importlib from collections import namedtuple import jax.numpy as jnp @@ -152,3 +156,78 @@ def test_hill_geno_subset_matches_full_population_indexed_down(): expected = theta_full[:, :, subset_global_idx] assert jnp.allclose(theta_subset, expected) + + +# --------------------------------------------------------------------------- +# thermo.* (lac-dimer and MWC-dimer partition-function components) +# --------------------------------------------------------------------------- + +_ThermoData = namedtuple("_ThermoData", [ + "num_titrant_name", "num_genotype", "num_mutation", "num_pair", + "mut_nnz_mut_idx", "mut_nnz_geno_idx", "titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", +]) + + +def _thermo_full_data(): + """6 genotypes: wt(0), 4 single mutants(1-4), 1 double mutant(5).""" + num_genotype = 6 + mut_geno = jnp.array([ + [0, 1, 0, 0, 0, 1], # mutation A present in genotypes 1, 5 + [0, 0, 1, 0, 0, 0], # mutation B present in genotype 2 + [0, 0, 0, 1, 0, 0], # mutation C present in genotype 3 + [0, 0, 0, 0, 1, 1], # mutation D present in genotypes 4, 5 + ], dtype=float) + mut_nnz_mut_idx, mut_nnz_geno_idx = build_mut_sparse_indices(mut_geno) + + return _ThermoData( + num_titrant_name=1, + num_genotype=num_genotype, + num_mutation=4, + num_pair=0, + mut_nnz_mut_idx=mut_nnz_mut_idx, + mut_nnz_geno_idx=mut_nnz_geno_idx, + titrant_conc=jnp.array([0.0, 1e-5, 1e-4, 1e-3]), + batch_idx=jnp.arange(num_genotype, dtype=jnp.int32), + geno_theta_idx=jnp.arange(num_genotype, dtype=jnp.int32), + scatter_theta=0, + ) + + +# (variant subpackage name, mutation-delta-offset param suffix to perturb) +_THERMO_VARIANTS = [ + ("O2_C4_K3_U0_a", "d_ln_K_op_offset"), + ("O2_C4_K3_U1_a", "d_ln_K_op_offset"), + ("O2_C12_K5_U0_a", "d_ln_K_h_o_offset"), + ("O2_C12_K5_U1_a", "d_ln_K_h_o_offset"), +] + + +@pytest.mark.parametrize("variant,offset_suffix", _THERMO_VARIANTS) +def test_thermo_subset_matches_full_population_indexed_down(variant, offset_suffix): + PK = importlib.import_module( + f"tfscreen.tfmodel.generative.components.theta.thermo.{variant}.PK") + + full_data = _thermo_full_data() + name = "theta" + priors = PK.get_priors() + guesses = PK.get_guesses(name, full_data) + # Non-zero, non-symmetric offsets so genotypes are genuinely distinguishable. + guesses[f"{name}_{offset_suffix}"] = jnp.array([0.8, -1.2, 0.3, -0.5]) + + theta_param = substitute(PK.define_model, data=guesses)( + name=name, data=full_data, priors=priors) + + theta_full = PK.run_model(theta_param, full_data) # (T, C, 6) + + # Non-trivial (reordered, non-prefix) subset — exactly what get_batch() + # produces for idx=[4, 1, 5]: batch_idx=idx, geno_theta_idx=arange(3). + subset_global_idx = jnp.array([4, 1, 5], dtype=jnp.int32) + subset_data = full_data._replace( + batch_idx=subset_global_idx, + geno_theta_idx=jnp.arange(len(subset_global_idx), dtype=jnp.int32), + ) + theta_subset = PK.run_model(theta_param, subset_data) # (T, C, 3) + + expected = theta_full[:, :, subset_global_idx] + assert jnp.allclose(theta_subset, expected) diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py index bdb8a6a2..1befcdd3 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py @@ -68,6 +68,7 @@ def _make_pair_scatter(num_genotype=4): "num_genotype", "titrant_conc", "log_titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", "num_mutation", @@ -86,6 +87,7 @@ def mock_data_no_epi(): num_titrant_name=2, num_titrant_conc=len(_CONC), num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, num_pair=0, @@ -103,6 +105,7 @@ def mock_data_epi(): num_titrant_name=2, num_titrant_conc=len(_CONC), num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, num_pair=1, diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py index 4f1d0a10..a216b3a4 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py @@ -50,6 +50,7 @@ def _apo_theta(ln_K_h_l, ln_K_h_o, ln_K_l_o, tf_total): "num_titrant_conc", "num_genotype", "titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", ]) @@ -65,6 +66,7 @@ def mock_data(): num_titrant_conc=len(_CONC), num_genotype=G, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(G, dtype=jnp.int32), geno_theta_idx=jnp.arange(G, dtype=jnp.int32), scatter_theta=0, ) @@ -345,9 +347,11 @@ def test_geno_theta_idx_selects_genotypes(self): mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), conc_unit_scale=1.0, ) - # Select genotypes [3, 0] (reversed) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data = MockSmall(jnp.array([0.0, 1e-4]), jnp.array([3, 0], dtype=jnp.int32), 0) + # Select genotypes [3, 0] (reversed); batch_idx is identity (no + # minibatching), so geno_theta_idx indexes G directly. + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-4]), jnp.arange(G, dtype=jnp.int32), + jnp.array([3, 0], dtype=jnp.int32), 0) result = run_model(tp, data) # (T, C, 2) # Compute all-genotype theta for reference theta_all = _compute_theta( @@ -358,6 +362,46 @@ def test_geno_theta_idx_selects_genotypes(self): assert jnp.allclose(result[:, :, 0], theta_all[:, :, 3], atol=1e-6) assert jnp.allclose(result[:, :, 1], theta_all[:, :, 0], atol=1e-6) + def test_nontrivial_batch_idx_selects_correct_genotypes(self): + """ + With genotype minibatching, ``geno_theta_idx`` is always a local + arange (per ``get_batch``), while ``batch_idx`` holds the actual + global genotype indices selected for the batch. run_model must + compose ``batch_idx[geno_theta_idx]`` to index into the + full-population theta array — indexing by ``geno_theta_idx`` alone + silently selects the wrong (first-N-prefix) genotypes. + """ + G = 6 + T, C = 1, 2 + ln_K_h_o = jnp.linspace(18.0, 24.0, G) + tp = ThetaParam( + ln_K_h_l=jnp.full(G, -7.4), + ln_K_h_o=ln_K_h_o, + ln_K_h_e=jnp.full((T, G), 11.5), + ln_K_l_o=jnp.full(G, 13.8), + ln_K_l_e=jnp.full((T, G), 15.0), + tf_total=6.5e-7, op_total=2.5e-8, + mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), + conc_unit_scale=1.0, + ) + + batch_idx = jnp.array([5, 1, 3], dtype=jnp.int32) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-4]), batch_idx, + jnp.arange(len(batch_idx), dtype=jnp.int32), 0) + result = run_model(tp, data) # (T, C, 3) + + theta_all = _compute_theta( + tp.ln_K_h_l, tp.ln_K_h_o, tp.ln_K_h_e, + tp.ln_K_l_o, tp.ln_K_l_e, + data.titrant_conc, tp.tf_total, tp.op_total, + ) # (T, C, G) + + for local_i, global_g in enumerate(batch_idx): + assert jnp.allclose(result[:, :, local_i], theta_all[:, :, global_g], atol=1e-6) + + assert not jnp.allclose(result[:, :, 0], theta_all[:, :, 0], atol=1e-6) + def test_apo_matches_analytic_formula(self): """run_model at e=0 matches the closed-form apo theta.""" G = 1 @@ -373,8 +417,9 @@ def test_apo_matches_analytic_formula(self): mu=jnp.zeros((1, 2, 1)), sigma=jnp.ones((1, 2, 1)), conc_unit_scale=1.0, ) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data = MockSmall(jnp.array([0.0, 1e-8]), jnp.array([0], dtype=jnp.int32), 0) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-8]), jnp.arange(G, dtype=jnp.int32), + jnp.array([0], dtype=jnp.int32), 0) result = run_model(tp, data) # (1, 2, 1) expected = _apo_theta(ln_K_h_l_val, ln_K_h_o_val, ln_K_l_o_val, tf_total) diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py index ba361db1..5be3b501 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py @@ -76,6 +76,7 @@ def _make_pair_scatter(num_genotype=4): "num_genotype", "titrant_conc", "log_titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", "num_mutation", @@ -94,6 +95,7 @@ def mock_data_no_epi(): num_titrant_name=2, num_titrant_conc=len(_CONC), num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, num_pair=0, @@ -111,6 +113,7 @@ def mock_data_epi(): num_titrant_name=2, num_titrant_conc=len(_CONC), num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, num_pair=1, diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py index 03784b19..f792a0d3 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py @@ -55,6 +55,7 @@ def _apo_theta(ln_K_h_l, ln_K_h_o, ln_K_l_o, ln_K_u, tf_total): "num_titrant_conc", "num_genotype", "titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", ]) @@ -70,6 +71,7 @@ def mock_data(): num_titrant_conc=len(_CONC), num_genotype=G, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(G, dtype=jnp.int32), geno_theta_idx=jnp.arange(G, dtype=jnp.int32), scatter_theta=0, ) @@ -407,9 +409,11 @@ def test_geno_theta_idx_selects_genotypes(self): mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), conc_unit_scale=1.0, ) - # Select genotypes [3, 0] (reversed) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data = MockSmall(jnp.array([0.0, 1e-4]), jnp.array([3, 0], dtype=jnp.int32), 0) + # Select genotypes [3, 0] (reversed); batch_idx is identity (no + # minibatching), so geno_theta_idx indexes G directly. + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-4]), jnp.arange(G, dtype=jnp.int32), + jnp.array([3, 0], dtype=jnp.int32), 0) result = run_model(tp, data) # (T, C, 2) # Compute all-genotype theta for reference theta_all = _compute_theta( @@ -420,6 +424,47 @@ def test_geno_theta_idx_selects_genotypes(self): assert jnp.allclose(result[:, :, 0], theta_all[:, :, 3], atol=1e-6) assert jnp.allclose(result[:, :, 1], theta_all[:, :, 0], atol=1e-6) + def test_nontrivial_batch_idx_selects_correct_genotypes(self): + """ + With genotype minibatching, ``geno_theta_idx`` is always a local + arange (per ``get_batch``), while ``batch_idx`` holds the actual + global genotype indices selected for the batch. run_model must + compose ``batch_idx[geno_theta_idx]`` to index into the + full-population theta array — indexing by ``geno_theta_idx`` alone + silently selects the wrong (first-N-prefix) genotypes. + """ + G = 6 + T, C = 1, 2 + ln_K_h_o = jnp.linspace(18.0, 24.0, G) + tp = ThetaParam( + ln_K_h_l=jnp.full(G, -7.4), + ln_K_h_o=ln_K_h_o, + ln_K_h_e=jnp.full((T, G), 11.5), + ln_K_l_o=jnp.full(G, 13.8), + ln_K_l_e=jnp.full((T, G), 15.0), + ln_K_u=jnp.full(G, -12.0), + tf_total=6.5e-7, op_total=2.5e-8, + mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), + conc_unit_scale=1.0, + ) + + batch_idx = jnp.array([5, 1, 3], dtype=jnp.int32) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-4]), batch_idx, + jnp.arange(len(batch_idx), dtype=jnp.int32), 0) + result = run_model(tp, data) # (T, C, 3) + + theta_all = _compute_theta( + tp.ln_K_h_l, tp.ln_K_h_o, tp.ln_K_h_e, + tp.ln_K_l_o, tp.ln_K_l_e, tp.ln_K_u, + data.titrant_conc, tp.tf_total, tp.op_total, + ) # (T, C, G) + + for local_i, global_g in enumerate(batch_idx): + assert jnp.allclose(result[:, :, local_i], theta_all[:, :, global_g], atol=1e-6) + + assert not jnp.allclose(result[:, :, 0], theta_all[:, :, 0], atol=1e-6) + def test_apo_matches_analytic_formula(self): """run_model at e=0 matches the closed-form apo theta (with K_u term).""" G = 1 @@ -436,8 +481,9 @@ def test_apo_matches_analytic_formula(self): mu=jnp.zeros((1, 2, 1)), sigma=jnp.ones((1, 2, 1)), conc_unit_scale=1.0, ) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data = MockSmall(jnp.array([0.0, 1e-8]), jnp.array([0], dtype=jnp.int32), 0) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array([0.0, 1e-8]), jnp.arange(G, dtype=jnp.int32), + jnp.array([0], dtype=jnp.int32), 0) result = run_model(tp, data) # (1, 2, 1) expected = _apo_theta(ln_K_h_l_val, ln_K_h_o_val, ln_K_l_o_val, @@ -460,8 +506,9 @@ def test_large_K_u_collapses_theta_via_run_model(self): mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), conc_unit_scale=1.0, ) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data = MockSmall(jnp.array(_CONC), jnp.arange(G, dtype=jnp.int32), 0) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data = MockSmall(jnp.array(_CONC), jnp.arange(G, dtype=jnp.int32), + jnp.arange(G, dtype=jnp.int32), 0) result_wt = run_model(tp_wt, data) result_unfolded = run_model(tp_unfolded, data) assert jnp.all(result_wt > result_unfolded) @@ -509,9 +556,9 @@ def test_conc_unit_scale_applied(self): mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), conc_unit_scale=1.0, ) - MockSmall = namedtuple("MockSmall", ["titrant_conc", "geno_theta_idx", "scatter_theta"]) - data_mM = MockSmall(conc_mM, jnp.arange(G, dtype=jnp.int32), 0) - data_M = MockSmall(conc_M, jnp.arange(G, dtype=jnp.int32), 0) + MockSmall = namedtuple("MockSmall", ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) + data_mM = MockSmall(conc_mM, jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) + data_M = MockSmall(conc_M, jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) result_mM = run_model(tp_mM, data_mM) result_M = run_model(tp_M, data_M) assert jnp.allclose(result_mM, result_M, atol=1e-5) diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py index 16796c43..1caa3d62 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py @@ -32,6 +32,7 @@ "num_genotype", "titrant_conc", "log_titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", "num_mutation", @@ -77,6 +78,7 @@ def mock_data_epi(): num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, @@ -97,6 +99,7 @@ def mock_data_no_epi(): num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py index 71393a2b..e28ffad5 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py @@ -21,6 +21,7 @@ "num_titrant_conc", "num_genotype", "titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", ]) @@ -35,6 +36,7 @@ def mock_data(): num_titrant_conc=3, num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=0, ) @@ -254,16 +256,60 @@ def test_zero_effector_matches_apo_formula(self, mock_data): def test_uses_data_titrant_conc(self, theta_param): """run_model recomputes theta from data.titrant_conc, not stored moments.""" MockDataSmall = namedtuple("MockDataSmall", - ["titrant_conc", "geno_theta_idx", "scatter_theta"]) + ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) G = 4 data_low = MockDataSmall(jnp.array([0.0, 10.0]), + jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) data_high = MockDataSmall(jnp.array([500.0, 1000.0]), + jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) res_low = run_model(theta_param, data_low) res_high = run_model(theta_param, data_high) assert jnp.all(res_low >= res_high) + def test_nontrivial_batch_idx_selects_correct_genotypes(self, mock_data): + """ + With genotype minibatching, ``geno_theta_idx`` is always a local + arange (per ``get_batch``), while ``batch_idx`` holds the actual + global genotype indices selected for the batch. run_model must + compose ``batch_idx[geno_theta_idx]`` to index into the + full-population theta array — indexing by ``geno_theta_idx`` alone + silently selects the wrong (first-N-prefix) genotypes. + """ + G_full = 6 + T, C = mock_data.num_titrant_name, mock_data.num_titrant_conc + ln_K_op = jnp.linspace(0.0, 5.0, G_full) + ln_K_HL = jnp.linspace(-12.0, -6.0, G_full) + ln_K_E = jnp.full((T, G_full), -4.0) + tp_full = ThetaParam( + ln_K_op=ln_K_op, ln_K_HL=ln_K_HL, ln_K_E=ln_K_E, + tf_total=650.0, op_total=25.0, + mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), + ) + + # Non-trivial (reordered, non-prefix) global genotype selection, + # exactly as produced by get_batch(): batch_idx holds the global + # indices, geno_theta_idx is always a local arange(batch_size). + batch_idx = jnp.array([5, 1, 3], dtype=jnp.int32) + batch_data = mock_data._replace( + batch_idx=batch_idx, + geno_theta_idx=jnp.arange(len(batch_idx), dtype=jnp.int32), + ) + + result = run_model(tp_full, batch_data) # (T, C, 3) + + theta_all = _compute_theta( + tp_full.ln_K_op, tp_full.ln_K_HL, tp_full.ln_K_E, + batch_data.titrant_conc, tp_full.tf_total, tp_full.op_total, + ) # (T, C, G_full) + + for local_i, global_g in enumerate(batch_idx): + assert jnp.allclose(result[:, :, local_i], theta_all[:, :, global_g], atol=1e-6) + + # Sanity check that this is NOT the same as the (buggy) prefix selection. + assert not jnp.allclose(result[:, :, 0], theta_all[:, :, 0], atol=1e-6) + # --------------------------------------------------------------------------- # get_population_moments diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py index 7d8caa2d..4b70cf88 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py @@ -32,6 +32,7 @@ "num_genotype", "titrant_conc", "log_titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", "num_mutation", @@ -77,6 +78,7 @@ def mock_data_epi(): num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, @@ -97,6 +99,7 @@ def mock_data_no_epi(): num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), log_titrant_conc=jnp.array(_LOG_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=1, num_mutation=2, diff --git a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py index 6476b2a4..4131fbbe 100644 --- a/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py +++ b/tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py @@ -21,6 +21,7 @@ "num_titrant_conc", "num_genotype", "titrant_conc", + "batch_idx", "geno_theta_idx", "scatter_theta", ]) @@ -35,6 +36,7 @@ def mock_data(): num_titrant_conc=3, num_genotype=4, titrant_conc=jnp.array(_CONC, dtype=jnp.float32), + batch_idx=jnp.arange(4, dtype=jnp.int32), geno_theta_idx=jnp.arange(4, dtype=jnp.int32), scatter_theta=0, ) @@ -314,11 +316,13 @@ def test_zero_effector_matches_apo_formula(self, mock_data): def test_uses_data_titrant_conc(self, theta_param): """run_model recomputes theta from data.titrant_conc, not stored moments.""" MockDataSmall = namedtuple("MockDataSmall", - ["titrant_conc", "geno_theta_idx", "scatter_theta"]) + ["titrant_conc", "batch_idx", "geno_theta_idx", "scatter_theta"]) G = 4 data_low = MockDataSmall(jnp.array([0.0, 10.0]), + jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) data_high = MockDataSmall(jnp.array([500.0, 1000.0]), + jnp.arange(G, dtype=jnp.int32), jnp.arange(G, dtype=jnp.int32), 0) res_low = run_model(theta_param, data_low) res_high = run_model(theta_param, data_high) @@ -344,6 +348,45 @@ def test_large_K_U_reduces_theta(self, mock_data): res_large = run_model(tp_large_U, mock_data) assert jnp.all(res_large < res_small) + def test_nontrivial_batch_idx_selects_correct_genotypes(self, mock_data): + """ + With genotype minibatching, ``geno_theta_idx`` is always a local + arange (per ``get_batch``), while ``batch_idx`` holds the actual + global genotype indices selected for the batch. run_model must + compose ``batch_idx[geno_theta_idx]`` to index into the + full-population theta array — indexing by ``geno_theta_idx`` alone + silently selects the wrong (first-N-prefix) genotypes. + """ + G_full = 6 + T, C = mock_data.num_titrant_name, mock_data.num_titrant_conc + ln_K_op = jnp.linspace(0.0, 5.0, G_full) + ln_K_HL = jnp.linspace(-12.0, -6.0, G_full) + ln_K_E = jnp.full((T, G_full), -4.0) + ln_K_U = jnp.linspace(-15.0, -9.0, G_full) + tp_full = ThetaParam( + ln_K_op=ln_K_op, ln_K_HL=ln_K_HL, ln_K_E=ln_K_E, ln_K_U=ln_K_U, + tf_total=650.0, op_total=25.0, + mu=jnp.zeros((T, C, 1)), sigma=jnp.ones((T, C, 1)), + ) + + batch_idx = jnp.array([5, 1, 3], dtype=jnp.int32) + batch_data = mock_data._replace( + batch_idx=batch_idx, + geno_theta_idx=jnp.arange(len(batch_idx), dtype=jnp.int32), + ) + + result = run_model(tp_full, batch_data) # (T, C, 3) + + theta_all = _compute_theta( + tp_full.ln_K_op, tp_full.ln_K_HL, tp_full.ln_K_E, tp_full.ln_K_U, + batch_data.titrant_conc, tp_full.tf_total, tp_full.op_total, + ) # (T, C, G_full) + + for local_i, global_g in enumerate(batch_idx): + assert jnp.allclose(result[:, :, local_i], theta_all[:, :, global_g], atol=1e-6) + + assert not jnp.allclose(result[:, :, 0], theta_all[:, :, 0], atol=1e-6) + # --------------------------------------------------------------------------- # get_population_moments From a09e8397796edc5e8ac829bddf07a9234b0e0766 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Fri, 3 Jul 2026 17:19:51 -0700 Subject: [PATCH 06/30] added ability to pin dk_geno for calibration --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 958 +++++++++--------- reports/junit/junit.xml | 2 +- .../generative/components/dk_geno/pinned.py | 278 +++++ src/tfscreen/tfmodel/generative/registry.py | 2 + src/tfscreen/tfmodel/model_orchestrator.py | 34 + .../tfmodel/scripts/prefit_calibration_cli.py | 25 +- .../components/dk_geno/test_pinned.py | 262 +++++ .../scripts/test_prefit_calibration_cli.py | 72 ++ .../tfmodel/test_model_orchestrator.py | 128 +++ 11 files changed, 1282 insertions(+), 483 deletions(-) create mode 100644 src/tfscreen/tfmodel/generative/components/dk_geno/pinned.py create mode 100644 tests/tfscreen/tfmodel/generative/components/dk_geno/test_pinned.py diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index e5362f24..9d82a86e 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.32%coverage96.32% \ No newline at end of file +coverage: 96.35%coverage96.35% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index af66d7fa..861824f3 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3697tests3697 \ No newline at end of file +tests: 3730tests3730 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index c0f0e49d..563b6b4b 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -6231,9 +6231,9 @@ ./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_U0_a/thermo.py:269:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:299:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:367: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 @@ -6513,12 +6513,12 @@ ./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_C12_K5_U1_a/thermo.py:230:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:246:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:276:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:336:17: 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_C12_K5_U1_a/thermo.py:360: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 @@ -6703,16 +6703,16 @@ ./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_U0_a/thermo.py:234:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:238:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:243:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:250:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:275:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:342:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:356:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:361: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 @@ -6966,19 +6966,19 @@ ./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:212:8: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:7: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:216:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:221:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:228:6: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:249:40: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:309:17: 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:324: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/O2_C4_K3_U1_a/thermo.py:329: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 @@ -7098,65 +7098,66 @@ ./src/tfscreen/tfmodel/generative/observe/growth.py:87:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/observe/growth.py:95:5: F841 local variable 'nu' is assigned to but never used ./src/tfscreen/tfmodel/generative/observe/growth.py:97:11: W292 no newline at end of file -./src/tfscreen/tfmodel/generative/registry.py:57:29: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/registry.py:58:28: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/registry.py:61:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:62:17: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:63:16: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:64:21: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:66:14: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:67:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:68:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:70:14: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:71:16: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:72:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:74:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:75:16: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:76:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:77:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:78:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:79:24: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:81:21: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:86:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:90:12: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:91:18: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:92:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:93:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:94:19: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:95:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:96:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:97:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:98:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:58:29: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/registry.py:59:28: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/registry.py:62:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:63:17: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:64:16: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:65:21: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:67:14: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:68:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:69:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:71:14: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:72:16: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:73:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:74:17: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:76:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:77:16: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:78:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:79:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:80:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:81:24: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:83:21: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:88:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:92:12: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:93:18: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:94:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:95:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:96:19: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:97:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:98:36: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:99:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:100:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:101:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:102:37: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:103:37: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:104:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:100:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:101:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:102:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:103:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:104:37: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:105:37: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:106:37: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:108:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:109:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:110:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:111:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:113:26: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:114:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:115:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:117:19: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:118:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:119:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:106:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:107:37: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:108:37: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:110:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:111:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:112:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:113:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:115:26: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:116:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:117:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:119:19: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:120:15: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:121:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:122:15: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:123:17: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:125:24: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:126:18: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:127:17: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:123:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:124:15: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:125:17: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:127:24: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:128:18: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:129:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:130:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:131:18: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:133:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/generative/registry.py:134:21: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:129:17: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:130:18: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:131:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:132:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:133:18: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:135:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/generative/registry.py:136:21: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/inference/posteriors.py:72:1: C901 'load_posteriors' is too complex (12) ./src/tfscreen/tfmodel/inference/posteriors.py:72:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/inference/posteriors.py:117:17: F841 local variable 'e' is assigned to but never used @@ -7315,126 +7316,127 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:641:87: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:644:84: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:649:79: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:735:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) -./src/tfscreen/tfmodel/model_orchestrator.py:735:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:760:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:761:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:763:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:764:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:764:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:764:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:765:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:765:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:766:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:770:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:771:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:776:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:783:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:785:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:785:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:787:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:790:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:792:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:794:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:806:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:814:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:836:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:837:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:837:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:838:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:838:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:839:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:839:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:840:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:840:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:842:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:849:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:854:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:854:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:854:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:861:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:907:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:908:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:909:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:910:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:950:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:953:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:954:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:955:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:959:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:960:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:961:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:962:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:964:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:975:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:975:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:978:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:979:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:984:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:985:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:986:58: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:988:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:993:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:997:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1001:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1004:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1010:86: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1012:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1019:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1075:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1076:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1077:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1078:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1085:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1086:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1087:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1163:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1164:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1166:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1239:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) -./src/tfscreen/tfmodel/model_orchestrator.py:1259:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1261:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1262:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1264:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1265:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1266:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1267:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1284:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1285:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1355:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1358:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1379:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1381:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1434:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1439:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1453:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1463:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1473:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1487:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1490:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1519:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1531:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1543:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1549:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1550:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1551:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1552:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1553:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1554:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1555:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1556:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1557:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1558:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1559:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1560:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1561:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1562:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1563:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:750:5: C901 'ModelOrchestrator._initialize_data' is too complex (18) +./src/tfscreen/tfmodel/model_orchestrator.py:750:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:775:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:776:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:778:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:779:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:779:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:779:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:780:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:780:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:781:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:785:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:786:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:791:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:798:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:800:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:800:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:802:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:805:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:807:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:809:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:821:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:829:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:851:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:852:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:852:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:853:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:853:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:854:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:854:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:855:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:855:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:857:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:864:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:884:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:884:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:884:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:891:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:937:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:938:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:939:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:940:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:980:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:983:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:984:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:985:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:989:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:990:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:991:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:992:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:994:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1005:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1005:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1008:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1009:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1014:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1015:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1016:58: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1018:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1027:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1031:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1034:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1040:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1042:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1049:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1105:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1106:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1107:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1108:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1115:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1116:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1117:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1193:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1194:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1196:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1269:5: C901 'ModelOrchestrator._initialize_classes' is too complex (18) +./src/tfscreen/tfmodel/model_orchestrator.py:1289:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1291:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1292:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1294:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1295:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1296:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1297:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1314:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1315:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1316:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1316:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1316:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1316:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1316:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1388:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1391:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1412:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1414:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1467:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1472:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1486:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1496:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1506:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1520:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1523:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1552:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1564:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1576:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1582:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1583:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1584:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1585:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1586:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1587:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1588:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1589:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1590:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1591:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1592:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1593:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1594:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1595:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1596:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1597: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 @@ -7489,21 +7491,21 @@ ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:106:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:107:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:198:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:199:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:204:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:268:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:269:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:270:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:273:1: C901 '_inject_calibration_priors' is too complex (21) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:464:1: C901 '_build_csv_updates' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:522:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:523:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:662:1: C901 '_apply_guesses_updates' is too complex (12) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:814:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:818:1: E302 expected 2 blank lines, found 3 +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:112:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:113:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:204:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:205:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:210:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:287:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:288:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:289:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:1: C901 '_inject_calibration_priors' is too complex (21) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:483:1: C901 '_build_csv_updates' is too complex (11) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:541:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:542:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:681:1: C901 '_apply_guesses_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:833:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:837:1: E302 expected 2 blank lines, found 3 ./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used @@ -9740,7 +9742,6 @@ ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:200:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:220:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/test_categorical_geno.py:379:44: W292 no newline at end of file -./tests/tfscreen/tfmodel/generative/components/theta/test_full_population_contract.py:30:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:4:1: F401 'numpyro.distributions as dist' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:5:1: F401 'numpyro.handlers.trace' imported but unused ./tests/tfscreen/tfmodel/generative/components/theta/test_hill_geno.py:41:1: E302 expected 2 blank lines, found 1 @@ -9810,36 +9811,36 @@ ./tests/tfscreen/tfmodel/generative/components/theta/test_predict_unmeasured.py:301:19: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:41:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:58:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:195:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:248:6: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:280:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:315:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:332:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:333:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:346:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:347:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:424:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:425:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:426:45: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:427:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:428:34: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:429:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:430:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:443:30: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:485:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:596:30: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:615:17: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:615:28: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:615:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:616:29: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:617:18: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:617:28: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:617:40: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:618:19: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:198:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:251:6: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:283:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:318:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:335:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:336:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:349:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:350:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:427:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:428:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:429:45: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:430:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:431:34: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:432:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:433:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:446:30: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:488:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:599:30: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:618:17: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:618:28: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:618:41: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:685:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:693:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:618:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:619:29: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:620:18: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:620:28: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:620:40: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:621:19: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:621:28: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:621:41: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:688:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PK.py:696:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PddG.py:43:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PddG.py:97:45: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_PddG.py:138:23: E221 multiple spaces before operator @@ -9911,65 +9912,65 @@ ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_predict_unmeasured.py:258:15: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:26:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:35:6: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:217:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:217:33: E201 whitespace after '[' ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:219:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:219:33: E201 whitespace after '[' +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/test_thermo.py:221:32: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:49:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:66:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:203:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:275:6: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:276:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:277:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:278:33: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:292:40: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:299:45: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:306:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:321:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:360:31: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:361:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:378:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:379:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:394:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:395:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:421:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:422:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:509:31: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:520:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:521:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:523:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:524:34: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:525:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:526:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:540:39: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:541:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:542:45: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:543:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:544:34: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:545:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:546:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:559:30: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:606:31: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:607:27: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:617:31: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:709:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:745:30: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:764:17: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:764:29: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:764:40: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:765:29: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:766:18: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:766:29: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:766:41: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:767:19: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:206:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:278:6: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:279:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:280:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:281:33: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:295:40: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:302:45: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:309:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:324:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:363:31: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:364:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:381:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:382:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:397:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:398:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:424:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:425:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:512:31: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:523:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:524:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:526:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:527:34: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:528:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:529:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:543:39: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:544:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:545:45: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:546:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:547:34: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:548:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:549:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:562:30: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:609:31: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:610:27: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:620:31: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:712:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:748:30: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:767:17: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:767:29: E701 multiple statements on one line (colon) -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:767:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:795:24: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:803:24: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:812:26: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:820:26: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:830:28: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:844:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:852:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:767:40: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:768:29: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:769:18: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:769:29: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:769:41: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:770:19: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:770:29: E701 multiple statements on one line (colon) +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:770:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:798:24: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:806:24: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:815:26: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:823:26: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:833:28: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:847:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PK.py:855:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PddG.py:53:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PddG.py:107:45: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_PddG.py:147:23: E221 multiple spaces before operator @@ -10051,36 +10052,36 @@ ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:28:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:39:6: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:43:8: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:310:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:310:33: E201 whitespace after '[' ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:312:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:465:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:486:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:514:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:516:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:47:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:48:25: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:54:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:61:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:68:1: E305 expected 2 blank lines after class or function definition, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:68:6: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:282:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:283:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:284:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:343:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:344:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:345:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:346:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:347:34: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:348:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:349:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:361:31: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:362:30: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:363:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:364:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:365:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:366:41: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:376:34: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:312:33: E201 whitespace after '[' +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:314:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:512:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:533:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:561:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/test_thermo.py:563:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:48:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:49:25: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:55:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:62:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:69:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:69:6: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:285:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:286:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:287:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:346:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:347:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:348:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:349:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:350:34: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:351:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:352:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:364:31: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:365:30: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:366:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:367:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:368:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:369:41: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PK.py:379:34: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PddG.py:47:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PddG.py:98:45: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_PddG.py:123:5: E306 expected 1 blank line before a nested definition, found 0 @@ -10146,60 +10147,61 @@ ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_predict_unmeasured.py:78:33: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_predict_unmeasured.py:125:16: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_predict_unmeasured.py:244:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:66:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:73:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:82:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:89:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:98:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:101:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:259:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:263:16: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:47:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:48:25: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:54:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:61:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:68:1: E305 expected 2 blank lines after class or function definition, found 1 -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:68:6: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:313:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:314:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:315:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:326:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:327:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:328:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:348:34: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:349:34: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:350:33: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:351:33: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:353:39: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:354:39: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:400:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:401:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:402:44: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:403:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:404:34: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:405:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:406:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:417:37: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:418:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:419:43: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:431:31: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:432:30: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:433:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:434:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:435:42: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:436:41: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:438:41: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:448:34: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:450:34: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:506:33: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:549:46: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:550:45: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:551:40: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:554:48: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:555:47: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:556:42: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:558:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:564:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:68:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:75:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:84:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:91:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:100:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:103:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:261:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:267:16: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/test_thermo.py:284:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:48:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:49:25: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:55:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:62:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:69:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:69:6: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:316:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:317:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:318:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:329:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:330:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:331:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:351:34: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:352:34: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:353:33: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:354:33: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:356:39: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:357:39: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:403:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:404:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:405:44: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:406:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:407:34: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:408:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:409:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:420:37: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:421:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:422:43: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:434:31: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:435:30: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:436:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:437:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:438:42: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:439:41: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:441:41: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:451:34: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:453:34: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:509:33: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:552:46: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:553:45: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:554:40: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:557:48: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:558:47: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:559:42: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:561:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PK.py:567:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PddG.py:47:24: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PddG.py:100:45: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PddG.py:215:41: E221 multiple spaces before operator @@ -10264,19 +10266,21 @@ ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PnnC.py:582:26: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PnnC.py:594:28: E272 multiple spaces before keyword ./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_PnnC.py:604:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:67:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:75:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:84:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:91:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:100:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:103:19: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:109:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:165:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:171:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:216:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:310:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:319:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:323:16: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:69:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:77:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:86:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:93:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:102:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:105:19: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:111:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:167:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:173:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:218:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:312:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:321:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:327:16: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:364:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/test_thermo.py:365:15: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/test_features.py:62:22: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/test_features.py:63:22: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/test_features.py:150:19: E221 multiple spaces before operator @@ -10953,32 +10957,32 @@ ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:14:1: F401 'sys' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:21:1: F401 'jax' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:26:1: F401 'tfscreen.tfmodel.scripts.prefit_calibration_cli._identify_field_mapping' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:733:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:734:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:735:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:736:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:737:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:738:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:739:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:740:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:741:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1117:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1123:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1129:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1136:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1144:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1150:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1158:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1164:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1170:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1177:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1184:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1198:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1212:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1224:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1309:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1328:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1343:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:805:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:806:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:807:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:808:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:809:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:810:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:811:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:812:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:813:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1189:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1195:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1201:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1208:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1216:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1222:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1230:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1236:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1242:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1249:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1256:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1270:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1284:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1296:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1381:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1400:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1415:14: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_sample_posterior_cli.py:5:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/tfmodel/scripts/test_sample_prior_cli.py:3:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/scripts/test_subset_genotypes_cli.py:84:31: E741 ambiguous variable name 'l' @@ -11144,53 +11148,53 @@ ./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:456:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:602:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:603:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:606:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:614:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:620:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:621:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:623:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:625:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:637:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:642:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:650:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:658:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:669:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:672:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:679:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:686:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:694:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:699:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:704:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:710:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:719:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:723:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:733:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:734:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:736:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:737:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:749:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:755:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:764:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:765:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:768:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:771:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1034:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1431:34: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1675:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1682:10: W292 no newline at end of file +./tests/tfscreen/tfmodel/test_model_orchestrator.py:582:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:730:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:731:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:734:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:742:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:749:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:753:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:765:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:770:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:778:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:786:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:797:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:800:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:807:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:814:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:827:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:832:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:838:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:847:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:851:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:861:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:862:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:864:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:865:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:877:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:883:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:892:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:893:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:896:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:899:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1162:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1559:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1803:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1810: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 @@ -11508,10 +11512,10 @@ 48 E202 whitespace before ']' 10 E203 whitespace before ',' 8 E211 whitespace before '(' -3021 E221 multiple spaces before operator +3024 E221 multiple spaces before operator 27 E222 multiple spaces after operator 16 E225 missing whitespace around operator -1990 E231 missing whitespace after ',' +1992 E231 missing whitespace after ',' 127 E251 unexpected spaces around keyword / parameter equals 28 E252 missing whitespace around parameter equals 236 E261 at least two spaces before inline comment @@ -11533,7 +11537,7 @@ 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def 27 E741 ambiguous variable name 'l' -281 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +280 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused 18 F541 f-string is missing placeholders 5 F811 redefinition of unused 'np' from line 1 56 F841 local variable 'e' is assigned to but never used @@ -11541,4 +11545,4 @@ 134 W292 no newline at end of file 2188 W293 blank line contains whitespace 51 W391 blank line at end of file -11495 +11499 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 3759cc2e..8b61fae2 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/tfmodel/generative/components/dk_geno/pinned.py b/src/tfscreen/tfmodel/generative/components/dk_geno/pinned.py new file mode 100644 index 00000000..39568cc5 --- /dev/null +++ b/src/tfscreen/tfmodel/generative/components/dk_geno/pinned.py @@ -0,0 +1,278 @@ +""" +Per-genotype pinned dk_geno component. + +Unlike ``dk_geno.fixed`` (always exactly zero for every genotype) or +``dk_geno.hierarchical_geno`` (learned per genotype from a pooled prior), +this component treats dk_geno as a fully known, deterministic quantity +supplied by the caller for a subset of genotypes, with every other +genotype defaulting to 0. + +Typical use: some genotypes have an independently measured pleiotropic +growth effect (e.g. from an orthogonal assay). Pinning those values lets +downstream fits (in particular the linking-function pre-fit calibration +run by ``tfs-prefit-calibration``) use the *real* dk_geno for those +genotypes instead of forcing every genotype to 0, while still not trying +to *learn* dk_geno for the remaining genotypes from data that isn't +suited to it. + +Values are supplied via ``ModelPriors.dk_geno_values``, a +``(num_genotype,)`` array indexed the same way as every other per-genotype +tensor in this codebase (i.e. ``data.batch_idx`` indexes into it). See +``build_dk_geno_values`` for how that array is assembled from a +``{genotype: dk_geno}`` mapping, and ``read_dk_geno_pins`` for reading that +mapping from a CSV file. Wiring from a config file happens in +``ModelOrchestrator`` (its ``dk_geno_pins_file`` constructor argument), not +here -- this module only consumes an already-built array. + +There are no sampled latent variables: + +- ``define_model`` registers zero ``pyro.sample`` sites and only emits a + ``pyro.deterministic(name, ...)`` site for visibility. +- ``guide`` is a pure no-op (no ``pyro.param``, no ``pyro.sample``), + keeping the model/guide sample sets symmetric. + +Wildtype is always forced to 0 regardless of ``dk_geno_values`` content; +``build_dk_geno_values`` additionally rejects a nonzero pin for wildtype +outright, so this is defense in depth rather than the primary guard. +""" + +import jax.numpy as jnp +import numpy as np +import pandas as pd +import numpyro as pyro +from flax.struct import dataclass + +from tfscreen.tfmodel.data_class import GrowthData + + +_REQUIRED_COLUMNS = {"genotype", "dk_geno"} + + +@dataclass(frozen=True) +class ModelPriors: + """ + JAX Pytree holding the (always-pinned) per-genotype dk_geno values. + + Attributes + ---------- + dk_geno_values : jnp.ndarray + Shape ``(num_genotype,)``, ordered to match the model's genotype + axis (i.e. indexable by ``data.batch_idx``). Genotypes with no + independently known dk_geno should be 0.0. + """ + + dk_geno_values: jnp.ndarray + + +def _compute_dk_geno(data: GrowthData, priors: ModelPriors) -> jnp.ndarray: + """Shared per-genotype dk_geno lookup, with wildtype forced to 0.""" + dk_geno_per_genotype = priors.dk_geno_values[data.batch_idx] + is_wt_mask = jnp.isin(data.batch_idx, data.wt_indexes) + return jnp.where(is_wt_mask, 0.0, dk_geno_per_genotype) + + +def define_model(name: str, + data: GrowthData, + priors: ModelPriors) -> jnp.ndarray: + """ + The pleiotropic effect of a genotype on growth rate independent of + transcription factor occupancy, pinned to caller-supplied per-genotype + values (0 for any genotype not explicitly pinned). Returns a full + dk_geno tensor. + + Parameters + ---------- + name : str + The prefix for the ``pyro.deterministic`` site. + data : GrowthData + A Pytree (Flax dataclass) containing experimental data and + metadata. This function primarily uses: + - ``data.batch_idx`` : (jnp.ndarray) Index array mapping the + current batch onto per-genotype parameters. + - ``data.wt_indexes`` : (jnp.ndarray) Genotype indices treated as + wildtype (always forced to dk_geno = 0). + priors : ModelPriors + Holds the pinned ``dk_geno_values``. + + Returns + ------- + jnp.ndarray + A tensor of pinned dk_geno values, expanded to match the shape of + the observations via ``data.batch_idx``. + """ + dk_geno_per_genotype = _compute_dk_geno(data, priors) + + pyro.deterministic(name, dk_geno_per_genotype) + + dk_geno = dk_geno_per_genotype[None, None, None, None, None, None, :] + + return dk_geno + + +def guide(name: str, + data: GrowthData, + priors: ModelPriors) -> jnp.ndarray: + """ + Guide for the pinned dk_geno model. + + Since all values are fixed and deterministic, this guide does not + register any learnable parameters or sample sites. + """ + dk_geno_per_genotype = _compute_dk_geno(data, priors) + + dk_geno = dk_geno_per_genotype[None, None, None, None, None, None, :] + + return dk_geno + + +def get_hyperparameters(): + """ + Get default values for the model hyperparameters. + + Returns + ------- + dict[str, Any] + A placeholder ``dk_geno_values`` of shape ``(1,)``. Real usage + wires in a properly-sized array via + ``ModelOrchestrator(dk_geno_pins_file=...)``; this default only + supports standalone construction (e.g. in tests). + """ + return {"dk_geno_values": jnp.zeros(1, dtype=float)} + + +def get_guesses(name, data): + """ + Get guess values for the model parameters. + + Returns + ------- + dict[str, Any] + An empty dictionary, as this model has no latent parameters. + """ + return {} + + +def get_priors(dk_geno_values=None): + """ + Construct a populated ``ModelPriors``. + + Parameters + ---------- + dk_geno_values : array-like, optional + Per-genotype dk_geno values, shape ``(num_genotype,)``. If + omitted, the placeholder default from ``get_hyperparameters`` is + used (shape ``(1,)`` -- not usable for a real fit). + """ + hyperparameters = get_hyperparameters() + if dk_geno_values is not None: + hyperparameters["dk_geno_values"] = jnp.asarray(dk_geno_values, dtype=float) + return ModelPriors(**hyperparameters) + + +def get_extract_specs(ctx): + return [dict( + input_df=ctx.growth_tm.df, + params_to_get=["dk_geno"], + map_column="map_genotype", + get_columns=["genotype"], + in_run_prefix="", + )] + + +# --------------------------------------------------------------------------- +# Pins-file I/O -- used by ModelOrchestrator to build ``dk_geno_values``. +# --------------------------------------------------------------------------- + +def read_dk_geno_pins(path): + """ + Read a per-genotype dk_geno pin CSV. + + Parameters + ---------- + path : str + Path to a CSV with columns ``genotype`` and ``dk_geno``. + + Returns + ------- + dict[str, float] + ``{genotype: dk_geno}``. + + Raises + ------ + ValueError + If required columns are missing, unrecognised columns are + present, or a genotype is listed more than once. + """ + df = pd.read_csv(path) + + missing = _REQUIRED_COLUMNS - set(df.columns) + if missing: + raise ValueError( + f"'{path}' is missing required column(s): {sorted(missing)}. " + f"Expected columns: {sorted(_REQUIRED_COLUMNS)}" + ) + + unknown = set(df.columns) - _REQUIRED_COLUMNS + if unknown: + raise ValueError( + f"'{path}' has unrecognised column(s): {sorted(unknown)}. " + f"Expected columns: {sorted(_REQUIRED_COLUMNS)}" + ) + + genotypes = df["genotype"].astype(str) + dup = genotypes[genotypes.duplicated()] + if not dup.empty: + raise ValueError( + f"'{path}' lists the same genotype more than once: " + f"{sorted(set(dup))}" + ) + + return dict(zip(genotypes, df["dk_geno"].astype(float))) + + +def build_dk_geno_values(pins, genotype_labels, wt_label="wt"): + """ + Build a per-genotype dk_geno array ordered to match ``genotype_labels``. + + Parameters + ---------- + pins : dict[str, float] + Output of :func:`read_dk_geno_pins`. + genotype_labels : Sequence[str] + Genotype order used by the model's genotype axis (e.g. + ``growth_tm.tensor_dim_labels[genotype_idx]``). + wt_label : str, optional + The label used for wildtype (default ``"wt"``). + + Returns + ------- + np.ndarray + Shape ``(len(genotype_labels),)``. Entries not present in + ``pins`` are 0.0. + + Raises + ------ + ValueError + If ``pins`` references a genotype absent from + ``genotype_labels``, or pins a non-zero value onto ``wt_label``. + """ + label_to_idx = {str(g): i for i, g in enumerate(genotype_labels)} + + unknown = sorted(set(pins) - set(label_to_idx)) + if unknown: + raise ValueError( + f"dk_geno pins reference genotype(s) not present in the " + f"growth data: {unknown}" + ) + + if wt_label in pins and float(pins[wt_label]) != 0.0: + raise ValueError( + f"dk_geno pins specify dk_geno={pins[wt_label]!r} for " + f"'{wt_label}'; wildtype dk_geno must be exactly 0.0." + ) + + values = np.zeros(len(genotype_labels), dtype=float) + for g, v in pins.items(): + values[label_to_idx[g]] = v + + return values diff --git a/src/tfscreen/tfmodel/generative/registry.py b/src/tfscreen/tfmodel/generative/registry.py index ae58e6e2..14c30560 100644 --- a/src/tfscreen/tfmodel/generative/registry.py +++ b/src/tfscreen/tfmodel/generative/registry.py @@ -14,6 +14,7 @@ from .components.dk_geno import fixed as dk_geno_fixed from .components.dk_geno import hierarchical_geno as dk_geno_hierarchical +from .components.dk_geno import pinned as dk_geno_pinned from .components.activity import fixed as activity_fixed from .components.activity import hierarchical_geno as activity_hierarchical @@ -70,6 +71,7 @@ "dk_geno":{ "fixed":dk_geno_fixed, "hierarchical_geno":dk_geno_hierarchical, + "pinned":dk_geno_pinned, }, "activity":{ "fixed":activity_fixed, diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 06038002..5818ece3 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -684,6 +684,7 @@ def __init__(self, growth_transition="instant", ln_cfu0="hierarchical", dk_geno="hierarchical_geno", + dk_geno_pins_file=None, activity="horseshoe_geno", theta="hill_geno", transformation="empirical", @@ -710,6 +711,8 @@ def __init__(self, self._growth_transition = growth_transition self._ln_cfu0 = ln_cfu0 self._dk_geno = dk_geno + self._dk_geno_pins_file = dk_geno_pins_file + self._dk_geno_values = None self._activity = activity self._theta = theta self._transformation = transformation @@ -728,6 +731,18 @@ def __init__(self, self._theta, self._transformation, binding_only=self._binding_only ) + if self._dk_geno == "pinned" and self._dk_geno_pins_file is None: + raise ValueError( + "dk_geno='pinned' requires dk_geno_pins_file (path to a " + "CSV with columns 'genotype' and 'dk_geno')." + ) + if self._dk_geno != "pinned" and self._dk_geno_pins_file is not None: + raise ValueError( + f"dk_geno_pins_file was provided but dk_geno != 'pinned' " + f"(got dk_geno={self._dk_geno!r}). Set dk_geno='pinned' to " + f"use it." + ) + self._initialize_data() self._initialize_classes() @@ -851,6 +866,21 @@ def _initialize_data(self): other_data["log_titrant_conc"] = log_titrant_conc other_data["growth_shares_replicates"] = bool(self._growth_shares_replicates) + # Resolve pinned dk_geno values (dk_geno == "pinned") from an + # optional per-genotype CSV. Building/validating the array here + # (rather than inside the component) lets construction fail fast + # with a clear error if the CSV references an unknown genotype or + # pins a nonzero value onto wildtype. + if self._dk_geno == "pinned": + from tfscreen.tfmodel.generative.components.dk_geno.pinned import ( + read_dk_geno_pins, + build_dk_geno_values, + ) + pins = read_dk_geno_pins(self._dk_geno_pins_file) + self._dk_geno_values = jnp.asarray( + build_dk_geno_values(pins, _genotype_names), dtype=FLOAT_DTYPE + ) + growth_data_sources = [tensors,sizes,wt_info,other_data] # Build mutation-to-genotype indicator matrices when any mutation-decomposed @@ -1341,6 +1371,9 @@ def _initialize_classes(self): elif "data" in priors_sig.parameters: priors_class_kwargs[prior_group][key] = \ component_module.get_priors(data=component_data) + elif "dk_geno_values" in priors_sig.parameters: + priors_class_kwargs[prior_group][key] = \ + component_module.get_priors(dk_geno_values=self._dk_geno_values) else: priors_class_kwargs[prior_group][key] = \ component_module.get_priors() @@ -1552,6 +1585,7 @@ def settings(self): "growth_transition":self._growth_transition, "ln_cfu0":self._ln_cfu0, "dk_geno":self._dk_geno, + "dk_geno_pins_file":self._dk_geno_pins_file, "activity":self._activity, "theta":self._theta, "transformation":self._transformation, diff --git a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py index 7c0883c9..e9845c6f 100644 --- a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py +++ b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py @@ -13,7 +13,12 @@ prior locs (degenerate, no learning) - ``dk_geno`` → ``fixed`` (all zeros; eliminates the WT-anchor bias that arises when mutants have non-zero mean - pleiotropic effects) + pleiotropic effects), *unless* the production + config already selects ``dk_geno: "pinned"``, in + which case the calibration model keeps + ``"pinned"`` (and its pins file) so genotypes + with independently known dk_geno retain their + real value instead of being zeroed out too. - ``ln_cfu0`` → ``hierarchical`` with hyperparams *pinned* - ``transformation`` → ``single`` (no learning) - ``theta_*_noise`` → ``zero`` (no learning) @@ -66,12 +71,13 @@ # These are the components that get *replaced* relative to the production # YAML. ``condition_growth`` and ``growth_transition`` are intentionally # absent from this dict — their production choices flow through unchanged -# so the calibration MAP can refine the production priors. +# so the calibration MAP can refine the production priors. ``dk_geno`` is +# also absent — it needs conditional handling (see +# ``_build_calibration_model``) rather than an unconditional override. # --------------------------------------------------------------------------- _CALIBRATION_OVERRIDES = { "theta": "_simple", "activity": "hierarchical_geno", - "dk_geno": "fixed", "ln_cfu0": "hierarchical", "transformation": "single", "theta_growth_noise": "zero", @@ -262,6 +268,19 @@ def _build_calibration_model(orchestrator_prod, growth_df_cal, binding_df_cal): # (N_growth_prod / N_binding_prod, often >> 1) would drown the binding # signal, so we reset to 1.0 here. settings["binding_weight"] = 1.0 + + # dk_geno: the calibration MAP must not *learn* dk_geno from + # calibration-only data (that reintroduces the WT-anchor bias this + # pre-fit exists to avoid). Default: force to "fixed" (all zero), like + # every other overridden component. Exception: if the production config + # pins specific genotypes' dk_geno via "pinned", carry that choice (and + # its pins file) into the calibration model too, so those genotypes keep + # their real, independently-known dk_geno during the linking-function + # fit instead of being zeroed out along with everything else. + if settings.get("dk_geno") != "pinned": + settings["dk_geno"] = "fixed" + settings.pop("dk_geno_pins_file", None) + batch_size = settings.pop("batch_size", None) return ModelOrchestrator(growth_df_cal, diff --git a/tests/tfscreen/tfmodel/generative/components/dk_geno/test_pinned.py b/tests/tfscreen/tfmodel/generative/components/dk_geno/test_pinned.py new file mode 100644 index 00000000..b0c4100b --- /dev/null +++ b/tests/tfscreen/tfmodel/generative/components/dk_geno/test_pinned.py @@ -0,0 +1,262 @@ +import pytest +import numpy as np +import jax.numpy as jnp +from numpyro.handlers import trace, seed +from collections import namedtuple + +# --- Import Module Under Test (MUT) --- +from tfscreen.tfmodel.generative.components.dk_geno.pinned import ( + ModelPriors, + define_model, + guide, + get_hyperparameters, + get_guesses, + get_priors, + get_extract_specs, + read_dk_geno_pins, + build_dk_geno_values, +) + +# --- Mock Data Fixture --- + +MockGrowthData = namedtuple("MockGrowthData", [ + "batch_size", + "batch_idx", + "wt_indexes", +]) + + +@pytest.fixture +def mock_data(): + """ + 4 genotypes (0 = wt, 1-3 = mutants). batch_idx repeats some entries to + exercise the batching/indexing path. + """ + batch_idx = jnp.array([0, 1, 2, 3, 1, 0], dtype=jnp.int32) + return MockGrowthData( + batch_size=6, + batch_idx=batch_idx, + wt_indexes=jnp.array([0], dtype=jnp.int32), + ) + + +# --------------------------------------------------------------------------- +# get_hyperparameters / get_priors / get_guesses +# --------------------------------------------------------------------------- + +def test_get_hyperparameters(): + params = get_hyperparameters() + assert isinstance(params, dict) + assert "dk_geno_values" in params + assert np.asarray(params["dk_geno_values"]).shape == (1,) + assert np.all(np.asarray(params["dk_geno_values"]) == 0.0) + + +def test_get_guesses(mock_data): + guesses = get_guesses("test_dk", mock_data) + assert isinstance(guesses, dict) + assert len(guesses) == 0 + + +def test_get_priors_default_is_placeholder(): + priors = get_priors() + assert isinstance(priors, ModelPriors) + assert np.asarray(priors.dk_geno_values).shape == (1,) + + +def test_get_priors_with_values(): + values = jnp.array([0.0, -0.02, 0.01, 0.0]) + priors = get_priors(dk_geno_values=values) + assert isinstance(priors, ModelPriors) + assert jnp.allclose(priors.dk_geno_values, values) + + +def test_get_extract_specs(): + MockCtx = namedtuple("MockCtx", ["growth_tm"]) + MockTm = namedtuple("MockTm", ["df"]) + ctx = MockCtx(growth_tm=MockTm(df="the_df")) + + specs = get_extract_specs(ctx) + assert isinstance(specs, list) + assert len(specs) == 1 + assert specs[0]["input_df"] == "the_df" + assert specs[0]["params_to_get"] == ["dk_geno"] + assert specs[0]["map_column"] == "map_genotype" + + +# --------------------------------------------------------------------------- +# define_model / guide — core logic and shapes +# --------------------------------------------------------------------------- + +def test_define_model_logic_and_shapes(mock_data): + """ + Per-genotype pinned values are indexed via batch_idx; wt is forced to 0 + even though its own pin (index 0) is already 0 here. + """ + name = "test_dk_pinned" + dk_values = jnp.array([0.0, -0.02, 0.01, 0.005]) + priors = get_priors(dk_geno_values=dk_values) + + final_dk_geno = define_model(name=name, data=mock_data, priors=priors) + + model_trace = trace(define_model).get_trace( + name=name, data=mock_data, priors=priors + ) + + assert name in model_trace + dk_geno_site = model_trace[name]["value"] + assert dk_geno_site.shape == (mock_data.batch_size,) + + expected = dk_values[mock_data.batch_idx] + assert jnp.allclose(dk_geno_site, expected) + + expected_shape = (1, 1, 1, 1, 1, 1, mock_data.batch_size) + assert final_dk_geno.shape == expected_shape + assert jnp.allclose(final_dk_geno[0, 0, 0, 0, 0, 0, :], expected) + + +def test_define_model_forces_wt_to_zero_even_if_pinned_nonzero(mock_data): + """ + Defense in depth: even if dk_geno_values has a nonzero entry at a wt + index, define_model must still force wt entries to exactly 0. + """ + name = "test_dk_pinned_wt" + # wt (index 0) mistakenly pinned nonzero. + dk_values = jnp.array([0.5, -0.02, 0.01, 0.005]) + priors = get_priors(dk_geno_values=dk_values) + + model_trace = trace(define_model).get_trace( + name=name, data=mock_data, priors=priors + ) + dk_geno_site = model_trace[name]["value"] + + wt_in_batch = jnp.where(jnp.isin(mock_data.batch_idx, mock_data.wt_indexes))[0] + assert jnp.all(dk_geno_site[wt_in_batch] == 0.0) + + +def test_guide_logic_and_shapes(mock_data): + """guide mirrors define_model but registers no sites.""" + name = "test_dk_pinned_guide" + dk_values = jnp.array([0.0, -0.02, 0.01, 0.005]) + priors = get_priors(dk_geno_values=dk_values) + + with seed(rng_seed=0): + tr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + final_dk_geno = guide(name=name, data=mock_data, priors=priors) + + # No sites registered at all (pure function, no pyro.sample/deterministic). + assert len(tr) == 0 + + expected = dk_values[mock_data.batch_idx] + expected_shape = (1, 1, 1, 1, 1, 1, mock_data.batch_size) + assert final_dk_geno.shape == expected_shape + assert jnp.allclose(final_dk_geno[0, 0, 0, 0, 0, 0, :], expected) + + +def test_model_and_guide_have_no_sample_sites(mock_data): + """Neither define_model nor guide register any pyro.sample sites.""" + name = "compat" + dk_values = jnp.array([0.0, -0.02, 0.01, 0.005]) + priors = get_priors(dk_geno_values=dk_values) + + with seed(rng_seed=0): + model_trace = trace(define_model).get_trace( + name=name, data=mock_data, priors=priors + ) + guide_trace = trace(guide).get_trace( + name=name, data=mock_data, priors=priors + ) + + model_samples = { + n for n, s in model_trace.items() + if s["type"] == "sample" and not s.get("is_observed", False) + } + guide_samples = {n for n, s in guide_trace.items() if s["type"] == "sample"} + + assert model_samples == set() + assert guide_samples == set() + + +# --------------------------------------------------------------------------- +# read_dk_geno_pins — CSV I/O +# --------------------------------------------------------------------------- + +def test_read_dk_geno_pins_valid(tmp_path): + csv_path = tmp_path / "pins.csv" + csv_path.write_text("genotype,dk_geno\nm1,-0.02\nm2,0.01\n") + + pins = read_dk_geno_pins(str(csv_path)) + assert pins == {"m1": -0.02, "m2": 0.01} + + +def test_read_dk_geno_pins_missing_column(tmp_path): + csv_path = tmp_path / "pins.csv" + csv_path.write_text("genotype\nm1\n") + + with pytest.raises(ValueError, match="missing required column"): + read_dk_geno_pins(str(csv_path)) + + +def test_read_dk_geno_pins_unrecognised_column(tmp_path): + csv_path = tmp_path / "pins.csv" + csv_path.write_text("genotype,dk_geno,extra\nm1,-0.02,foo\n") + + with pytest.raises(ValueError, match="unrecognised column"): + read_dk_geno_pins(str(csv_path)) + + +def test_read_dk_geno_pins_duplicate_genotype(tmp_path): + csv_path = tmp_path / "pins.csv" + csv_path.write_text("genotype,dk_geno\nm1,-0.02\nm1,0.03\n") + + with pytest.raises(ValueError, match="more than once"): + read_dk_geno_pins(str(csv_path)) + + +# --------------------------------------------------------------------------- +# build_dk_geno_values — array assembly and validation +# --------------------------------------------------------------------------- + +def test_build_dk_geno_values_defaults_unlisted_to_zero(): + pins = {"m1": -0.02} + genotype_labels = ["wt", "m1", "m2"] + + values = build_dk_geno_values(pins, genotype_labels) + assert values.shape == (3,) + assert values[0] == pytest.approx(0.0) + assert values[1] == pytest.approx(-0.02) + assert values[2] == pytest.approx(0.0) + + +def test_build_dk_geno_values_unknown_genotype_raises(): + pins = {"m1": -0.02, "not_in_data": 0.01} + genotype_labels = ["wt", "m1", "m2"] + + with pytest.raises(ValueError, match="not_in_data"): + build_dk_geno_values(pins, genotype_labels) + + +def test_build_dk_geno_values_nonzero_wt_raises(): + pins = {"wt": 0.01, "m1": -0.02} + genotype_labels = ["wt", "m1", "m2"] + + with pytest.raises(ValueError, match="wildtype dk_geno must be exactly 0.0"): + build_dk_geno_values(pins, genotype_labels) + + +def test_build_dk_geno_values_zero_wt_allowed(): + pins = {"wt": 0.0, "m1": -0.02} + genotype_labels = ["wt", "m1", "m2"] + + values = build_dk_geno_values(pins, genotype_labels) + assert values[0] == pytest.approx(0.0) + assert values[1] == pytest.approx(-0.02) + + +def test_build_dk_geno_values_custom_wt_label(): + pins = {"WT": 0.0, "m1": -0.02} + genotype_labels = ["WT", "m1"] + + values = build_dk_geno_values(pins, genotype_labels, wt_label="WT") + assert values[0] == pytest.approx(0.0) + assert values[1] == pytest.approx(-0.02) diff --git a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py index 05c5c3fc..aeb4f2df 100644 --- a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py @@ -685,6 +685,9 @@ def test_overrides_replace_production_components(self): # Overrides applied for k, v in _CALIBRATION_OVERRIDES.items(): assert kwargs[k] == v + # dk_geno is handled conditionally (not via _CALIBRATION_OVERRIDES): + # production wasn't "pinned", so it's forced to "fixed". + assert kwargs["dk_geno"] == "fixed" # Spiked genotypes dropped (calibration only sees the intersection) assert kwargs["spiked_genotypes"] is None # batch_size pulled out of settings and passed positionally @@ -697,6 +700,75 @@ def test_overrides_replace_production_components(self): # production upweighting drowning the binding signal. assert kwargs["binding_weight"] == 1.0 + def test_dk_geno_pinned_carried_through_from_production(self): + """ + If the production config pins specific genotypes' dk_geno, the + calibration model must keep "pinned" (and its pins file) instead of + forcing "fixed" — otherwise the known-nonzero genotypes would be + zeroed out along with everything else, defeating the point of + pinning them. + """ + orchestrator_prod = MagicMock() + orchestrator_prod.settings = { + "theta": "categorical_geno", + "activity": "horseshoe_geno", + "dk_geno": "pinned", + "dk_geno_pins_file": "dk_geno_pins.csv", + "ln_cfu0": "fixed", + "transformation": "logit_norm", + "theta_growth_noise": "beta", + "theta_binding_noise": "beta", + "condition_growth": "linear", + "growth_transition": "instant", + "batch_size": None, + "spiked_genotypes": None, + } + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator" + ) as MockGM: + MockGM.return_value = MagicMock() + _build_calibration_model(orchestrator_prod, pd.DataFrame(), pd.DataFrame()) + + kwargs = MockGM.call_args.kwargs + assert kwargs["dk_geno"] == "pinned" + assert kwargs["dk_geno_pins_file"] == "dk_geno_pins.csv" + + def test_dk_geno_pins_file_dropped_when_not_pinned(self): + """ + A stray dk_geno_pins_file left in production settings (e.g. from an + earlier config edit) must not leak into the calibration model when + dk_geno isn't "pinned" — ModelOrchestrator raises if a pins file is + given without dk_geno='pinned'. + """ + orchestrator_prod = MagicMock() + orchestrator_prod.settings = { + "theta": "categorical_geno", + "activity": "horseshoe_geno", + "dk_geno": "hierarchical_geno", + "dk_geno_pins_file": "stale_pins.csv", + "ln_cfu0": "fixed", + "transformation": "logit_norm", + "theta_growth_noise": "beta", + "theta_binding_noise": "beta", + "condition_growth": "linear", + "growth_transition": "instant", + "batch_size": None, + "spiked_genotypes": None, + } + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator" + ) as MockGM: + MockGM.return_value = MagicMock() + _build_calibration_model(orchestrator_prod, pd.DataFrame(), pd.DataFrame()) + + kwargs = MockGM.call_args.kwargs + assert kwargs["dk_geno"] == "fixed" + assert "dk_geno_pins_file" not in kwargs + def test_binding_weight_reset_from_large_production_value(self): # Reproduces the weighting bug: production YAML stores a large # binding_weight (N_growth / N_binding); the calibration model diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 50a18ec4..6215a59c 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -431,6 +431,132 @@ def test_initialize_classes_logic(mocker): assert model._theta == "categorical_geno" +# --------------------------------------------------------------------------- +# dk_geno="pinned" wiring +# --------------------------------------------------------------------------- + +def test_dk_geno_pinned_requires_pins_file(): + """ + dk_geno='pinned' without dk_geno_pins_file must raise before any data + I/O happens (mirrors + test_model_orchestrator_rejects_categorical_geno_with_empirical: + "g.csv"/"b.csv" are never touched). + """ + with pytest.raises(ValueError, match="requires dk_geno_pins_file"): + ModelOrchestrator("g.csv", "b.csv", dk_geno="pinned") + + +def test_dk_geno_pins_file_without_pinned_component_raises(): + """A stray dk_geno_pins_file with any other dk_geno component must raise.""" + with pytest.raises(ValueError, match="dk_geno != 'pinned'"): + ModelOrchestrator( + "g.csv", "b.csv", + dk_geno="hierarchical_geno", + dk_geno_pins_file="pins.csv", + ) + + +class _SpyPinnedModule: + """ + Thin real-object wrapper around dk_geno.pinned. + + inspect.signature(component_module.get_priors) must see the real + "dk_geno_values" parameter for _initialize_classes's branch selection to + fire (a bare MagicMock's signature is just (*args, **kwargs), which + would silently fall through to the wrong branch). Wrapping with an + explicit method of the same shape gets us a real signature while still + recording what was actually passed. + """ + + def __init__(self, real_module): + self._real_module = real_module + self.calls = [] + + def get_priors(self, dk_geno_values=None): + self.calls.append(dk_geno_values) + return self._real_module.get_priors(dk_geno_values=dk_geno_values) + + def __getattr__(self, name): + return getattr(self._real_module, name) + + +def test_dk_geno_pinned_builds_values_and_wires_into_priors(mocker, tmp_path): + """ + End-to-end: a pinned dk_geno_pins_file is read, converted to a + (num_genotype,) array ordered by the growth genotype axis, and passed + into the "pinned" component's get_priors(dk_geno_values=...). + """ + from tfscreen.tfmodel.generative.components.dk_geno import pinned as real_pinned + + csv_path = tmp_path / "pins.csv" + csv_path.write_text("genotype,dk_geno\nm1,-0.02\nm3,0.01\n") + + mock_growth_tm = create_mock_tm(is_growth=True) + mock_binding_tm = create_mock_tm(is_growth=False) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_growth_tm", return_value=mock_growth_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_binding_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_binding_tm", return_value=mock_binding_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator.populate_dataclass", return_value=MagicMock()) + mocker.patch( + "tfscreen.tfmodel.model_orchestrator._setup_batching", + return_value={ + "batch_idx": jnp.arange(7), "batch_size": 7, + "scale_vector": jnp.ones(7), "num_binding": 0, + }, + ) + + spy = _SpyPinnedModule(real_pinned) + + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", { + "condition_growth": {"hierarchical": MagicMock()}, + "growth_transition": {"instant": MagicMock()}, + "ln_cfu0": {"hierarchical": MagicMock()}, + "dk_geno": {"pinned": spy}, + "activity": {"hierarchical_geno": MagicMock()}, + "theta": {"hill_geno": MagicMock()}, + "transformation": {"single": MagicMock()}, + "theta_rescale": {"passthrough": MagicMock()}, + "theta_growth_noise": {"zero": MagicMock()}, + "theta_binding_noise": {"zero": MagicMock()}, + "growth_noise": {"zero": MagicMock()}, + "sample_offset": {"zero": MagicMock()}, + "observe_binding": MagicMock(), + "observe_growth": MagicMock(), + }, clear=True): + for k in ["condition_growth", "growth_transition", "ln_cfu0", "activity", + "theta", "transformation", "theta_growth_noise", + "theta_binding_noise", "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_priors.return_value = {} + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_guesses.return_value = {} + + model = ModelOrchestrator( + "g.csv", "b.csv", + dk_geno="pinned", + dk_geno_pins_file=str(csv_path), + condition_growth="hierarchical", + growth_transition="instant", + activity="hierarchical_geno", + theta="hill_geno", + transformation="single", + theta_growth_noise="zero", + ) + + expected = np.array([0.0, -0.02, 0.0, 0.01, 0.0, 0.0, 0.0]) + + # _dk_geno_values built during _initialize_data, ordered wt,m1..m6. + assert np.allclose(np.asarray(model._dk_geno_values), expected) + + # The component received that exact array via get_priors(dk_geno_values=...). + assert len(spy.calls) == 1 + assert np.allclose(np.asarray(spy.calls[0]), expected) + + # Round-trips through the settings dict for YAML config serialisation. + assert model.settings["dk_geno_pins_file"] == str(csv_path) + assert model.settings["dk_geno"] == "pinned" + + @pytest.mark.parametrize("transformation_key, expected_needs_population", [ ("single", False), ("logit_norm", False), @@ -571,6 +697,7 @@ def test_model_class_properties(initialized_model_class): model._growth_transition = "gt" model._ln_cfu0 = "ln" model._dk_geno = "dk" + model._dk_geno_pins_file = None model._theta_growth_noise = "gn" model._theta_binding_noise = "bn" model._growth_noise = "grn" @@ -595,6 +722,7 @@ def test_model_class_properties(initialized_model_class): assert ModelOrchestrator.settings.fget(model)["growth_transition"] == "gt" assert ModelOrchestrator.settings.fget(model)["ln_cfu0"] == "ln" assert ModelOrchestrator.settings.fget(model)["dk_geno"] == "dk" + assert ModelOrchestrator.settings.fget(model)["dk_geno_pins_file"] is None assert ModelOrchestrator.settings.fget(model)["theta_growth_noise"] == "gn" assert ModelOrchestrator.settings.fget(model)["theta_binding_noise"] == "bn" assert ModelOrchestrator.settings.fget(model)["growth_noise"] == "grn" From f4a8f28625236cea06b8faa6b12c4ddd0488f1e4 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Fri, 3 Jul 2026 19:06:05 -0700 Subject: [PATCH 07/30] oom fix for new posterior sampling --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 4495 ++--------------- reports/junit/junit.xml | 2 +- .../components/ln_cfu0/hierarchical.py | 110 +- .../ln_cfu0/hierarchical_factored.py | 31 +- .../tfmodel/inference/run_inference.py | 170 +- src/tfscreen/tfmodel/model_orchestrator.py | 15 +- .../tfmodel/scripts/prefit_calibration_cli.py | 90 +- .../components/ln_cfu0/test_hierarchical.py | 221 + .../ln_cfu0/test_hierarchical_factored.py | 77 + .../tfmodel/inference/test_run_inference.py | 56 +- .../scripts/test_prefit_calibration_cli.py | 273 + .../tfmodel/test_model_orchestrator.py | 91 + 14 files changed, 1303 insertions(+), 4332 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 9d82a86e..97afee55 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.35%coverage96.35% \ No newline at end of file +coverage: 96.42%coverage96.42% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 861824f3..f2be4178 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3730tests3730 \ No newline at end of file +tests: 3758tests3758 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index 563b6b4b..76d216f3 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1,3872 +1,3 @@ -./build/lib/tfscreen/__init__.py:19:1: W391 blank line at end of file -./build/lib/tfscreen/__version__.py:5:16: W291 trailing whitespace -./build/lib/tfscreen/analysis/__init__.py:13:1: W391 blank line at end of file -./build/lib/tfscreen/analysis/cat_response/__init__.py:2:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/__init__.py:3:55: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: C901 'cat_fit' is too complex (19) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:25:80: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:26:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:42:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:51:51: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:87:49: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:88:40: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:51: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:90:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:91:40: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:92:48: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:94:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:108:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:110:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:115:48: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:117:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:124:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:125:47: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:72: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:74: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:130:13: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:148:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:150:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:155:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:172:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:174:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:55: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:62: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:57: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:65: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:191:9: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:192:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:204:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:205:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:206:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:207:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:209:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:5: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:32: W292 no newline at end of file -./build/lib/tfscreen/analysis/cat_response/cat_response.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/cat_response.py:23:73: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:26:78: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:44:74: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:45:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:46:26: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:51:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:57:43: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:97:43: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:98:26: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:130:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:134:34: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:138:42: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:141:56: W292 no newline at end of file -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:21:1: C901 'cat_response' is too complex (11) -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:91:56: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: C901 'mutant_cycle_pivot' is too complex (11) -./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/extract_epistasis.py:33:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:34:25: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:78:25: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:96:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:113:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:125:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:129:1: C901 'extract_epistasis' is too complex (12) -./build/lib/tfscreen/analysis/extract_epistasis.py:133:47: E252 missing whitespace around parameter equals -./build/lib/tfscreen/analysis/extract_epistasis.py:133:48: E252 missing whitespace around parameter equals -./build/lib/tfscreen/analysis/extract_epistasis.py:159:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:183:36: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:184:27: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:187:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:192:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:201:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:208:55: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:208:60: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:208:65: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:210:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:216:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:223:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:229:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:231:10: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:233:30: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/stats_test_suite.py:8:31: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:8:42: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:55:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:66:52: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:104:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:134:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:143:26: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:144:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:148:5: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/stats_test_suite.py:149:22: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:150:15: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:151:26: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:155:21: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:156:24: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:157:24: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:158:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:159:21: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:161:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:163:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/build_cycles.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/build_cycles.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/build_cycles.py:69:26: W291 trailing whitespace -./build/lib/tfscreen/genetics/build_cycles.py:78:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/build_mut_geno_matrix.py:5:1: C901 'build_mut_geno_matrix' is too complex (17) -./build/lib/tfscreen/genetics/combine_mutation_effects.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/combine_mutation_effects.py:11:50: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:32:73: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:34:71: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:35:21: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:65:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:73:27: E261 at least two spaces before inline comment -./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E117 over-indented -./build/lib/tfscreen/genetics/combine_mutation_effects.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:89:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:104:25: W292 no newline at end of file -./build/lib/tfscreen/genetics/count_mutation_backgrounds.py:8:1: C901 'count_mutation_backgrounds' is too complex (12) -./build/lib/tfscreen/genetics/data.py:25:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:26:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:27:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:28:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:29:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:30:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:31:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:32:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:33:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:34:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:35:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:36:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:37:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:38:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:41:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:42:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:43:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:44:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:45:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:46:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:46:28: W292 no newline at end of file -./build/lib/tfscreen/genetics/expand_genotype_columns.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/expand_genotype_columns.py:16:51: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:47:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:64:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:77:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:79:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/expand_genotype_columns.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:95:41: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:96:31: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:105:14: W292 no newline at end of file -./build/lib/tfscreen/genetics/genotype_sorting.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/genotype_sorting.py:9:58: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:11:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:16:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:17:74: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:18:81: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:19:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:20:35: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:29:11: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:37:41: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:43:79: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:51:74: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:53:30: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:53:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:57:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:70:39: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:86:37: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:86:46: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:89:55: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:92:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:100:67: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:140:8: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:141:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E117 over-indented -./build/lib/tfscreen/genetics/genotype_sorting.py:218:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:221:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/genotype_sorting.py:221:32: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:221:50: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:240:40: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:273:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:274:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:292:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:298:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/get_single_with_wt.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/get_single_with_wt.py:46:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:55:59: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:58:38: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:59:38: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:60:39: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:63:11: E124 closing bracket does not match visual indentation -./build/lib/tfscreen/genetics/get_single_with_wt.py:65:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:66:52: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:78:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/get_single_with_wt.py:80:49: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/get_single_with_wt.py:87:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:90:69: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:93:37: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:94:61: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:97:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:107:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:57:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/library_manager.py:76:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:94:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:158:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:159:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/library_manager.py:169:22: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:181:5: C901 'LibraryManager._parse_and_validate' is too complex (12) -./build/lib/tfscreen/genetics/library_manager.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:226:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:235:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:244:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:250:9: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:251:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:254:27: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:254:36: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:258:32: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:258:46: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:51: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:58: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:70: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:300:48: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:300:94: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:307:35: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:309:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:310:49: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:311:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:313:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:316:37: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:316:49: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:318:30: E701 multiple statements on one line (colon) -./build/lib/tfscreen/genetics/library_manager.py:321:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:324:18: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/genetics/library_manager.py:373:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:378:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:380:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:386:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:415:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:421:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:427:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:466:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:467:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:471:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:476:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:478:25: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:478:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:479:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:482:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:488:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:493:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:526:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:527:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:528:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:555:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:560:73: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:560:82: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:561:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:562:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:562:55: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:562:63: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:563:39: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:563:43: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:564:34: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:564:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:566:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:568:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:605:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:611:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:613:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:616:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:617:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:648:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:650:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:656:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:657:31: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:661:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:663:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:665:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:695:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:698:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:703:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:708:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:710:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:712:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:713:30: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:721:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:740:28: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:740:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:748:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:776:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:781:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:787:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:790:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:791:39: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:794:72: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:795:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:798:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:806:9: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:807:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:810:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:811:15: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:825:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:838:79: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:839:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:840:34: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:841:58: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:845:64: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:853:37: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:854:27: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:856:40: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:859:1: W391 blank line at end of file -./build/lib/tfscreen/mle/__init__.py:16:1: W391 blank line at end of file -./build/lib/tfscreen/mle/curve_models/__init__.py:4:77: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:5:42: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:11:77: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:16:76: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:18:29: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:52:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:53:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:54:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:55:22: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:58:28: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:59:28: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:60:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:61:24: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:62:27: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:65:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:66:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:67:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:68:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:69:30: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:72:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:73:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:74:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:75:25: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:76:28: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:79:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:80:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:81:37: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:82:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:83:35: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:86:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:87:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:88:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:89:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:90:33: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:93:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:94:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:95:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:96:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:97:30: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:100:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:101:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:102:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:103:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:104:29: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:104:55: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:107:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:108:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:109:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:110:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:111:34: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:114:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:115:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:116:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:117:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:117:33: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/guesses.py:3:69: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:25:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:25:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:42:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:42:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:45:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:65:23: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:69:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:89:23: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:109:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:110:24: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:114:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:129:35: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:130:24: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:134:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:150:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:155:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:165:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:181:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:196:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:212:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:215:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:217:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:222:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:225:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:243:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:247:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:250:26: E225 missing whitespace around operator -./build/lib/tfscreen/mle/curve_models/guesses.py:252:10: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:257:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:257:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:260:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:271:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:271:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:274:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:274:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:277:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:288:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:288:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:291:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:291:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:294:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:305:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:305:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:308:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:308:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:311:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:322:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:322:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:324:1: W391 blank line at end of file -./build/lib/tfscreen/mle/curve_models/models.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:38:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:39:26: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:40:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:41:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:68:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:70:51: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:75:25: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:88:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:91:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:130:27: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:42: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:132:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:203:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:206:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:206:41: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:207:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:207:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:210:38: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:211:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:213:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:213:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:214:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:251:30: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:251:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:252:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:254:30: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:254:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:255:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:259:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:262:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:301:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:304:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:316:28: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:326:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:26:72: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:29:56: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:34:72: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:36:69: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:41:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:71:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:77:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:123:5: E301 expected 1 blank line, found 0 -./build/lib/tfscreen/mle/fit_manager.py:186:62: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:223:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:225:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:227:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:247:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:250:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:269:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:272:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:291:24: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:294:41: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:320:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:337:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:340:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:344:5: E303 too many blank lines (2) -./build/lib/tfscreen/mle/fit_manager.py:344:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:425:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:456:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:473:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/__init__.py:7:1: W391 blank line at end of file -./build/lib/tfscreen/mle/fitters/_util.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/_util.py:5:14: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:5:24: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:5:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:6:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/_util.py:19:18: E225 missing whitespace around operator -./build/lib/tfscreen/mle/fitters/_util.py:21:44: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/_util.py:27:34: W292 no newline at end of file -./build/lib/tfscreen/mle/fitters/least_squares.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/least_squares.py:42:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:43:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:44:5: E303 too many blank lines (2) -./build/lib/tfscreen/mle/fitters/least_squares.py:44:76: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:47:38: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/least_squares.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:119:18: F541 f-string is missing placeholders -./build/lib/tfscreen/mle/fitters/least_squares.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:126:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/matrix_nls.py:13:76: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:35: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:39: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:56:52: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:67:54: W292 no newline at end of file -./build/lib/tfscreen/mle/fitters/matrix_wls.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/matrix_wls.py:27:81: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:30:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:42:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:52:40: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:54:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:55:52: W292 no newline at end of file -./build/lib/tfscreen/mle/predict_with_error.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/predict_with_error.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/predict_with_error.py:42:36: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:54:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/predict_with_error.py:57:43: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:61:45: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:74:32: W292 no newline at end of file -./build/lib/tfscreen/plot/__init__.py:36:63: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:13:1: C901 'cat_fits' is too complex (11) -./build/lib/tfscreen/plot/cat_fits.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/cat_fits.py:13:15: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:13:17: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:99:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:99:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:113:80: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:119:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:120:74: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:121:14: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:123:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:123:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:128:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:128:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:137:53: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:147:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:147:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:163:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:163:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:171:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:172:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:173:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:174:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:175:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:176:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:187:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:187:5: W292 no newline at end of file -./build/lib/tfscreen/plot/corner.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/corner.py:11:76: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:12:23: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:17:66: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:19:80: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:38:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/corner.py:39:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:47:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:63: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:73: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:54:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:55:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:64:15: W292 no newline at end of file -./build/lib/tfscreen/plot/default_styles.py:17:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:17:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:17:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:27:8: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:28:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:29:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:33:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:34:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:38:8: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:39:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:40:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:44:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:45:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:46:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:47:14: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:54:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:55:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:56:13: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:56:16: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/default_styles.py:58:41: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:59:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:59:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:59:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:62:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:63:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:63:32: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/default_styles.py:64:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:65:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:66:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:70:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:71:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:72:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:73:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:74:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:79:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:79:21: W291 trailing whitespace -./build/lib/tfscreen/plot/default_styles.py:80:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:81:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:82:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:83:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:84:2: W292 no newline at end of file -./build/lib/tfscreen/plot/err_vs_mag.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/err_vs_mag.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/err_vs_mag.py:20:34: W291 trailing whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:33:55: W291 trailing whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:43:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:44:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:49:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:49:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:55:5: E303 too many blank lines (3) -./build/lib/tfscreen/plot/err_vs_mag.py:57:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:62:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:37: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:50: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:63:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:64:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:70:14: W292 no newline at end of file -./build/lib/tfscreen/plot/err_zscore.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/err_zscore.py:21:77: W291 trailing whitespace -./build/lib/tfscreen/plot/err_zscore.py:22:37: W291 trailing whitespace -./build/lib/tfscreen/plot/err_zscore.py:52:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:52:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:53:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:54:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:54:51: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:57:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:58:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:72:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:73:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:73:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:73:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:78:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:79:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:41: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:16:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/est_v_real_summary.py:24:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/est_v_real_summary.py:54:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/est_v_real_summary.py:57:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:70:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:72:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/est_v_real_summary.py:72:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:72:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:72:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:102:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:106:1: W391 blank line at end of file -./build/lib/tfscreen/plot/geno_trajectory.py:29:1: C901 'plot_geno_trajectory' is too complex (14) -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:15:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:17:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:19:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:23:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:26:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:32:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:33:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:42:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:44:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:17:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:18:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:20:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:24:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:26:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:27:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:39:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:41:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:15:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:19:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:20:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:21:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:23:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:25:17: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:33:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:73: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:74: E262 inline comment should start with '# ' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:50:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:52:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:6:18: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: C901 '_build_heatmap_collection' is too complex (11) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:88:38: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:90:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:93:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:107:55: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:110:55: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:125:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:126:48: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:129:68: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:142:33: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:143:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:13: E221 multiple spaces before operator -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:28: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:151:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:154:33: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:155:16: E221 multiple spaces before operator -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:156:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:34: E203 whitespace before ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:34: E203 whitespace before ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:41: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:41: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:160:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:66: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: C901 '_build_color_mapper' is too complex (13) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:217:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:39: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:243:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:276:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:280:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:281:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:338:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:373:40: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:375:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:382:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:385:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:388:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:443:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:448:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:456:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:457:1: C901 'heatmap' is too complex (13) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:509:76: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:528:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:531:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:561:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:569:53: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:570:5: F841 local variable 'e' is assigned to but never used -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:580:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:589:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:590:39: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:37: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:57: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:593:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:596:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:612:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:615:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:620:20: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:621:69: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:622:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:625:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:629:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:636:35: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:637:34: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:638:32: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:639:37: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:643:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:644:57: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:645:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:647:72: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:56: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:671:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:672:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:679:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:680:19: W292 no newline at end of file -./build/lib/tfscreen/plot/helper.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:28:78: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:29:40: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:31:55: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:51:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:60:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:62:71: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:64:61: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:69:47: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:70:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:74:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:84:76: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:93:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:100:17: W292 no newline at end of file -./build/lib/tfscreen/plot/hill_fit.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/plot_theta_fits.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/plot_theta_fits.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:84:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:84:50: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:86:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:88:73: E225 missing whitespace around operator -./build/lib/tfscreen/plot/plot_theta_fits.py:89:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:92:52: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:95:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:98:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:98:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:102:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:102:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:105:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:108:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:108:46: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:115:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:121:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:124:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:130:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:133:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:139:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:141:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:144:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:153:1: W391 blank line at end of file -./build/lib/tfscreen/plot/uncertainty_calibration.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/uncertainty_calibration.py:21:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/uncertainty_calibration.py:24:63: W291 trailing whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:65:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:71:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:71:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:84:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:84:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:15: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:18: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:89:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:41: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:46: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:93:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:94:18: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:97:14: W292 no newline at end of file -./build/lib/tfscreen/plot/xy_corr.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/xy_corr.py:24:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/xy_corr.py:63:47: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:64:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:69:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:69:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:88:17: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/plot/xy_corr.py:89:17: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/plot/xy_corr.py:91:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:62: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:67: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:93:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:94:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:97:14: W292 no newline at end of file -./build/lib/tfscreen/process_raw/_counts_io.py:110:16: F541 f-string is missing placeholders -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:30:69: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:77:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:110:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:147:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:191:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:193:41: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:194:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:197:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:200:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:203:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:212:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:213:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:214:64: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:229:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:49: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:66: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:238:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:241:52: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:21:14: E401 multiple imports on one line -./build/lib/tfscreen/process_raw/fastq_to_counts.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/fastq_to_counts.py:26:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:69:44: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:104:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:113:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:136:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:137:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:138:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:139:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:144:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:149:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:156:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:188:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:194:15: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:204:42: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/fastq_to_counts.py:207:42: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/fastq_to_counts.py:208:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:216:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:219:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:220:40: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:223:54: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:226:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:233:66: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:247:18: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:249:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:260:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:262:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:263:45: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:266:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:267:5: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:290:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:296:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:46: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:302:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:303:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:304:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:305:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:306:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:318:50: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:319:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:322:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:324:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:326:58: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:32: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:332:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:334:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:32: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:336:57: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:338:35: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:347:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:348:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:9: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:5: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:30: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:361:15: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:364:79: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:365:79: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:367:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:368:21: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:371:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:377:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:380:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:381:20: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:403:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:405:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:406:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:410:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:411:43: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:435:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:440:65: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:451:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:458:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:459:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:460:78: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:464:40: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:34: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:471:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:476:34: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:481:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:482:45: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:487:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:35: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:44: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:496:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:497:40: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:506:68: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:511:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:43: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:516:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:526:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:529:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:34: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:44: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:546:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:553:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:47: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:558:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:565:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:567:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:30: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:39: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:571:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:574:22: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:576:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:579:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:580:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:581:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:584:78: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:586:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:594:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:595:66: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:596:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:600:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:602:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:603:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:604:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:605:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:610:27: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:612:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:613:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:614:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:618:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:623:62: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:624:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:625:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:652:50: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:653:50: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:664:1: W391 blank line at end of file -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:28: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:29: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:26: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:27: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:21: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:22: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:75:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:79:44: W292 no newline at end of file -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:25:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:26:39: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:46:87: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:47:87: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:56:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:64:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:66:71: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:82:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:83:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:85:51: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:88:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:96:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:105:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:142:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:165:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:168:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:173:45: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:181:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:182:43: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:25: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:40: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:207:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:237:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:257:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:258:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:259:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:260:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E117 over-indented -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:291:27: E231 missing whitespace after ':' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:292:25: E231 missing whitespace after ':' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:296:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:297:69: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:298:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:299:72: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:300:54: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:314:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:337:67: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:348:71: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:354:71: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:357:80: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:361:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:374:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:389:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:396:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:397:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:398:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:399:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:400:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:401:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:403:57: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:406:59: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:407:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:410:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:411:31: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:413:37: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:417:39: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:418:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:420:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:77:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:78:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:79:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:86:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/__init__.py:29:2: W292 no newline at end of file -./build/lib/tfscreen/simulate/binding_params.py:225:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) -./build/lib/tfscreen/simulate/binding_params.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:290:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:292:13: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:293:13: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:296:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:298:12: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:299:12: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:318:21: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:321:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:321:43: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:323:23: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:324:23: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:330:32: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:332:28: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:333:28: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:336:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:350:14: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:350:31: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:352:10: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:352:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:353:10: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:353:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:383:22: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:385:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:386:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:389:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:391:15: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/build_sample_dataframes.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/build_sample_dataframes.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file -./build/lib/tfscreen/simulate/library_prediction.py:28:1: C901 'library_prediction' is too complex (14) -./build/lib/tfscreen/simulate/library_prediction.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used -./build/lib/tfscreen/simulate/run_simulation.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/run_simulation.py:17:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:18:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:21:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:22:23: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:62: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:24:47: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:25:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:34:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:38:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:50:38: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:50:39: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:51:39: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:51:40: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:53:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:56:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:71:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:72:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:82:46: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:88:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:88:62: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:91:26: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:92:29: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:93:33: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:94:25: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:95:25: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:96:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:100:50: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:101:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:106:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:107:1: W391 blank line at end of file -./build/lib/tfscreen/simulate/sample_theta.py:170:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:171:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:172:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:173:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:174:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:175:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:176:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:119:15: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:120:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:121:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:126:20: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:127:22: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:128:21: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:147:48: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:148:14: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:149:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:154:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:167:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:170:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:171:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:172:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:175:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:177:25: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:179:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:193:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:45:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:46:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:71:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:72:1: C901 '_check_dict_number' is too complex (13) -./build/lib/tfscreen/simulate/selection_experiment.py:72:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:158:1: C901 '_check_cf' is too complex (25) -./build/lib/tfscreen/simulate/selection_experiment.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:199:57: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:223:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:224:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:290:1: C901 '_check_lib_spec' is too complex (12) -./build/lib/tfscreen/simulate/selection_experiment.py:290:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:347:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:369:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:422:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:438:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:446:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:446:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:456:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:466:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:509:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:513:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:514:75: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:524:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:527:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:573:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:584:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:585:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:588:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:592:55: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:598:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:603:30: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:604:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:608:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:678:50: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:678:52: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:680:75: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:682:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:683:46: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:684:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:685:67: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:735:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:752:79: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:758:29: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:800:43: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:806:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:807:18: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:813:79: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:815:33: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:820:80: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:825:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:831:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:842:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:885:73: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:890:76: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:907:25: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1015:26: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:52: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:60: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1023:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1024:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1032:42: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1041:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1042:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1044:63: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1052:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1059:28: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1061:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1062:24: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1069:79: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1074:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1075:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1077:36: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1079:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1089:128: E501 line too long (145 > 127 characters) -./build/lib/tfscreen/simulate/selection_experiment.py:1090:128: E501 line too long (145 > 127 characters) -./build/lib/tfscreen/simulate/selection_experiment.py:1094:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1095:72: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1099:34: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1106:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1108:20: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1108:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1109:20: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1111:32: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1112:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1124:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1132:41: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1139:49: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1141:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1146:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:37: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:45: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:61: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1152:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:1187:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1208:57: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1209:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1212:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1212:39: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1217:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1223:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1226:19: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1234:33: E261 at least two spaces before inline comment -./build/lib/tfscreen/simulate/selection_experiment.py:1235:49: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1236:37: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:1238:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1239:76: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1241:19: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1243:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1251:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1252:43: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1256:41: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/selection_experiment.py:1259:49: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1283:71: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1291:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1292:76: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1297:11: F541 f-string is missing placeholders -./build/lib/tfscreen/simulate/selection_experiment.py:1302:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1319:6: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/simulate/selection_experiment.py:1326:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1327:48: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1328:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1329:33: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1332:1: W391 blank line at end of file -./build/lib/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) -./build/lib/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (18) -./build/lib/tfscreen/simulate/thermo_to_growth.py:626:41: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/__init__.py:2:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:3:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:18:65: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:22:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:23:19: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:26:66: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:30:72: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:33:26: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:37:37: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:40:9: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:41:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:43:56: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:46:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:33:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:34:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:35:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:119:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:120:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:121:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:122:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:474:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:511:1: C901 'summarize_sbc' is too complex (16) -./build/lib/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/extraction.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/extraction.py:103:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:182:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:260:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:261:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:262:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:317:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:369:1: C901 'extract_growth_predictions' is too complex (11) -./build/lib/tfscreen/tfmodel/analysis/extraction.py:468:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:487:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:489:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:490:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:41:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/prediction.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:71:1: C901 'copy_orchestrator' is too complex (11) -./build/lib/tfscreen/tfmodel/analysis/prediction.py:198:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:244:1: C901 'predict' is too complex (22) -./build/lib/tfscreen/tfmodel/analysis/prediction.py:305:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:371:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:374:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:379:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:382:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:383:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:387:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:394:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:403:58: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/analysis/prediction.py:406:26: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:406:26: E117 over-indented -./build/lib/tfscreen/tfmodel/analysis/prediction.py:409:25: E122 continuation line missing indentation or outdented -./build/lib/tfscreen/tfmodel/analysis/prediction.py:415:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prior_predictive.py:104:33: E203 whitespace before ':' -./build/lib/tfscreen/tfmodel/configuration_io.py:19:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (31) -./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:190:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:193:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:195:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:196:40: E713 test for membership should be 'not in' -./build/lib/tfscreen/tfmodel/configuration_io.py:202:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:203:31: E713 test for membership should be 'not in' -./build/lib/tfscreen/tfmodel/configuration_io.py:209:18: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:225:33: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/configuration_io.py:237:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:251:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:251:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/configuration_io.py:253:1: C901 'read_configuration' is too complex (20) -./build/lib/tfscreen/tfmodel/configuration_io.py:253:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:289:128: E501 line too long (139 > 127 characters) -./build/lib/tfscreen/tfmodel/configuration_io.py:297:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:298:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:299:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:300:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:306:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:318:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:333:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:338:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/data_class.py:42:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:104:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/data_class.py:121:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:123:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:214:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/data_class.py:221:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:222:5: E266 too many leading '#' for block comment -./build/lib/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:17:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:48:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:51:45: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:59:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:60:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:71:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:78:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:108:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:47:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:100:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:104:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:108:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:118:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:57: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:126:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:164:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:166:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:170:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:178:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:182:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:57: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:210:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:246:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:250:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:269:7: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:54:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:112:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:24:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:63:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:64:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:65:38: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:66:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:71:45: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:76:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:88:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:96:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:104:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:105:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:117:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:120:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:121:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:64: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:39: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:126:39: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:127:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:129:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:131:67: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:134:38: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:135:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:137:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:146:45: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:151:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:163:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:175:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:185:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:219:64: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:220:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:224:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:243:7: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:72:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:141:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:19:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:33:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:42:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:45:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:53:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:63:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:70:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:82:21: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:84:47: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:93:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:98:14: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:38:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:39:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:42:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:43:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:49:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:96:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:100:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:105:106: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:108:33: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:111:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:113:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:121:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:169:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:170:80: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:83: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:97: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:175:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:177:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:178:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:179:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:183:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:189:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:197:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:203:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:221:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:267:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:269:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:277:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:284:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:287:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:292:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:307:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:309:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:311:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:312:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:313:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:314:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:316:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:317:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:319:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:320:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:323:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:334:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:335:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:336:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:343:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:344:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:345:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:348:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:351:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:352:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:355:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:358:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:362:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:92:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:237:40: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:260:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:274:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:280:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:282:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:283:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:284:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:285:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:286:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:287:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:288:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:289:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:290:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:313:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:135:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:23:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:52:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:53:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:73:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:79:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:40:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:41:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:42:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:95:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:101:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:213:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:230:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:295:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:333:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:370:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:420:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:421:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:422:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:423:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:424:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:425:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:426:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:427:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:428:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:449:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:450:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:452:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:474:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:483:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:488:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:491:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:505:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:508:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:518:46: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:562:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:567:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:568:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:569:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:584:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:588:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:592:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:593:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:595:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:599:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:609:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:134:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:239:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:275:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:317:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:318:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:319:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:320:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:321:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:322:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:323:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:324:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:325:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:326:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:344:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:345:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:378:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:383:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:384:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:385:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:396:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:402:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:403:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:405:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:423:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:435:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:10:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:27:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:28:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:67:6: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:89:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:93:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:94:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:95:65: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:96:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:97:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:102:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:107:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:120:41: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:129:68: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:133:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:136:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:158:26: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:175:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:185:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:194:48: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:18:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:19:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:47:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:95:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:104:48: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:126:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:225:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:282:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:285:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:415:41: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:454:27: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:507:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:545:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:549:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:550:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:552:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:553:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:567:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:573:18: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:160:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:166:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:167:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:170:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:176:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:178:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:179:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:182:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:186:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:259:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:261:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:262:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:74: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:269:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:270:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:271:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:274:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:312:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:321:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:326:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:330:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:335:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:339:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:344:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:349:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:353:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:357:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:361:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:369:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:372:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:375:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:378:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:384:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:388:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:390:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:74: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:399:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:400:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:401:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:403:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:405:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:464:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:466:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:469:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:482:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:484:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:485:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:490:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:492:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:493:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:498:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:500:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:501:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:506:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:508:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:509:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:514:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:516:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:517:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:520:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:521:70: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:522:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:526:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:14: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:565:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:568:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:571:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:572:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:598:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:599:50: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:600:46: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:602:50: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:603:52: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:604:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:606:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:607:51: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:608:47: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:610:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:611:51: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:612:47: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:632:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:666:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:674:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:675:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:676:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:678:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:680:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:683:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:685:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:686:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:771:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:773:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:774:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:777:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:779:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:780:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:792:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:820:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:882:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:885:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:193:76: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:300:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:301:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:302:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:38: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:367:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:370:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:608:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:610:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:611:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:73: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:71: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:71: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:700:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:702:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:705:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:714:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:748:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:750:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:751:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:755:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:756:70: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:757:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:761:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:14: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:846:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1013:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1015:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1016:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1017:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1018:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1019:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1020:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1029:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1031:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1032:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1033:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1035:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1036:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1040:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1042:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1043:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1086:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1141:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1154:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1157:14: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:188:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:189:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:190:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:386:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:387:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:396:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:399:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:401:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:403:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:409:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:411:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:414:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:416:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:422:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:424:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:426:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:429:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:430:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:431:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:432:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:444:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:446:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:447:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:473:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:474:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:496:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:497:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:498:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:499:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:501:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:505:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:506:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:507:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:508:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:510:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:514:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:516:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:519:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:523:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:529:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:533:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:534:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:535:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:536:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:539:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:540:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:600:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:603:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:607:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:610:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:614:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:633:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:649:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:650:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:662:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:663:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:664:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:665:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:666:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:667:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:668:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:669:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:670:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:671:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:797:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:798:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:799:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:801:12: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:85:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:222:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:223:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:228:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:229:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:233:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:234:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:260:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:270:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:332:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:337:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:339:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:343:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:347:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:349:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:351:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:353:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:364:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:406:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:408:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:410:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:411:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:412:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:414:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:418:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:431:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:434:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:435:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:471:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:479:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:481:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:482:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:483:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:484:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:485:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:486:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:497:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:498:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:499:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:500:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:501:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:504:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:505:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:516:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:518:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:556:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:105:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:259:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:264:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:267:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:270:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:271:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:305:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:320:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:363:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:388:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:389:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:392:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:396:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:400:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:402:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:404:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:406:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:408:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:423:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:465:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:467:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:469:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:470:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:471:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:473:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:477:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:490:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:493:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:494:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:515:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:536:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:539:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:542:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:546:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:550:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:563:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:565:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:566:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:567:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:578:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:579:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:580:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:582:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:585:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:586:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:717:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:757:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:181:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:268:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:298:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:366:17: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:183:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:184:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:185:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:240:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:393:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:394:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:408:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:410:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:412:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:414:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:415:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:420:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:422:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:425:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:427:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:433:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:435:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:437:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:439:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:440:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:442:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:443:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:444:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:445:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:457:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:459:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:460:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:481:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:485:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:489:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:512:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:513:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:514:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:515:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:517:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:521:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:522:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:523:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:524:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:526:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:530:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:532:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:535:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:539:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:545:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:549:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:550:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:551:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:552:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:555:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:556:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:618:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:621:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:625:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:628:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:632:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:635:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:636:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:653:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:655:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:674:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:675:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:687:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:688:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:689:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:690:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:691:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:692:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:693:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:694:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:695:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:696:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:770:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:778:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:786:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:806:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:826:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:827:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:828:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:830:12: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:242:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:248:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:249:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:253:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:254:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:297:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:365:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:369:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:371:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:374:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:378:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:380:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:382:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:386:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:395:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:441:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:444:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:445:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:446:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:447:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:449:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:453:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:466:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:469:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:470:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:507:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:513:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:519:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:520:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:521:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:522:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:523:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:524:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:525:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:537:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:538:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:539:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:540:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:541:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:542:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:545:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:546:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:557:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:559:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:597:25: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:690:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:707:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:708:38: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:727:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:104:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:258:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:263:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:266:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:269:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:270:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:309:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:324:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:368:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:393:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:394:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:397:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:401:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:405:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:407:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:409:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:411:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:413:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:417:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:432:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:478:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:480:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:482:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:483:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:484:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:486:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:490:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:503:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:506:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:507:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:529:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:544:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:546:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:548:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:550:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:552:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:556:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:564:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:566:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:567:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:568:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:578:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:580:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:582:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:583:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:584:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:587:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:588:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:666:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:701:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:722:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:762:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:104:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:155:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:229:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:245:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:275:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:335:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:352:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:359:15: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:236:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:237:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:238:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:276:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:299:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:535:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:571:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:575:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:577:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:578:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:579:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:591:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:592:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:602:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:603:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:604:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:605:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:606:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:607:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:608:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:609:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:679:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:684:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:696:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:699:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:704:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:168:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:200:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:201:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:206:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:207:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:239:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:272:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:290:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:296:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:301:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:304:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:306:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:357:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:359:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:361:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:362:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:363:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:365:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:382:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:385:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:386:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:403:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:416:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:420:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:421:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:422:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:423:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:424:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:426:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:436:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:437:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:438:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:439:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:442:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:443:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:514:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:518:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:530:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:533:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:537:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:555:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:557:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:182:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:190:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:231:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:250:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:252:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:269:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:292:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:302:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:304:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:306:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:330:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:332:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:333:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:334:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:336:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:358:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:363:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:380:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:384:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:395:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:397:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:405:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:418:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:420:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:428:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:432:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:438:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:443:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:444:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:445:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:448:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:449:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:450:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:451:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:521:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:525:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:537:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:540:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:544:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:562:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:133:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:137:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:142:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:143:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:165:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:233:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:236:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:242:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:248:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:274:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:341:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:355:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:360:15: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:160:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:198:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:199:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:221:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:222:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:264:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:269:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:273:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:275:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:23: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:284:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:286:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:288:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:290:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:308:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:310:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:311:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:312:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:128: E501 line too long (140 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:316:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:128: E501 line too long (140 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:324:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:327:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:330:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:336:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:344:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:360:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:361:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:393:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:394:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:395:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:396:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:397:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:398:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:399:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:402:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:412:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:413:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:424:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:425:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:426:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:427:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:428:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:429:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:430:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:431:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:484:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:489:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:490:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:495:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:498:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:502:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:503:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:108:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:111:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:135:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:136:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:141:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:142:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:171:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:205:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:223:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:229:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:234:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:236:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:238:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:240:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:241:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:242:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:247:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:264:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:281:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:284:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:285:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:286:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:287:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:293:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:306:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:309:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:310:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:327:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:343:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:344:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:345:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:346:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:347:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:348:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:349:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:361:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:362:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:363:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:364:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:365:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:368:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:369:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:423:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:428:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:434:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:439:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:442:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:446:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:465:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:124:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:132:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:165:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:174:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:176:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:196:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:197:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:214:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:231:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:237:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:246:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:248:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:250:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:251:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:272:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:274:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:278:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:296:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:297:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:298:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:300:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:314:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:318:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:319:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:331:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:340:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:352:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:354:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:357:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:358:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:359:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:362:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:363:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:364:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:376:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:377:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:378:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:379:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:382:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:383:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:384:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:385:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:437:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:438:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:442:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:446:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:449:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:454:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:457:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:461:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:480:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:115:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:116:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:121:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:126:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:127:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:144:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:210:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:211:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:214:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:220:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:226:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:248:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:308:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:322:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:323:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:327:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:328:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:99:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:110:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:111:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:112:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:76:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:91:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:102:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:86:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:115:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:171:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:181:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/nn.py:62:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:15:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:33:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:66:68: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:72:31: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:82:72: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:116:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:126:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:136:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:142:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:147:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:155:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:157:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:161:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:165:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:169:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:172:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:174:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:184:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:187:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:191:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:212:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:221:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:229:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:250:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:259:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:285:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:286:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:287:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:311:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:332:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:344:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:347:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:348:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:371:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:394:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:401:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:426:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:430:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:433:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:435:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:437:21: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:460:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:462:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:463:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:464:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:466:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:470:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:473:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:40:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:21:25: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:24:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:32:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:35:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:40:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:46:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:52:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/model.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/model.py:44:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/model.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/model.py:104:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:105:24: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:105:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:134:36: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:135:24: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:135:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:195:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/model.py:196:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/model.py:239:28: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:240:28: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:246:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:82: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:51:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:57:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:67:11: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:68: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:89: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:73:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:95:5: F841 local variable 'nu' is assigned to but never used -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:97:11: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/registry.py:57:29: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/registry.py:58:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/registry.py:61:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:62:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:63:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:64:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:66:14: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:67:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:68:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:70:14: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:71:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:72:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:74:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:75:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:76:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:77:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:78:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:79:24: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:81:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:86:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:90:12: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:91:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:92:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:93:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:94:19: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:95:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:96:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:97:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:98:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:99:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:100:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:101:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:102:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:103:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:104:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:105:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:106:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:108:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:109:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:110:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:111:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:113:26: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:114:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:115:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:117:19: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:118:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:119:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:121:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:122:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:123:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:125:24: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:126:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:127:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:128:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:129:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:130:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:131:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:133:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:134:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: C901 'load_posteriors' is too complex (12) -./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/inference/posteriors.py:117:17: F841 local variable 'e' is assigned to but never used -./build/lib/tfscreen/tfmodel/inference/run_inference.py:21:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:29:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:30:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:31:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:32:1: E302 expected 2 blank lines, found 0 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:35:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:36:69: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:22: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:28: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:57:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:63:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:65:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:79:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:87:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:93:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:98:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:105:34: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:107:87: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:123:58: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:124:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:129:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:132:5: C901 'RunInference.run_optimization' is too complex (18) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:223:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:224:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:238:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:241:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:242:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:251:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:253:53: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:261:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:288:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:299:48: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:304:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:308:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:318:128: E501 line too long (177 > 127 characters) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:324:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:325:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:332:60: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:346:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:347:50: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/inference/run_inference.py:718:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:720:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:753:31: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:765:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:766:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:31: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:787:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:788:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:789:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:790:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:791:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:798:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:799:31: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:881:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:895:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:898:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:899:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:908:36: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:915:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:915:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:917:61: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:966:5: E303 too many blank lines (4) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:26: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1010:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1022:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1024:32: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1024:42: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1075:5: C901 'RunInference.get_map_posteriors' is too complex (13) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1313:50: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1354:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1357:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1370:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1374:30: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1377:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1381:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1387:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:37:1: E303 too many blank lines (3) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:71:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:74:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:25: E222 multiple spaces after operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:78:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:79:42: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:83:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:83:88: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:30: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:103:63: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:104:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:118:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:123:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:125:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/model_orchestrator.py:208:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:211:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:211:73: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:214:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:215:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:216:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:217:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:219:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:220:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:221:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:222:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:225:63: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:226:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:227:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:237:63: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:42: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:242:68: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:243:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:72: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:286:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:295:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:295:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:296:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:299:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:305:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:334:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/model_orchestrator.py:366:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:367:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:368:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:370:23: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:371:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:372:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:376:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:455:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:520:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:523:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:528:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:529:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:536:30: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:540:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:556:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:557:1: E303 too many blank lines (3) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:577:82: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:582:87: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:585:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:590:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:672:5: C901 'ModelOrchestrator._initialize_data' is too complex (17) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:672:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:697:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:698:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:700:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:48: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:701:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:702:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:702:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:703:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:707:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:708:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:713:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:720:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:722:10: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:722:10: E116 unexpected indentation (comment) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:724:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:727:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:729:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:731:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:743:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:751:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:773:38: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:774:41: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:774:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:775:44: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:775:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:776:40: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:776:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:777:46: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:777:71: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:779:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:786:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:791:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:798:40: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:844:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:845:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:846:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:847:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:887:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:890:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:891:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:892:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:896:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:897:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:898:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:899:38: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:901:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:912:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:912:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:915:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:916:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:921:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:922:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:923:58: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:925:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:938:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:941:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:947:86: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:949:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:956:77: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1012:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1013:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1014:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1015:39: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1022:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1024:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1100:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1101:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1103:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1176:5: C901 'ModelOrchestrator._initialize_classes' is too complex (17) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1196:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1198:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1199:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1201:68: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1202:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1203:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1204:40: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1221:42: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1222:43: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:40: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:53: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1223:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1292:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1295:69: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1299:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1301:69: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1311:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1313:9: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1366:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1371:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1385:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1395:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1405:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1419:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1422:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1451:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1463:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1475:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1481:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1482:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1483:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1484:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1485:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1486:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1487:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1488:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1489:29: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1490:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1491:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1492:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1493:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1494:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1495:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:192:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:193:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:194:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:195:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:196:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:197:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:198:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:199:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:200:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:201:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:202:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:203:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:204:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:205:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:223:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:225:59: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:226:58: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:227:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:228:55: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:229:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:230:59: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:231:63: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:232:55: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:234:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:124:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:126:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:130:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:245:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:247:51: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:251:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:514:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:516:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:517:53: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:518:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:519:66: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:520:66: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:521:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:522:65: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:523:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:524:72: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:525:74: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:527:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used -./build/lib/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:106:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:107:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:198:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:199:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:204:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:268:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:269:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:270:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:273:1: C901 '_inject_calibration_priors' is too complex (21) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:464:1: C901 '_build_csv_updates' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:522:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:523:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:662:1: C901 '_apply_guesses_updates' is too complex (12) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:814:1: E303 too many blank lines (3) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:818:1: E302 expected 2 blank lines, found 3 -./build/lib/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) -./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) -./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:521:1: C901 'summarize_fit' is too complex (59) -./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) -./build/lib/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/batch.py:44:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:46:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:47:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:48:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:49:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:50:69: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:51:69: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:52:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:53:67: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:86:63: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:95:28: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:101:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:22: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:27: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:80:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:107:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:111:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:113:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:118:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:119:50: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:148:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:161:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:179:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:183:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:184:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:200:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:204:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:236:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:238:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:244:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:282:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:295:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:302:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:308:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:314:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:315:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:320:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:321:55: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:322:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:331:34: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:334:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:339:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:357:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:361:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:365:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:366:55: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:367:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:377:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:379:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:395:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:398:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:405:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:409:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:410:82: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:422:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:429:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:435:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:451:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:452:43: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:458:66: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:460:51: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:466:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:467:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:469:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:476:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:477:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:487:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:493:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:502:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:512:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:517:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:528:1: W391 blank line at end of file -./build/lib/tfscreen/util/__init__.py:71:2: W292 no newline at end of file -./build/lib/tfscreen/util/cli/__init__.py:16:1: W391 blank line at end of file -./build/lib/tfscreen/util/cli/generalized_main.py:1:11: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:5:1: C901 'generalized_main' is too complex (15) -./build/lib/tfscreen/util/cli/generalized_main.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/cli/generalized_main.py:13:78: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:14:46: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:24:69: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:27:51: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:30:51: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:57:77: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:58:36: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:69:30: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:75:74: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:85:58: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:87:34: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:87:48: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:92:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:94:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:97:39: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:104:45: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:104:59: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:104:75: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:105:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/__init__.py:28:2: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/add_group_columns.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/add_group_columns.py:8:79: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:9:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:10:82: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:12:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:13:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:25:75: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:42:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:43:12: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:47:36: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:52:29: E211 whitespace before '(' -./build/lib/tfscreen/util/dataframe/add_group_columns.py:65:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:70:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:73:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:80:51: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:81:51: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:90:21: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/check_columns.py:4:1: E303 too many blank lines (3) -./build/lib/tfscreen/util/dataframe/check_columns.py:4:21: E231 missing whitespace after ',' -./build/lib/tfscreen/util/dataframe/check_columns.py:35:30: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:3:1: F811 redefinition of unused 'np' from line 1 -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:74:44: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:63:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:65:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:68:5: E303 too many blank lines (2) -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:89:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:90:76: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:91:22: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:105:36: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:111:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:112:24: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:62:1: W391 blank line at end of file -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:80:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:95:37: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:9:14: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: C901 'get_scaled_cfu' is too complex (17) -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:62:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:76:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:130:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:131:14: W292 no newline at end of file -./build/lib/tfscreen/util/io/read_dataframe.py:7:1: C901 'read_dataframe' is too complex (16) -./build/lib/tfscreen/util/io/read_dataframe.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/io/read_dataframe.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/io/read_dataframe.py:84:27: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/util/io/read_dataframe.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/io/read_dataframe.py:102:14: W292 no newline at end of file -./build/lib/tfscreen/util/io/read_yaml.py:31:1: C901 'read_yaml' is too complex (12) -./build/lib/tfscreen/util/numerical/array_search.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/array_search.py:48:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/array_search.py:80:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:82:31: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/numerical/array_search.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:97:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:98:37: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/broadcast_args.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/broadcast_args.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/broadcast_args.py:90:1: W391 blank line at end of file -./build/lib/tfscreen/util/numerical/padding.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/padding.py:29:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:34:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:41:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:43:48: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/padding.py:44:36: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/padding.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:50:30: E203 whitespace before ':' -./build/lib/tfscreen/util/numerical/padding.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:53:21: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/transform.py:10:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/transform.py:189:36: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/xfill.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/xfill.py:14:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:32:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:58:14: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/util/numerical/xfill.py:58:14: E117 over-indented -./build/lib/tfscreen/util/numerical/xfill.py:58:29: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/numerical/xfill.py:79:20: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:50:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:57:22: E231 missing whitespace after ',' -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:70:71: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:71:34: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:74:23: W292 no newline at end of file -./build/lib/tfscreen/util/validation/check.py:37:1: C901 'check_number' is too complex (12) -./build/lib/tfscreen/util/validation/check.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/validation/check.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/validation/check.py:118:18: W292 no newline at end of file ./scripts/generate_struct_ensemble.py:266:11: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:272:24: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:433:18: E221 multiple spaces before operator @@ -5675,28 +1806,36 @@ ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:426:37: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:427:39: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:428:35: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:449:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:450:14: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:452:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:474:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:483:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:488:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:491:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:505:15: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:508:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:518:46: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:562:45: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:567:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:568:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:569:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:584:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:588:24: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:592:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:593:21: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:595:21: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:599:9: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:609:41: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:433:1: C901 '_empirical_group_estimates' is too complex (15) +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:462:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:463:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:465:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:490:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:493:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:510:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:519:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:529:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:532:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:535:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:549:15: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:550:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:553:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:554:14: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:566:46: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:580:16: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:624:45: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:629:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:630:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:631:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:650:24: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:654:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:655:21: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:657:21: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:661:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:671:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:678:15: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:716:39: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:134:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:239:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:275:32: E221 multiple spaces before operator @@ -5710,19 +1849,21 @@ ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:324:35: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:325:31: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:326:37: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:344:39: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:345:43: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:378:45: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:383:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:384:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:385:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:396:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:24: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:402:17: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:403:21: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:405:21: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:423:9: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:435:41: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:331:15: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:348:39: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:349:43: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:356:16: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:393:45: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:398:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:399:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:411:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:415:24: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:417:17: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:418:21: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:420:21: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:438:9: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:450:41: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/noise/beta.py:10:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/noise/beta.py:27:28: W291 trailing whitespace ./src/tfscreen/tfmodel/generative/components/noise/beta.py:28:39: W291 trailing whitespace @@ -7392,7 +3533,7 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:1193:25: E221 multiple spaces before operator ./src/tfscreen/tfmodel/model_orchestrator.py:1194:31: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/model_orchestrator.py:1196:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1269:5: C901 'ModelOrchestrator._initialize_classes' is too complex (18) +./src/tfscreen/tfmodel/model_orchestrator.py:1269:5: C901 'ModelOrchestrator._initialize_classes' is too complex (20) ./src/tfscreen/tfmodel/model_orchestrator.py:1289:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:1291:67: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:1292:71: W291 trailing whitespace @@ -7407,36 +3548,36 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:1316:53: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/model_orchestrator.py:1316:56: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:1316:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1388:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1391:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1412:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1414:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1467:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1472:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1486:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1496:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1506:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1520:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1523:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1552:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1564:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1576:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1582:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1583:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1584:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1585:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1586:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1587:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1588:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1589:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1590:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1591:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1592:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1593:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1594:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1595:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1596:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1597:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1397:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1400:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1421:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1423:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1476:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1481:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1495:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1505:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1515:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1529:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1532:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1561:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1573:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1585:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1591:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1592:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1593:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1594:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1595:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1596:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1597:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1598:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1599:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1600:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1601:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1602:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1603:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1604:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1605:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1606: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 @@ -7491,21 +3632,21 @@ ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:112:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:113:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:204:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:205:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:210:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:287:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:288:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:289:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:1: C901 '_inject_calibration_priors' is too complex (21) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:483:1: C901 '_build_csv_updates' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:541:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:542:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:681:1: C901 '_apply_guesses_updates' is too complex (12) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:833:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:837:1: E302 expected 2 blank lines, found 3 +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:115:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:116:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:207:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:208:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:213:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:290:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:291:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:295:1: C901 '_inject_calibration_priors' is too complex (21) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:554:1: C901 '_build_csv_updates' is too complex (11) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:612:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:613:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:752:1: C901 '_apply_guesses_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:904:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:908:1: E302 expected 2 blank lines, found 3 ./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used @@ -9521,120 +5662,120 @@ ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:5:1: F401 'numpyro' imported but unused ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:6:1: F401 'numpyro.distributions as dist' imported but unused ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:38:35: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:74:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:76:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:77:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:80:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:107:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:109:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:110:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:113:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:139:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:141:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:142:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:145:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:181:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:183:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:184:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:187:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:221:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:223:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:224:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:227:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:232:77: E202 whitespace before ']' -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:455:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:471:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:508:31: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:509:35: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:555:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:556:12: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:574:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:576:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:577:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:618:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:621:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:669:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:671:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:672:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:675:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:715:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:718:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:723:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:748:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:750:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:752:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:760:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:773:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:775:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:777:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:786:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:798:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:799:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:802:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:816:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:817:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:835:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:837:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:838:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:899:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:901:17: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:902:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:958:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:962:20: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:105:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:107:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:108:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:111:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:138:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:140:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:141:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:144:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:170:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:172:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:173:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:176:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:212:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:214:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:215:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:218:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:252:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:254:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:255:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:258:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:263:77: E202 whitespace before ']' +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:628:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:644:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:729:31: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:730:35: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:776:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:777:12: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:795:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:797:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:798:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:839:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:842:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:890:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:892:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:893:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:896:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:936:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:939:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:944:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:969:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:971:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:973:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:981:14: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:994:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1015:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1136:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1254:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:996:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:998:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1007:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1019:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1020:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1023:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1037:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1038:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1056:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1058:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1059:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1120:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1122:17: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1123:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1179:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1183:20: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1215:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1236:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1357:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py:1475:9: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:5:1: F401 'numpyro' imported but unused ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:6:1: F401 'numpyro.distributions as dist' imported but unused -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:115:77: E202 whitespace before ']' -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:144:32: E131 continuation line unaligned for hanging indent -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:146:32: E131 continuation line unaligned for hanging indent -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:149:38: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:201:12: F541 f-string is missing placeholders -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:208:12: F541 f-string is missing placeholders -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:254:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:256:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:258:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:267:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:269:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:288:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:290:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:293:7: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:294:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:306:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:310:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:311:11: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:312:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:323:7: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:324:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:338:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:343:15: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:363:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:139:77: E202 whitespace before ']' +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:168:32: E131 continuation line unaligned for hanging indent +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:170:32: E131 continuation line unaligned for hanging indent +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:173:38: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:258:12: F541 f-string is missing placeholders +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:265:12: F541 f-string is missing placeholders +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:331:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:333:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:335:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:344:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:346:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:365:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:367:9: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:370:7: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:385:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:393:7: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:404:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:412:7: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:425:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:426:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:442:7: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:371:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:383:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:387:14: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:388:11: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:389:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:400:7: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:401:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:415:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:420:15: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:440:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:447:7: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:462:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:474:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:476:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:488:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:490:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:470:7: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:481:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:489:7: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:502:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:514:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:516:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:526:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:528:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:538:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:556:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:582:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:616:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:634:9: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:653:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:503:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:519:7: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:539:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:551:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:553:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:565:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:567:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:579:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:591:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:593:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:603:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:605:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:615:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:633:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:659:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:693:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:711:9: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py:730:9: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/noise/test_beta.py:20:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/noise/test_beta.py:24:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/noise/test_beta.py:30:1: W293 blank line contains whitespace @@ -10955,34 +7096,33 @@ ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:11:1: F401 'dataclasses' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:13:1: F401 'shutil' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:14:1: F401 'sys' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:21:1: F401 'jax' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:26:1: F401 'tfscreen.tfmodel.scripts.prefit_calibration_cli._identify_field_mapping' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:805:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:806:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:807:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:808:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:809:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:810:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:811:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:812:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:813:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1189:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1195:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1201:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1208:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1216:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1222:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1230:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1236:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1242:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1249:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1256:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1270:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1284:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1296:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1381:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1400:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1415:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:22:1: F401 'jax' imported but unused +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:936:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:937:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:938:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:939:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:940:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:941:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:942:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:943:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:944:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1462:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1468:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1474:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1481:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1489:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1495:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1503:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1509:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1515:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1522:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1529:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1543:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1557:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1569:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1654:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1673:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1688:14: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_sample_posterior_cli.py:5:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/tfmodel/scripts/test_sample_prior_cli.py:3:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/scripts/test_subset_genotypes_cli.py:84:31: E741 ambiguous variable name 'l' @@ -11148,53 +7288,56 @@ ./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:582:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:730:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:731:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:734:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:742:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:748:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:749:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:751:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:753:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:765:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:770:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:778:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:786:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:797:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:800:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:807:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:814:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:827:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:832:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:838:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:847:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:851:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:861:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:862:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:864:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:865:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:877:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:883:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:892:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:893:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:896:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:899:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1162:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1559:34: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1803:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1810:10: W292 no newline at end of file +./tests/tfscreen/tfmodel/test_model_orchestrator.py:477:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:502:18: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/test_model_orchestrator.py:503:18: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/test_model_orchestrator.py:673:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:821:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:825:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:833:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:840:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:842:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:844:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:856:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:861:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:869:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:877:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:888:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:891:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:898:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:905:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:913:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:918:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:923:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:929:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:938:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:942:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:952:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:953:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:955:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:956:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:968:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:983:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:984:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:987:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:990:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1253:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1650:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1894:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1901: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 @@ -11497,52 +7640,52 @@ ./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 -92 C901 'cat_fit' is too complex (19) -20 E111 indentation is not a multiple of 4 -9 E114 indentation is not a multiple of 4 (comment) -8 E116 unexpected indentation (comment) -16 E117 over-indented -2 E122 continuation line missing indentation or outdented -3 E124 closing bracket does not match visual indentation -12 E125 continuation line with same indent as next logical line -246 E127 continuation line over-indented for visual indent -141 E128 continuation line under-indented for visual indent +47 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) +11 E117 over-indented +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 +195 E127 continuation line over-indented for visual indent +86 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent -72 E201 whitespace after '[' -48 E202 whitespace before ']' -10 E203 whitespace before ',' -8 E211 whitespace before '(' -3024 E221 multiple spaces before operator -27 E222 multiple spaces after operator -16 E225 missing whitespace around operator -1992 E231 missing whitespace after ',' -127 E251 unexpected spaces around keyword / parameter equals -28 E252 missing whitespace around parameter equals -236 E261 at least two spaces before inline comment -2 E262 inline comment should start with '# ' +43 E201 whitespace after '[' +28 E202 whitespace before ']' +6 E203 whitespace before ',' +4 E211 whitespace before '(' +1841 E221 multiple spaces before operator +26 E222 multiple spaces after operator +8 E225 missing whitespace around operator +1104 E231 missing whitespace after ',' +103 E251 unexpected spaces around keyword / parameter equals +14 E252 missing whitespace around parameter equals +216 E261 at least two spaces before inline comment +1 E262 inline comment should start with '# ' 2 E265 block comment should start with '# ' -3 E266 too many leading '#' for block comment +2 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword -2 E301 expected 1 blank line, found 0 -953 E302 expected 2 blank lines, found 1 -91 E303 too many blank lines (2) -24 E305 expected 2 blank lines after class or function definition, found 1 +1 E301 expected 1 blank line, found 0 +783 E302 expected 2 blank lines, found 1 +50 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 -2 E401 multiple imports on one line -54 E402 module level import not at top of file -137 E501 line too long (145 > 127 characters) -60 E701 multiple statements on one line (colon) -7 E712 comparison to True should be 'if cond is True:' or 'if cond:' -4 E713 test for membership should be 'not in' +1 E401 multiple imports on one line +37 E402 module level import not at top of file +86 E501 line too long (145 > 127 characters) +46 E701 multiple statements on one line (colon) +5 E712 comparison to True should be 'if cond is True:' or 'if cond:' +2 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def -27 E741 ambiguous variable name 'l' -280 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused -18 F541 f-string is missing placeholders -5 F811 redefinition of unused 'np' from line 1 -56 F841 local variable 'e' is assigned to but never used -1079 W291 trailing whitespace -134 W292 no newline at end of file -2188 W293 blank line contains whitespace -51 W391 blank line at end of file -11499 +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 +11 F541 f-string is missing placeholders +4 F811 redefinition of unused 'np' from line 1 +42 F841 local variable 'e' is assigned to but never used +629 W291 trailing whitespace +86 W292 no newline at end of file +1606 W293 blank line contains whitespace +30 W391 blank line at end of file +7642 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 8b61fae2..5eea9554 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/tfmodel/generative/components/ln_cfu0/hierarchical.py b/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py index 2d834634..eeb6e663 100644 --- a/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py +++ b/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py @@ -430,19 +430,32 @@ def get_hyperparameters(num_classes: int = 1) -> Dict[str, Any]: return parameters -def _empirical_group_estimates(data: GrowthData): +def _empirical_group_estimates(data: GrowthData, presplit: Optional[Any] = None): """ Compute per-group and per-class empirical (loc, scale) estimates and the - per-(rep, cond_pre, geno) median tensor. + per-(rep, cond_pre, geno) tensor used to derive them. + + When ``presplit`` is supplied (a ``PreSplitData``-like object exposing + ``ln_cfu_t0``, ``ln_cfu_t0_std``, and ``good_mask`` tensors shaped + ``(num_replicate, num_condition_pre, num_genotype)``), it holds a direct + t=-t_pre measurement of ln_cfu0 that is *not* confounded by subsequent + growth, unlike the across-timepoint ``ln_cfu`` median. Its value is + preferred, cell by cell, over the ln_cfu-derived median for any + (replicate, condition_pre, genotype) with a valid reading; cells without + presplit coverage fall back to the ln_cfu median exactly as before. Each + class records which source actually backed its estimate via the + ``*_source`` keys (``"presplit"`` or ``"median"``) so callers — notably + the pre-fit calibration script — can decide whether a further, + growth-model-based refinement is worth attempting for that class. Returns ``None`` if ``data.ln_cfu`` is not the expected 7-D tensor (e.g. in mocked tests or when called with a stub data object). Otherwise returns a dict with keys: - - ``per_rep_cond_geno`` : (rep, cond_pre, geno) ndarray of medians - - ``hyper_locs``, ``hyper_scales`` : lists of floats, one per class + - ``per_rep_cond_geno`` : (rep, cond_pre, geno) ndarray of estimates + - ``hyper_locs``, ``hyper_scales``, ``hyper_sources`` : lists, one per class - ``hyper_loc``, ``hyper_scale`` : class-0 aliases (backward compat) - - ``spiked_loc``, ``spiked_scale`` - - ``wt_loc``, ``wt_scale`` + - ``spiked_loc``, ``spiked_scale``, ``spiked_source`` + - ``wt_loc``, ``wt_scale``, ``wt_source`` - ``library_mask``, ``spiked_mask``, ``wt_mask`` : (geno,) bool ndarrays """ @@ -464,7 +477,30 @@ def _empirical_group_estimates(data: GrowthData): # np.errstate does not cover this — nanmedian emits via warnings.warn. with warnings.catch_warnings(): warnings.filterwarnings("ignore", "All-NaN slice encountered", RuntimeWarning) - per_rep_cond_geno = np.nanmedian(ln_cfu_valid, axis=(1, 3, 4, 5)) + median_per_rep_cond_geno = np.nanmedian(ln_cfu_valid, axis=(1, 3, 4, 5)) + + # Direct pre-split measurement, preferred cell-by-cell over the median + # wherever a valid reading exists. Only used when its shape actually + # aligns with the ln_cfu-derived tensor (same categorical orderings are + # guaranteed by construction, but stub/mocked data in tests may not + # satisfy this). + presplit_valid = None + if presplit is not None: + ps_ln_cfu = getattr(presplit, "ln_cfu_t0", None) + ps_mask = getattr(presplit, "good_mask", None) + if ps_ln_cfu is not None and ps_mask is not None: + ps_ln_cfu = np.asarray(ps_ln_cfu) + ps_mask = np.asarray(ps_mask) + if ps_ln_cfu.shape == median_per_rep_cond_geno.shape: + presplit_valid = np.where(ps_mask, ps_ln_cfu, np.nan) + + if presplit_valid is not None: + has_presplit = ~np.isnan(presplit_valid) + per_rep_cond_geno = np.where(has_presplit, presplit_valid, + median_per_rep_cond_geno) + else: + has_presplit = np.zeros_like(median_per_rep_cond_geno, dtype=bool) + per_rep_cond_geno = median_per_rep_cond_geno library_mask = ~spiked_mask & ~wt_mask @@ -484,12 +520,20 @@ def _group_scale(mask, group_loc, fallback_scale): deviations = (vals - group_loc).flatten() return _mad_scale(deviations, fallback_scale) + def _group_source(mask): + if not mask.any(): + return "median" + return "presplit" if has_presplit[:, :, mask].any() else "median" + spiked_loc = _group_loc(spiked_mask, _FALLBACK_SPIKED_LOC) wt_loc = _group_loc(wt_mask, _FALLBACK_WT_LOC) spiked_scale = _group_scale(spiked_mask, spiked_loc, _FALLBACK_GROUP_SCALE) wt_scale = _group_scale(wt_mask, wt_loc, _FALLBACK_GROUP_SCALE) + spiked_source = _group_source(spiked_mask) + wt_source = _group_source(wt_mask) + # Per-class library estimates num_classes = getattr(data, "num_ln_cfu0_library_classes", 1) library_masks_raw = getattr(data, "ln_cfu0_library_masks", None) @@ -502,50 +546,68 @@ def _group_scale(mask, group_loc, fallback_scale): else: all_class_masks = [library_mask] - hyper_locs = [] - hyper_scales = [] + hyper_locs = [] + hyper_scales = [] + hyper_sources = [] for class_mask in all_class_masks: - loc = _group_loc(class_mask, _FALLBACK_HYPER_LOC) - scale = _group_scale(class_mask, loc, _FALLBACK_GROUP_SCALE) + loc = _group_loc(class_mask, _FALLBACK_HYPER_LOC) + scale = _group_scale(class_mask, loc, _FALLBACK_GROUP_SCALE) + source = _group_source(class_mask) hyper_locs.append(loc) hyper_scales.append(scale) + hyper_sources.append(source) return { "per_rep_cond_geno": per_rep_cond_geno, "hyper_locs": hyper_locs, "hyper_scales": hyper_scales, + "hyper_sources": hyper_sources, "hyper_loc": hyper_locs[0], # class-0 alias "hyper_scale": hyper_scales[0], # class-0 alias "spiked_loc": spiked_loc, "spiked_scale": spiked_scale, + "spiked_source": spiked_source, "wt_loc": wt_loc, "wt_scale": wt_scale, + "wt_source": wt_source, "library_mask": library_mask, "spiked_mask": spiked_mask, "wt_mask": wt_mask, } -def get_guesses(name: str, data: GrowthData) -> Dict[str, jnp.ndarray]: +def get_guesses(name: str, data: GrowthData, + presplit: Optional[Any] = None) -> Dict[str, jnp.ndarray]: """ Get initial guess values derived empirically from observed ln_cfu data. For each (replicate, condition_pre, genotype), the median ln_cfu across all valid observations (masked by ``data.good_mask``) is used as an - estimate of the starting cell density. Group-level medians over spiked, - wildtype, and each library class provide estimates for ``spiked_loc``, - ``wt_loc``, and ``hyper_loc_{i}`` respectively. Per-genotype offsets are - derived by centring on the matching group-level estimate and dividing by - the group-level MAD-based scale. + estimate of the starting cell density, unless a direct pre-split + measurement is available for that cell (see ``presplit`` and + :func:`_empirical_group_estimates`), in which case the pre-split value is + used instead. Group-level medians over spiked, wildtype, and each + library class provide estimates for ``spiked_loc``, ``wt_loc``, and + ``hyper_loc_{i}`` respectively. Per-genotype offsets are derived by + centring on the matching group-level estimate and dividing by the + group-level MAD-based scale. Sample-site keys for library hyper-parameters follow the naming ``{name}_hyper_loc_{i}`` and ``{name}_hyper_scale_{i}``. Falls back to hard-coded defaults for any group that has no valid observations. + + Parameters + ---------- + name : str + data : GrowthData + presplit : PreSplitData, optional + Optional direct t=-t_pre measurement of ln_cfu0; see + :func:`_empirical_group_estimates`. """ - estimates = _empirical_group_estimates(data) + estimates = _empirical_group_estimates(data, presplit=presplit) num_classes = getattr(data, "num_ln_cfu0_library_classes", 1) @@ -612,7 +674,8 @@ def get_guesses(name: str, data: GrowthData) -> Dict[str, jnp.ndarray]: return guesses -def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: +def get_priors(data: Optional[GrowthData] = None, + presplit: Optional[Any] = None) -> ModelPriors: """ Utility function to create a populated ModelPriors object. @@ -624,6 +687,10 @@ def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: (``ln_cfu0_hyper_loc_locs``) are centred on empirical class medians. - The number of classes is read from ``data.num_ln_cfu0_library_classes`` (defaults to 1 when the attribute is absent). + - If ``presplit`` is also provided, its direct t=-t_pre measurements are + preferred over the ln_cfu median wherever available (see + :func:`_empirical_group_estimates`), giving a growth-unconfounded + estimate of the scales/locations above. Without data, every value is a single-class default. @@ -631,6 +698,9 @@ def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: ---------- data : GrowthData, optional Experimental data pytree. + presplit : PreSplitData, optional + Optional direct t=-t_pre measurement of ln_cfu0; see + :func:`_empirical_group_estimates`. Returns ------- @@ -641,7 +711,7 @@ def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: params = get_hyperparameters(num_classes=num_classes) if data is not None: - estimates = _empirical_group_estimates(data) + estimates = _empirical_group_estimates(data, presplit=presplit) if estimates is not None: params["ln_cfu0_wt_scale"] = float(estimates["wt_scale"]) params["ln_cfu0_spiked_scale"] = float(estimates["spiked_scale"]) diff --git a/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py b/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py index 8f9fc770..932a378b 100644 --- a/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py +++ b/src/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py @@ -327,19 +327,23 @@ def get_hyperparameters(num_classes: int = 1) -> Dict[str, Any]: return params -def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: +def get_priors(data: Optional[GrowthData] = None, + presplit: Optional[Any] = None) -> ModelPriors: """ Build a ModelPriors instance, optionally informed by empirical data. The per-class hyper-loc priors and wt/spiked scales are derived from data when available, using the same MAD-based estimator as the - ``hierarchical`` component. + ``hierarchical`` component. If ``presplit`` is also provided, its + direct t=-t_pre measurements are preferred over the ln_cfu median + wherever available (see + :func:`~tfscreen.tfmodel.generative.components.ln_cfu0.hierarchical._empirical_group_estimates`). """ num_classes = getattr(data, "num_ln_cfu0_library_classes", 1) if data is not None else 1 params = get_hyperparameters(num_classes=num_classes) if data is not None: - estimates = _empirical_group_estimates(data) + estimates = _empirical_group_estimates(data, presplit=presplit) if estimates is not None: params["ln_cfu0_wt_scale"] = float(estimates["wt_scale"]) params["ln_cfu0_spiked_scale"] = float(estimates["spiked_scale"]) @@ -348,20 +352,31 @@ def get_priors(data: Optional[GrowthData] = None) -> ModelPriors: return ModelPriors(**params) -def get_guesses(name: str, data: GrowthData) -> Dict[str, jnp.ndarray]: +def get_guesses(name: str, data: GrowthData, + presplit: Optional[Any] = None) -> Dict[str, jnp.ndarray]: """ Empirically derived initial values for all model sample sites. The genotype baseline is estimated as the per-(replicate, genotype) - median across condition_pre. The tube offset is the per-(replicate, - condition_pre) median residual after subtracting that baseline. The - tube scale is estimated from the MAD of the tube offsets. + median across condition_pre, unless a direct pre-split measurement is + available (see ``presplit``), in which case it is preferred wherever + valid. The tube offset is the per-(replicate, condition_pre) median + residual after subtracting that baseline. The tube scale is estimated + from the MAD of the tube offsets. Falls back to hard-coded defaults for any group or dimension with no valid observations. + + Parameters + ---------- + name : str + data : GrowthData + presplit : PreSplitData, optional + Optional direct t=-t_pre measurement of ln_cfu0; see + :func:`~tfscreen.tfmodel.generative.components.ln_cfu0.hierarchical._empirical_group_estimates`. """ - estimates = _empirical_group_estimates(data) + estimates = _empirical_group_estimates(data, presplit=presplit) num_classes = getattr(data, "num_ln_cfu0_library_classes", 1) if estimates is None: diff --git a/src/tfscreen/tfmodel/inference/run_inference.py b/src/tfscreen/tfmodel/inference/run_inference.py index b8e36293..fc35309b 100644 --- a/src/tfscreen/tfmodel/inference/run_inference.py +++ b/src/tfscreen/tfmodel/inference/run_inference.py @@ -455,8 +455,8 @@ def _genotype_chunk_indices(total_num_genotypes, forward_batch_size): covering ``total_num_genotypes``, padding the final chunk (if ``total_num_genotypes`` is not evenly divisible) by repeating the last valid genotype index. Padding is trimmed back off after the - forward pass by :meth:`_merge_scan_chunks`, so the duplicated rows - never reach the caller. + forward pass by :meth:`_concat_genotype_chunks`, so the duplicated + rows never reach the caller. Returns ------- @@ -472,62 +472,44 @@ def _genotype_chunk_indices(total_num_genotypes, forward_batch_size): return idx.reshape(num_chunks, forward_batch_size) @staticmethod - def _merge_scan_chunks(stacked, axis, total_size): + def _concat_genotype_chunks(chunk_list, axis, total_size): """ - Collapse the leading chunk axis produced by `lax.scan` back into the - genotype axis it was sliced from, restoring genotype order and - trimming any padding added by :meth:`_genotype_chunk_indices`. - - ``stacked`` has shape ``(num_chunks, *per_chunk_shape)`` where - ``per_chunk_shape`` has the genotype axis at position ``axis`` - (possibly negative, as returned by ``_get_genotype_dim_map``). The - chunk axis is moved to sit immediately before the genotype axis (so - that flattening reproduces chunk-major, i.e. genotype-index, order - matching how `_genotype_chunk_indices` laid out the index blocks), - then merged via reshape and trimmed to ``total_size``. + Concatenate per-chunk numpy arrays along ``axis`` and trim padding. Parameters ---------- - stacked : jnp.ndarray - Per-chunk results stacked along a new leading axis by `lax.scan`. + chunk_list : list of np.ndarray + Per-chunk arrays in index order (each has ``forward_batch_size`` + elements along ``axis``; the last chunk may be padded). axis : int - Genotype-axis position within a single chunk's shape (i.e. as - given by ``dim_map``, *not* accounting for the leading chunk - axis). + Genotype axis (from ``dim_map``; may be negative). total_size : int - True (unpadded) number of genotypes to trim down to. + True (unpadded) genotype count to trim to. Returns ------- - jnp.ndarray - Array with the chunk axis removed and the genotype axis - restored to length ``total_size`` at its original position. + np.ndarray """ - per_chunk_ndim = stacked.ndim - 1 - pos_axis = axis if axis >= 0 else per_chunk_ndim + axis - - moved = jnp.moveaxis(stacked, 0, pos_axis) - shape = moved.shape - new_shape = ( - shape[:pos_axis] - + (shape[pos_axis] * shape[pos_axis + 1],) - + shape[pos_axis + 2:] - ) - merged = moved.reshape(new_shape) - return jax.lax.slice_in_dim(merged, 0, total_size, axis=pos_axis) + merged = np.concatenate(chunk_list, axis=axis) + pos = axis if axis >= 0 else merged.ndim + axis + slices = [slice(None)] * merged.ndim + slices[pos] = slice(0, total_size) + return merged[tuple(slices)] def _build_genotype_chunk_scanner(self, dim_map, sites_to_save): """ - Compile a `lax.scan`-based forward pass over genotype chunks. + Build a JIT-compiled forward-pass function for a single genotype chunk. + + Returns a function ``chunk_fn(data, latents, key, batch_indices)`` + that runs the model forward pass for the genotype batch given by + ``batch_indices`` and returns ``(new_key, result_dict)``. - Replaces the old per-chunk Python loop, which rebuilt a - `Predictive` object and re-traced the model on every iteration - (~39k times for a 200k-genotype dataset at default batch sizes). - Here the chunk body is traced once and compiled into a single - `lax.scan`, mirroring the on-device loop `run_optimization` already - uses for the SVI update step (`fast_scan`). The returned function is - built once per `get_posteriors` call and reused across every - posterior sampling batch, so only the first call pays tracing cost. + The function is compiled once by ``jax.jit`` on first call and + reused across all chunks and all outer sampling-batch iterations, + eliminating per-chunk re-tracing overhead while keeping GPU memory + usage to a single chunk at a time. (A ``lax.scan`` over all chunks + would pre-allocate all chunk outputs simultaneously on device, + causing OOM on large datasets.) Parameters ---------- @@ -535,19 +517,19 @@ def _build_genotype_chunk_scanner(self, dim_map, sites_to_save): Site name -> genotype-axis index, as returned by `_get_genotype_dim_map`. sites_to_save : list of str or None - If given, restricts the merged per-chunk output to these sites. + If given, restricts the per-chunk output to these sites. Returns ------- callable - ``scan_fn(data, latents, key, indices_2d) -> (final_key, stacked)`` - where ``stacked`` is a dict of site name -> array with an extra - leading chunk axis (to be collapsed by `_merge_scan_chunks`). + ``chunk_fn(data, latents, key, batch_indices) + -> (new_key, chunk_dict)`` """ model_fn = self.model.jax_model get_batch = self.model.get_batch priors = self.model.priors + @jax.jit def chunk_fn(data, latents, key, batch_indices): batch_latents = { k: jnp.take(v, batch_indices, axis=dim_map[k]) if k in dim_map else v @@ -559,9 +541,7 @@ def chunk_fn(data, latents, key, batch_indices): forward_sampler = Predictive(model_fn, posterior_samples=batch_latents) batch_pred = forward_sampler(subkey, priors=priors, data=batch_data) - # Predictions take precedence over latents of the same name, - # matching the original collection order (predictions first, - # latents only added if not already present). + # Predictions take precedence over latents of the same name. merged = dict(batch_latents) merged.update(batch_pred) if sites_to_save is not None: @@ -569,11 +549,7 @@ def chunk_fn(data, latents, key, batch_indices): return key, merged - @jax.jit - def scan_fn(data, latents, key, indices_2d): - return jax.lax.scan(partial(chunk_fn, data, latents), key, indices_2d) - - return scan_fn + return chunk_fn def get_posteriors(self, svi, @@ -589,9 +565,10 @@ def get_posteriors(self, Uses `numpyro.infer.Predictive` to sample from the posterior distribution defined by the guide and parameters. Handles large datasets by batching predictions and writing to disk (HDF5). The - forward pass over genotype batches runs as a single compiled - `lax.scan` (see `_build_genotype_chunk_scanner`) rather than a - Python loop that reconstructs `Predictive` once per chunk. + forward pass over genotype batches uses a JIT-compiled per-chunk + function (see `_build_genotype_chunk_scanner`) so that `Predictive` + is traced only once regardless of the number of chunks, and GPU + memory holds at most one chunk at a time. Parameters ---------- @@ -639,7 +616,7 @@ def get_posteriors(self, # scanner once; both are reused, unchanged, across every posterior # sampling batch below. indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) - scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + chunk_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) # Prepare HDF5 file h5_file = f"{out_prefix}_posterior.h5" @@ -655,21 +632,29 @@ def get_posteriors(self, priors=self.model.priors, data=full_data) - # Forward pass over all genotype chunks in one compiled scan + # Forward pass: iterate over genotype chunks with the JIT-compiled + # chunk_fn. Each chunk is computed, transferred to CPU, and + # discarded from GPU before the next chunk runs, keeping GPU + # memory usage to a single chunk at a time. forward_key = self.get_key() - _, stacked = scan_fn(data_on_gpu, latent_samples, forward_key, indices_2d) + chunk_outputs = {} + for chunk_indices in indices_2d: + forward_key, chunk_result = chunk_fn( + data_on_gpu, latent_samples, forward_key, chunk_indices + ) + for k, v in chunk_result.items(): + chunk_outputs.setdefault(k, []).append(np.asarray(v)) - # Collapse the chunk axis back into genotype order; global - # (non-dim_map) sites are identical across chunks, so just - # take the first chunk's value. + # Concatenate chunks along the genotype axis; global (non-dim_map) + # sites are identical across chunks so take the first chunk only. this_batch_results = {} - for k, v in stacked.items(): + for k, chunks in chunk_outputs.items(): if k in dim_map: - this_batch_results[k] = np.asarray( - self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + this_batch_results[k] = self._concat_genotype_chunks( + chunks, dim_map[k], total_num_genotypes ) else: - this_batch_results[k] = np.asarray(v[0]) + this_batch_results[k] = chunks[0] # latent_sampler always draws a full sampling_batch_size of # samples (fixed at construction); trim the final batch down @@ -1509,11 +1494,9 @@ def pe_fn(flat_p): sampling_batch_size = min(sampling_batch_size, num_posterior_samples) num_latent_batches = -(-num_posterior_samples // sampling_batch_size) - # Build the genotype-chunk index blocks and the compiled forward - # scanner once; both are reused, unchanged, across every posterior - # sampling batch below (see get_posteriors / _build_genotype_chunk_scanner). + # Build the per-chunk function once; reused across all sampling batches. indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) - scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + chunk_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) h5_file = f"{out_prefix}_posterior.h5" samples_written = 0 @@ -1542,18 +1525,24 @@ def pe_fn(flat_p): for k, v in batch_unconstrained.items() } - # Forward pass over all genotype chunks in one compiled scan + # Forward pass over genotype chunks; one chunk at a time on GPU. forward_key = self.get_key() - _, stacked = scan_fn(data_on_gpu, latent_samples, forward_key, indices_2d) + chunk_outputs = {} + for chunk_indices in indices_2d: + forward_key, chunk_result = chunk_fn( + data_on_gpu, latent_samples, forward_key, chunk_indices + ) + for k, v in chunk_result.items(): + chunk_outputs.setdefault(k, []).append(np.asarray(v)) this_batch = {} - for k, v in stacked.items(): + for k, chunks in chunk_outputs.items(): if k in dim_map: - this_batch[k] = np.asarray( - self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + this_batch[k] = self._concat_genotype_chunks( + chunks, dim_map[k], total_num_genotypes ) else: - this_batch[k] = np.asarray(v[0]) + this_batch[k] = chunks[0] # Write to HDF5 batch_size_actual = next(iter(this_batch.values())).shape[0] @@ -1608,22 +1597,27 @@ def get_nuts_posteriors(self, h5_file = f"{out_prefix}_posterior.h5" - # Forward pass over all genotype chunks (all MCMC samples at once) - # in a single compiled scan instead of a Python loop that rebuilds - # `Predictive` per chunk (see get_posteriors / _build_genotype_chunk_scanner). + # Forward pass over genotype chunks using the JIT-compiled per-chunk + # function so Predictive is traced only once (not per chunk). indices_2d = self._genotype_chunk_indices(total_num_genotypes, forward_batch_size) - scan_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) + chunk_fn = self._build_genotype_chunk_scanner(dim_map, sites_to_save) forward_key = self.get_key() - _, stacked = scan_fn(data_on_gpu, mcmc_samples, forward_key, indices_2d) + chunk_outputs = {} + for chunk_indices in indices_2d: + forward_key, chunk_result = chunk_fn( + data_on_gpu, mcmc_samples, forward_key, chunk_indices + ) + for k, v in chunk_result.items(): + chunk_outputs.setdefault(k, []).append(np.asarray(v)) results = {} - for k, v in stacked.items(): + for k, chunks in chunk_outputs.items(): if k in dim_map: - results[k] = np.asarray( - self._merge_scan_chunks(v, dim_map[k], total_num_genotypes) + results[k] = self._concat_genotype_chunks( + chunks, dim_map[k], total_num_genotypes ) else: - results[k] = np.asarray(v[0]) + results[k] = chunks[0] with h5py.File(h5_file, "w") as hf: for k, v in results.items(): diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 5818ece3..808374c2 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -1350,6 +1350,9 @@ def _initialize_classes(self): # condition_labels — legacy: ordered condition names whose # '+'/'-' character encodes selection status. # data — component data pytree for empirical prior values. + # presplit — optional direct t=-t_pre measurement of ln_cfu0 + # (PreSplitData), forwarded alongside `data` only when the + # component declares it (currently just ln_cfu0). priors_sig = inspect.signature(component_module.get_priors) if "is_selection" in priors_sig.parameters: cond_rep_df = self.growth_tm.map_groups["condition_rep"] @@ -1369,8 +1372,11 @@ def _initialize_classes(self): priors_class_kwargs[prior_group][key] = \ component_module.get_priors(condition_labels=condition_labels) elif "data" in priors_sig.parameters: + prior_kwargs = {"data": component_data} + if "presplit" in priors_sig.parameters: + prior_kwargs["presplit"] = self._data.presplit priors_class_kwargs[prior_group][key] = \ - component_module.get_priors(data=component_data) + component_module.get_priors(**prior_kwargs) elif "dk_geno_values" in priors_sig.parameters: priors_class_kwargs[prior_group][key] = \ component_module.get_priors(dk_geno_values=self._dk_geno_values) @@ -1379,8 +1385,11 @@ def _initialize_classes(self): component_module.get_priors() # Record guesses - guesses = component_module.get_guesses(name=key, - data=component_data) + guesses_sig = inspect.signature(component_module.get_guesses) + guesses_kwargs = {"name": key, "data": component_data} + if "presplit" in guesses_sig.parameters: + guesses_kwargs["presplit"] = self._data.presplit + guesses = component_module.get_guesses(**guesses_kwargs) init_params.update(guesses) # Record control parameters for the main and guide functions diff --git a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py index e9845c6f..c901bab3 100644 --- a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py +++ b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py @@ -60,6 +60,9 @@ from tfscreen.util.cli.generalized_main import generalized_main from tfscreen.tfmodel.inference.run_inference import RunInference from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator +from tfscreen.tfmodel.generative.components.ln_cfu0.hierarchical import ( + _empirical_group_estimates, +) from tfscreen.tfmodel.configuration_io import ( read_configuration, ) @@ -395,8 +398,9 @@ def _inject_calibration_priors(orchestrator_cal, orchestrator_prod, theta_values def _identify_field_mapping(orchestrator_cal): """ - Enumerate the ``condition_growth`` and ``growth_transition`` sample sites - and derive their ``ModelPriors`` field names. + Enumerate the ``condition_growth``, ``growth_transition``, and ln_cfu0 + wt/spiked-location sample sites, and derive their ``ModelPriors`` field + names. Simple-prior components expose per-condition array sites following the convention: @@ -413,6 +417,17 @@ def _identify_field_mapping(orchestrator_cal): - Site ``{component}_{x}_hyper_scale`` → HalfNormal; ``scale_field = {x}_hyper_scale_loc``. + The ln_cfu0 component's ``wt_loc``/``spiked_loc`` sites are always free + (never pinned during calibration — see ``_PINNED_COMPONENTS``), so they + are always picked up here. Their ``ModelPriors`` fields are + self-prefixed (``ln_cfu0_wt_loc_loc``, not ``wt_loc_loc``), unlike the + condition_growth/growth_transition convention above, so they get their + own branch rather than falling through the shared suffix logic. Whether + the caller actually *uses* these two sites to override the production + priors is decided later, in ``run_prefit_calibration``, based on + whether the production config's own empirical estimate already had + direct pre-split coverage for that class. + Returns ------- dict[str, dict] @@ -433,6 +448,15 @@ def _identify_field_mapping(orchestrator_cal): elif site_name.startswith("growth_transition_"): component = "growth_transition" suffix = site_name[len("growth_transition_"):] + elif site_name in ("ln_cfu0_wt_loc", "ln_cfu0_spiked_loc"): + out[site_name] = { + "component": "ln_cfu0", + "dist_class": "Normal", + "loc_field": f"{site_name}_loc", + "scale_field": f"{site_name}_scale", + "is_array": False, + } + continue else: continue @@ -471,6 +495,53 @@ def _identify_field_mapping(orchestrator_cal): return out +def _drop_presplit_backed_ln_cfu0_sites(field_mapping, ln_cfu0_estimates): + """ + Remove ``ln_cfu0_wt_loc`` / ``ln_cfu0_spiked_loc`` from ``field_mapping`` + for any class whose production empirical estimate was already backed by + direct pre-split data. + + The calibration MAP's joint fit of ``ln_cfu0_wt_loc``/``spiked_loc`` + alongside ``condition_growth``/``growth_transition`` is only worth + trusting *more* than a class's own direct measurement when that + measurement doesn't exist — pre-split data is a lower-variance, + growth-unconfounded read straight off the data, whereas the calibration + estimate is a noisier joint-optimization byproduct that can only match + it at best. Library-class hyperpriors (``hyper_loc``/``hyper_scale``) + are never part of ``field_mapping`` in the first place (they stay pinned + throughout calibration; see ``_PINNED_COMPONENTS``), so this only ever + touches the two class-level ln_cfu0 sites. + + Parameters + ---------- + field_mapping : dict + Output of :func:`_identify_field_mapping`. + ln_cfu0_estimates : dict or None + Output of ``_empirical_group_estimates`` run on the *production* + data (i.e. ``orchestrator_prod.data.growth``/``.presplit``), or + ``None`` if it couldn't be computed (e.g. stub/mocked data) — in + that case nothing is dropped, matching prior behaviour. + + Returns + ------- + dict + ``field_mapping``, with any presplit-backed ln_cfu0 sites removed. + """ + if ln_cfu0_estimates is None: + return field_mapping + + drop = set() + if ln_cfu0_estimates.get("wt_source") == "presplit": + drop.add("ln_cfu0_wt_loc") + if ln_cfu0_estimates.get("spiked_source") == "presplit": + drop.add("ln_cfu0_spiked_loc") + + if not drop: + return field_mapping + + return {k: v for k, v in field_mapping.items() if k not in drop} + + # --------------------------------------------------------------------------- # CSV update logic # --------------------------------------------------------------------------- @@ -1010,7 +1081,22 @@ def run_prefit_calibration(config_file, ) # 6. Map sample sites → CSV fields and apply in-place updates. + # ln_cfu0_wt_loc/spiked_loc are only let through when the production + # config's own empirical estimate (get_priors' presplit-preferring + # estimator) had no direct pre-split coverage for that class — when + # it does, that direct read is already better than anything the + # calibration's joint MAP can offer, so we leave it alone. + prod_growth_data = getattr(orchestrator_prod.data, "growth", None) + ln_cfu0_estimates = None + if prod_growth_data is not None: + ln_cfu0_estimates = _empirical_group_estimates( + prod_growth_data, + presplit=getattr(orchestrator_prod.data, "presplit", None), + ) field_mapping = _identify_field_mapping(orchestrator_cal) + field_mapping = _drop_presplit_backed_ln_cfu0_sites( + field_mapping, ln_cfu0_estimates + ) prior_updates, guess_updates = _build_csv_updates(field_mapping, params) hessian_guess_updates, hessian_prior_updates = _build_hessian_scale_updates( diff --git a/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py b/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py index 88970f33..98300e15 100644 --- a/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py +++ b/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical.py @@ -60,6 +60,37 @@ def _all_library_masks(num_genotype): return jnp.ones((1, num_genotype), dtype=bool) +MockPreSplitData = namedtuple("MockPreSplitData", [ + "ln_cfu_t0", # (rep, cond_pre, geno) + "ln_cfu_t0_std", # (rep, cond_pre, geno) + "good_mask", # (rep, cond_pre, geno) bool +]) + + +def _make_presplit(num_replicate, num_condition_pre, num_genotype, + per_geno_values, valid_mask=None): + """ + Build a MockPreSplitData with shape (rep, cond_pre, geno), constant per + genotype. ``valid_mask`` (shape (geno,), default all True) marks which + genotypes have any pre-split coverage at all. + """ + shape = (num_replicate, num_condition_pre, num_genotype) + ln_cfu_t0 = np.zeros(shape) + for g, v in enumerate(per_geno_values): + ln_cfu_t0[..., g] = v + + if valid_mask is None: + valid_mask = np.ones(num_genotype, dtype=bool) + good_mask = np.zeros(shape, dtype=bool) + good_mask[..., valid_mask] = True + + return MockPreSplitData( + ln_cfu_t0=ln_cfu_t0, + ln_cfu_t0_std=np.ones(shape), + good_mask=good_mask, + ) + + # --------------------------------------------------------------------------- # Fixtures # --------------------------------------------------------------------------- @@ -331,6 +362,14 @@ def test_get_priors_accepts_data_keyword(): assert sig.parameters["data"].default is None +def test_get_priors_accepts_presplit_keyword(): + """get_priors must accept an optional `presplit` keyword (ModelOrchestrator + detects this and forwards data.presplit only when it's present).""" + sig = inspect.signature(get_priors) + assert "presplit" in sig.parameters + assert sig.parameters["presplit"].default is None + + def test_get_priors_with_data_overrides_subgroup_scales(mock_data_empirical): """ When data is supplied, ln_cfu0_wt_scale and ln_cfu0_spiked_scale are @@ -374,6 +413,32 @@ def test_get_priors_two_classes_separate_locs(mock_data_two_classes): assert float(priors.ln_cfu0_hyper_loc_locs[1]) == pytest.approx(12.0) +def test_get_priors_with_presplit_uses_direct_scale(mock_data_empirical): + """ + When presplit data covers the wt class, ln_cfu0_wt_scale is derived from + the presplit spread instead of the (degenerate, single-genotype) ln_cfu + spread. + """ + # Two distinct wt presplit readings (10.0, 14.0) give a real spread, + # unlike the single constant ln_cfu=12.0 value which floors to + # _SCALE_FLOOR. + presplit_vals = np.zeros((2, 2, 6)) + presplit_vals[0, :, 0] = 10.0 + presplit_vals[1, :, 0] = 14.0 + presplit_good = np.zeros((2, 2, 6), dtype=bool) + presplit_good[:, :, 0] = True + presplit = MockPreSplitData( + ln_cfu_t0=presplit_vals, ln_cfu_t0_std=np.ones((2, 2, 6)), + good_mask=presplit_good, + ) + + priors = get_priors(data=mock_data_empirical, presplit=presplit) + # loc = median(10,10,14,14) = 12; deviations = [-2,-2,2,2]; MAD=2; + # scale = 1.4826*2 = 2.9652 + assert priors.ln_cfu0_wt_scale == pytest.approx(1.4826 * 2.0, rel=1e-4) + assert priors.ln_cfu0_wt_scale != pytest.approx(_SCALE_FLOOR) + + def test_get_priors_with_unparseable_data_falls_back_to_defaults(): """ A stub data object that lacks a 7-D ln_cfu tensor must fall through to @@ -446,6 +511,114 @@ def test_empirical_group_estimates_two_classes(mock_data_two_classes): assert est["hyper_locs"][1] == pytest.approx(12.0) # doubles median +# --------------------------------------------------------------------------- +# Tests: _empirical_group_estimates – presplit-aware source selection +# --------------------------------------------------------------------------- + +def test_empirical_group_estimates_no_presplit_all_sources_are_median(mock_data_empirical): + """With no presplit argument, every class's source is 'median' (the + pre-existing, growth-confounded estimator) — exact backward compatibility.""" + est = _empirical_group_estimates(mock_data_empirical) + assert est["wt_source"] == "median" + assert est["spiked_source"] == "median" + assert est["hyper_sources"] == ["median"] + + +def test_empirical_group_estimates_prefers_presplit_when_covered(mock_data_empirical): + """ + A class with full pre-split coverage uses the direct measurement instead + of the ln_cfu median, and reports source == 'presplit'. Classes without + presplit coverage are untouched and still report 'median'. + """ + # mock_data_empirical: index 0 = wt (ln_cfu=12), 1,2 = spiked (10, 11), + # 3,4,5 = library (8, 7, 9). Give only wt a presplit reading, and make + # it clearly different (20.0) from the ln_cfu-derived value (12.0) so we + # can tell which source won. + presplit = _make_presplit( + num_replicate=2, num_condition_pre=2, num_genotype=6, + per_geno_values=[20.0, 0.0, 0.0, 0.0, 0.0, 0.0], + valid_mask=np.array([True, False, False, False, False, False]), + ) + est = _empirical_group_estimates(mock_data_empirical, presplit=presplit) + + assert est["wt_loc"] == pytest.approx(20.0) + assert est["wt_source"] == "presplit" + + # Spiked and library classes had no presplit coverage -> unchanged from + # the no-presplit baseline. + assert est["spiked_loc"] == pytest.approx(10.5) + assert est["spiked_source"] == "median" + assert est["hyper_loc"] == pytest.approx(8.0) + assert est["hyper_sources"] == ["median"] + + +def test_empirical_group_estimates_partial_presplit_coverage_mixes_per_cell(mock_data_empirical): + """ + When only some (replicate, condition_pre) cells of a class have a valid + presplit reading, those specific cells use the presplit value and the + remaining cells fall back to the ln_cfu value — but the class as a whole + is still reported as 'presplit'-sourced since at least one cell used it. + """ + presplit_vals = np.zeros((2, 2, 6)) + presplit_vals[..., 0] = 20.0 # wt presplit value, differs from ln_cfu=12 + presplit_good = np.zeros((2, 2, 6), dtype=bool) + # Only replicate 0's cells are valid for wt; replicate 1 has no reading. + presplit_good[0, :, 0] = True + + presplit = MockPreSplitData( + ln_cfu_t0=presplit_vals, + ln_cfu_t0_std=np.ones((2, 2, 6)), + good_mask=presplit_good, + ) + + est = _empirical_group_estimates(mock_data_empirical, presplit=presplit) + + # wt combined values: replicate 0 -> 20.0 (presplit), replicate 1 -> 12.0 + # (ln_cfu fallback). Median of [20, 20, 12, 12] = 16.0. + assert est["wt_loc"] == pytest.approx(16.0) + assert est["wt_source"] == "presplit" + + +def test_empirical_group_estimates_presplit_shape_mismatch_is_ignored(mock_data_empirical): + """A presplit tensor whose shape doesn't match (rep, cond_pre, geno) is + silently ignored rather than raising or corrupting the estimate.""" + bad_presplit = MockPreSplitData( + ln_cfu_t0=np.zeros((99, 99)), + ln_cfu_t0_std=np.ones((99, 99)), + good_mask=np.ones((99, 99), dtype=bool), + ) + est = _empirical_group_estimates(mock_data_empirical, presplit=bad_presplit) + assert est["wt_loc"] == pytest.approx(12.0) + assert est["wt_source"] == "median" + + +def test_empirical_group_estimates_presplit_missing_attributes_is_ignored(mock_data_empirical): + """A presplit-like object lacking ln_cfu_t0/good_mask attributes falls + back to the ln_cfu-median estimator rather than raising.""" + Empty = namedtuple("Empty", ["irrelevant"]) + est = _empirical_group_estimates(mock_data_empirical, presplit=Empty(irrelevant=1)) + assert est["wt_loc"] == pytest.approx(12.0) + assert est["wt_source"] == "median" + + +def test_empirical_group_estimates_presplit_covers_library_classes_too(mock_data_two_classes): + """Presplit preference applies independently to each library class, not + just wt/spiked.""" + # mock_data_two_classes: idx0=wt(12), idx1=spiked(10), idx2-4=singles(8,7,9), + # idx5-6=doubles(11,13). Give doubles a presplit reading of 99.0. + presplit = _make_presplit( + num_replicate=2, num_condition_pre=2, num_genotype=7, + per_geno_values=[0, 0, 0, 0, 0, 99.0, 99.0], + valid_mask=np.array([False, False, False, False, False, True, True]), + ) + est = _empirical_group_estimates(mock_data_two_classes, presplit=presplit) + + assert est["hyper_locs"][0] == pytest.approx(8.0) # singles: unchanged + assert est["hyper_sources"][0] == "median" + assert est["hyper_locs"][1] == pytest.approx(99.0) # doubles: presplit + assert est["hyper_sources"][1] == "presplit" + + # --------------------------------------------------------------------------- # Tests: get_guesses – structure # --------------------------------------------------------------------------- @@ -475,6 +648,54 @@ def test_get_guesses_two_classes_keys(mock_data_two_classes): assert f"{name}_hyper_scale_{i}" in guesses +def test_get_guesses_accepts_presplit_keyword(): + """get_guesses must accept an optional `presplit` keyword (ModelOrchestrator + detects this and forwards data.presplit only when it's present).""" + sig = inspect.signature(get_guesses) + assert "presplit" in sig.parameters + assert sig.parameters["presplit"].default is None + + +# --------------------------------------------------------------------------- +# Tests: get_guesses – presplit-preferred values +# --------------------------------------------------------------------------- + +def test_get_guesses_wt_loc_prefers_presplit(mock_data_empirical): + """wt_loc guess uses the presplit-derived value when presplit covers wt, + instead of the ln_cfu median.""" + presplit = _make_presplit( + num_replicate=2, num_condition_pre=2, num_genotype=6, + per_geno_values=[20.0, 0.0, 0.0, 0.0, 0.0, 0.0], + valid_mask=np.array([True, False, False, False, False, False]), + ) + guesses = get_guesses("x", mock_data_empirical, presplit=presplit) + assert guesses["x_wt_loc"] == pytest.approx(20.0) + # Untouched classes keep their ln_cfu-median guesses. + assert guesses["x_spiked_loc"] == pytest.approx(10.5) + assert guesses["x_hyper_loc_0"] == pytest.approx(8.0) + + +def test_get_guesses_offset_uses_presplit_value_per_cell(mock_data_empirical): + """ + Per-genotype offsets are computed from the presplit-preferred combined + tensor, not the raw ln_cfu value, wherever presplit coverage exists — + keeping the offset numerator consistent with whatever basis the class + loc/scale used, so a genotype exactly at its (presplit-derived) group + loc still gets an offset of 0. + """ + # Give wt a presplit reading (20.0) equal to a new group loc so the + # offset should be exactly 0, even though the raw ln_cfu value (12.0) + # differs substantially. + presplit = _make_presplit( + num_replicate=2, num_condition_pre=2, num_genotype=6, + per_geno_values=[20.0, 0.0, 0.0, 0.0, 0.0, 0.0], + valid_mask=np.array([True, False, False, False, False, False]), + ) + guesses = get_guesses("x", mock_data_empirical, presplit=presplit) + offsets = np.array(guesses["x_offset"]) + assert offsets[..., 0] == pytest.approx(0.0, abs=1e-6) + + # --------------------------------------------------------------------------- # Tests: get_guesses – empirical group-level estimates # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py b/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py index 0ddf2dbc..4069724c 100644 --- a/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py +++ b/tests/tfscreen/tfmodel/generative/components/ln_cfu0/test_hierarchical_factored.py @@ -52,6 +52,30 @@ def _all_library_masks(num_genotype): return jnp.ones((1, num_genotype), dtype=bool) +MockPreSplitData = namedtuple("MockPreSplitData", [ + "ln_cfu_t0", "ln_cfu_t0_std", "good_mask", +]) + + +def _make_presplit(num_replicate, num_condition_pre, num_genotype, + per_geno_values, valid_mask=None): + """Build a MockPreSplitData with shape (rep, cond_pre, geno), constant + per genotype. ``valid_mask`` (shape (geno,)) marks covered genotypes.""" + shape = (num_replicate, num_condition_pre, num_genotype) + ln_cfu_t0 = np.zeros(shape) + for g, v in enumerate(per_geno_values): + ln_cfu_t0[..., g] = v + + if valid_mask is None: + valid_mask = np.ones(num_genotype, dtype=bool) + good_mask = np.zeros(shape, dtype=bool) + good_mask[..., valid_mask] = True + + return MockPreSplitData( + ln_cfu_t0=ln_cfu_t0, ln_cfu_t0_std=np.ones(shape), good_mask=good_mask, + ) + + # --------------------------------------------------------------------------- # Fixtures # --------------------------------------------------------------------------- @@ -183,6 +207,14 @@ def test_get_priors_accepts_data_keyword(): assert sig.parameters["data"].default is None +def test_get_priors_accepts_presplit_keyword(): + """get_priors must accept an optional `presplit` keyword and forward it + to the shared empirical estimator (ModelOrchestrator detects this).""" + sig = inspect.signature(get_priors) + assert "presplit" in sig.parameters + assert sig.parameters["presplit"].default is None + + def test_get_priors_with_data_overrides_subgroup_scales(mock_data_varied): priors = get_priors(data=mock_data_varied) # wt: single value → floored; spiked: two values ±0.5 from median @@ -191,6 +223,31 @@ def test_get_priors_with_data_overrides_subgroup_scales(mock_data_varied): assert priors.ln_cfu0_spiked_scale == pytest.approx(1.4826 * 0.5, rel=1e-4) +def test_get_priors_with_presplit_overrides_wt_scale(mock_data_varied): + """ + presplit is correctly forwarded through to the shared empirical + estimator: a wt presplit spread (rather than the degenerate single-value + ln_cfu spread) drives ln_cfu0_wt_scale. + """ + R, C, G = mock_data_varied.num_replicate, mock_data_varied.num_condition_pre, \ + mock_data_varied.num_genotype + presplit_vals = np.zeros((R, C, G)) + presplit_vals[0, :, 0] = 10.0 + presplit_vals[1, :, 0] = 14.0 + presplit_good = np.zeros((R, C, G), dtype=bool) + presplit_good[:, :, 0] = True + presplit = MockPreSplitData( + ln_cfu_t0=presplit_vals, ln_cfu_t0_std=np.ones((R, C, G)), + good_mask=presplit_good, + ) + + priors = get_priors(data=mock_data_varied, presplit=presplit) + # loc = median(10,10,14,14) = 12; MAD=2; scale = 1.4826*2 + from tfscreen.tfmodel.generative.components.ln_cfu0.hierarchical import _SCALE_FLOOR + assert priors.ln_cfu0_wt_scale == pytest.approx(1.4826 * 2.0, rel=1e-4) + assert priors.ln_cfu0_wt_scale != pytest.approx(_SCALE_FLOOR) + + # --------------------------------------------------------------------------- # Tests: get_guesses – shape and structure # --------------------------------------------------------------------------- @@ -245,6 +302,26 @@ def test_get_guesses_offset_geno_not_condition_pre_indexed(mock_data): assert guesses["x_offset_geno"].ndim == 2 +def test_get_guesses_accepts_presplit_keyword(): + """get_guesses must accept an optional `presplit` keyword and forward it + to the shared empirical estimator (ModelOrchestrator detects this).""" + sig = inspect.signature(get_guesses) + assert "presplit" in sig.parameters + assert sig.parameters["presplit"].default is None + + +def test_get_guesses_wt_loc_prefers_presplit(mock_data_varied): + """wt_loc guess uses the presplit-derived value instead of the ln_cfu + median when presplit covers the wt genotype.""" + presplit = _make_presplit( + num_replicate=2, num_condition_pre=2, num_genotype=6, + per_geno_values=[20.0, 0.0, 0.0, 0.0, 0.0, 0.0], + valid_mask=np.array([True, False, False, False, False, False]), + ) + guesses = get_guesses("x", mock_data_varied, presplit=presplit) + assert guesses["x_wt_loc"] == pytest.approx(20.0) + + # --------------------------------------------------------------------------- # Tests: define_model – return shape # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/inference/test_run_inference.py b/tests/tfscreen/tfmodel/inference/test_run_inference.py index 113e9c17..cd0c3114 100644 --- a/tests/tfscreen/tfmodel/inference/test_run_inference.py +++ b/tests/tfscreen/tfmodel/inference/test_run_inference.py @@ -173,10 +173,10 @@ def test_run_optimization_nan_explosion(mocker): # get_posteriors — real model + component guide, no Predictive mocking # ============================================================================= # -# get_posteriors now runs its genotype-batch forward pass as a single -# compiled `lax.scan` (see `_build_genotype_chunk_scanner` / -# `_merge_scan_chunks` / `_genotype_chunk_indices` in run_inference.py) -# instead of a Python loop that rebuilt `Predictive` once per chunk. Mocking +# get_posteriors drives its genotype-batch forward pass with a JIT-compiled +# per-chunk function (see `_build_genotype_chunk_scanner` / +# `_genotype_chunk_indices` in run_inference.py) so that `Predictive` is +# traced only once and GPU memory holds one chunk at a time. Mocking # `Predictive` with a fixed call-count `side_effect` list (the old test # strategy) no longer reflects how the code calls it, so these tests run a # real tiny numpyro model + component guide end-to-end and check actual @@ -368,7 +368,7 @@ def test_get_posteriors_chunking_matches_unchunked_latents(tmpdir): # ============================================================================= -# _genotype_chunk_indices / _merge_scan_chunks — pure indexing-math tests +# _genotype_chunk_indices / _concat_genotype_chunks — pure indexing-math tests # ============================================================================= def test_genotype_chunk_indices_exact_divisor(): @@ -386,41 +386,33 @@ def test_genotype_chunk_indices_single_chunk_smaller_than_batch(): np.testing.assert_array_equal(idx, [[0, 1, 1, 1, 1]]) -def test_merge_scan_chunks_positive_axis_no_padding(): +def test_concat_genotype_chunks_positive_axis_no_padding(): # 2 chunks, per-chunk shape (samples=2, genotypes=3), genotype axis=1 - chunk0 = jnp.array([[0., 1., 2.], [10., 11., 12.]]) - chunk1 = jnp.array([[3., 4., 5.], [13., 14., 15.]]) - stacked = jnp.stack([chunk0, chunk1], axis=0) # (2, 2, 3) + chunk0 = np.array([[0., 1., 2.], [10., 11., 12.]]) + chunk1 = np.array([[3., 4., 5.], [13., 14., 15.]]) + merged = RunInference._concat_genotype_chunks([chunk0, chunk1], axis=1, total_size=6) + expected = np.array([[0., 1., 2., 3., 4., 5.], + [10., 11., 12., 13., 14., 15.]]) + np.testing.assert_array_equal(merged, expected) - merged = RunInference._merge_scan_chunks(stacked, axis=1, total_size=6) - expected = jnp.array([[0., 1., 2., 3., 4., 5.], - [10., 11., 12., 13., 14., 15.]]) - np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) - - -def test_merge_scan_chunks_trims_padding(): +def test_concat_genotype_chunks_trims_padding(): # total real genotypes = 5, forward_batch_size=3 -> chunks (0,1,2),(3,4,4) - chunk0 = jnp.array([[0., 1., 2.]]) - chunk1 = jnp.array([[3., 4., 4.]]) # last entry is padding (duplicate of idx 4) - stacked = jnp.stack([chunk0, chunk1], axis=0) - - merged = RunInference._merge_scan_chunks(stacked, axis=1, total_size=5) + chunk0 = np.array([[0., 1., 2.]]) + chunk1 = np.array([[3., 4., 4.]]) # last entry is padding (duplicate of idx 4) + merged = RunInference._concat_genotype_chunks([chunk0, chunk1], axis=1, total_size=5) + expected = np.array([[0., 1., 2., 3., 4.]]) + np.testing.assert_array_equal(merged, expected) - expected = jnp.array([[0., 1., 2., 3., 4.]]) - np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) - -def test_merge_scan_chunks_negative_axis(): +def test_concat_genotype_chunks_negative_axis(): # genotype axis = -1 (last axis) of a per-chunk shape (samples, genotypes) - chunk0 = jnp.array([[0., 1.], [10., 11.]]) - chunk1 = jnp.array([[2., 3.], [12., 13.]]) - stacked = jnp.stack([chunk0, chunk1], axis=0) # (2, 2, 2) - - merged = RunInference._merge_scan_chunks(stacked, axis=-1, total_size=4) + chunk0 = np.array([[0., 1.], [10., 11.]]) + chunk1 = np.array([[2., 3.], [12., 13.]]) + merged = RunInference._concat_genotype_chunks([chunk0, chunk1], axis=-1, total_size=4) + expected = np.array([[0., 1., 2., 3.], [10., 11., 12., 13.]]) + np.testing.assert_array_equal(merged, expected) - expected = jnp.array([[0., 1., 2., 3.], [10., 11., 12., 13.]]) - np.testing.assert_allclose(np.asarray(merged), np.asarray(expected)) def test_run_optimization_restore(tmpdir, mocker): model = MockModel() diff --git a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py index aeb4f2df..c7070e79 100644 --- a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py @@ -12,6 +12,7 @@ import os import shutil import sys +from collections import namedtuple from unittest.mock import MagicMock, patch import numpy as np @@ -20,6 +21,8 @@ import yaml import jax import jax.numpy as jnp +import numpyro as pyro +import numpyro.distributions as dist import flax.struct as fstruct @@ -31,6 +34,7 @@ _build_hessian_scale_updates, _compute_theta_values, _csv_row_name, + _drop_presplit_backed_ln_cfu0_sites, _identify_field_mapping, _inject_calibration_priors, _intersect_data, @@ -374,6 +378,133 @@ def test_genotype_ordering_matches_labels(self): assert theta[0, 0, 2] < 0.15 +# --------------------------------------------------------------------------- +# _identify_field_mapping — ln_cfu0 wt_loc/spiked_loc recognition +# --------------------------------------------------------------------------- + +class TestIdentifyFieldMappingLnCfu0: + + def _fake_orchestrator(self, jax_model): + orchestrator_cal = MagicMock() + orchestrator_cal.jax_model = jax_model + orchestrator_cal.data = {} + orchestrator_cal.priors = {} + return orchestrator_cal + + def test_recognizes_wt_and_spiked_loc_sites(self): + def fake_model(data, priors): + pyro.sample("ln_cfu0_wt_loc", dist.Normal(0.0, 1.0)) + pyro.sample("ln_cfu0_spiked_loc", dist.Normal(0.0, 1.0)) + + mapping = _identify_field_mapping(self._fake_orchestrator(fake_model)) + + assert mapping["ln_cfu0_wt_loc"] == { + "component": "ln_cfu0", + "dist_class": "Normal", + "loc_field": "ln_cfu0_wt_loc_loc", + "scale_field": "ln_cfu0_wt_loc_scale", + "is_array": False, + } + assert mapping["ln_cfu0_spiked_loc"] == { + "component": "ln_cfu0", + "dist_class": "Normal", + "loc_field": "ln_cfu0_spiked_loc_loc", + "scale_field": "ln_cfu0_spiked_loc_scale", + "is_array": False, + } + + def test_ignores_other_ln_cfu0_sites(self): + """ + Only wt_loc/spiked_loc are ever surfaced -- the pinned library-class + hyperpriors (hyper_loc_i/hyper_scale_i) and per-genotype offsets are + not condition_growth/growth_transition/ln_cfu0-wt-spiked sites, so + they must not appear in the mapping. + """ + def fake_model(data, priors): + pyro.sample("ln_cfu0_wt_loc", dist.Normal(0.0, 1.0)) + pyro.sample("ln_cfu0_hyper_loc_0", dist.Normal(0.0, 1.0)) + pyro.sample("ln_cfu0_offset", dist.Normal(0.0, 1.0)) + + mapping = _identify_field_mapping(self._fake_orchestrator(fake_model)) + + assert "ln_cfu0_wt_loc" in mapping + assert "ln_cfu0_hyper_loc_0" not in mapping + assert "ln_cfu0_offset" not in mapping + + def test_still_recognizes_condition_growth_sites_alongside_ln_cfu0(self): + """The new ln_cfu0 branch doesn't interfere with the pre-existing + condition_growth/growth_transition suffix-based detection.""" + def fake_model(data, priors): + pyro.sample("condition_growth_k", dist.Normal(0.0, 1.0)) + pyro.sample("ln_cfu0_wt_loc", dist.Normal(0.0, 1.0)) + + mapping = _identify_field_mapping(self._fake_orchestrator(fake_model)) + + assert mapping["condition_growth_k"]["component"] == "condition_growth" + assert mapping["ln_cfu0_wt_loc"]["component"] == "ln_cfu0" + + +# --------------------------------------------------------------------------- +# _drop_presplit_backed_ln_cfu0_sites +# --------------------------------------------------------------------------- + +class TestDropPresplitBackedLnCfu0Sites: + + def _field_mapping(self): + return { + "condition_growth_k": {"component": "condition_growth"}, + "ln_cfu0_wt_loc": {"component": "ln_cfu0"}, + "ln_cfu0_spiked_loc": {"component": "ln_cfu0"}, + } + + def test_none_estimates_leaves_mapping_unchanged(self): + fm = self._field_mapping() + result = _drop_presplit_backed_ln_cfu0_sites(fm, None) + assert result == fm + + def test_both_median_keeps_both_sites(self): + fm = self._field_mapping() + estimates = {"wt_source": "median", "spiked_source": "median"} + result = _drop_presplit_backed_ln_cfu0_sites(fm, estimates) + assert "ln_cfu0_wt_loc" in result + assert "ln_cfu0_spiked_loc" in result + + def test_wt_presplit_drops_only_wt(self): + fm = self._field_mapping() + estimates = {"wt_source": "presplit", "spiked_source": "median"} + result = _drop_presplit_backed_ln_cfu0_sites(fm, estimates) + assert "ln_cfu0_wt_loc" not in result + assert "ln_cfu0_spiked_loc" in result + + def test_spiked_presplit_drops_only_spiked(self): + fm = self._field_mapping() + estimates = {"wt_source": "median", "spiked_source": "presplit"} + result = _drop_presplit_backed_ln_cfu0_sites(fm, estimates) + assert "ln_cfu0_wt_loc" in result + assert "ln_cfu0_spiked_loc" not in result + + def test_both_presplit_drops_both(self): + fm = self._field_mapping() + estimates = {"wt_source": "presplit", "spiked_source": "presplit"} + result = _drop_presplit_backed_ln_cfu0_sites(fm, estimates) + assert "ln_cfu0_wt_loc" not in result + assert "ln_cfu0_spiked_loc" not in result + + def test_unrelated_sites_never_dropped(self): + fm = self._field_mapping() + estimates = {"wt_source": "presplit", "spiked_source": "presplit"} + result = _drop_presplit_backed_ln_cfu0_sites(fm, estimates) + assert "condition_growth_k" in result + + def test_does_not_mutate_input_mapping(self): + fm = self._field_mapping() + original = dict(fm) + _drop_presplit_backed_ln_cfu0_sites( + fm, {"wt_source": "presplit", "spiked_source": "presplit"} + ) + assert fm == original + + # --------------------------------------------------------------------------- # _csv_row_name / _build_csv_updates # --------------------------------------------------------------------------- @@ -1156,6 +1287,148 @@ def test_hessian_chunk_size_forwarded(self, tmp_path, mocker): call_kwargs = mock_ri.compute_hessian_sigmas.call_args.kwargs assert call_kwargs.get("hessian_chunk_size") == 32 + # ----------------------------------------------------------------------- + # ln_cfu0 wt/spiked_loc presplit gating (end to end) + # ----------------------------------------------------------------------- + + def _make_prod_data(self, wt_has_presplit, spiked_has_presplit): + """ + Build a minimal but real production data object (not a MagicMock) + with one wt and one spiked genotype, so + _empirical_group_estimates can actually run against it and report + genuine wt_source/spiked_source values. + """ + GrowthLike = namedtuple("GrowthLike", [ + "ln_cfu", "good_mask", "ln_cfu0_spiked_mask", "ln_cfu0_wt_mask", + ]) + PresplitLike = namedtuple("PresplitLike", ["ln_cfu_t0", "good_mask"]) + DataLike = namedtuple("DataLike", ["growth", "presplit"]) + + # genotype 0 = wt, genotype 1 = spiked + shape7 = (1, 1, 1, 1, 1, 1, 2) + growth_like = GrowthLike( + ln_cfu=np.array([12.0, 10.0]).reshape(shape7), + good_mask=np.ones(shape7, dtype=bool), + ln_cfu0_spiked_mask=np.array([False, True]), + ln_cfu0_wt_mask=np.array([True, False]), + ) + shape3 = (1, 1, 2) + presplit_good = np.zeros(shape3, dtype=bool) + presplit_good[..., 0] = wt_has_presplit + presplit_good[..., 1] = spiked_has_presplit + presplit_like = PresplitLike( + ln_cfu_t0=np.array([20.0, 30.0]).reshape(shape3), + good_mask=presplit_good, + ) + return DataLike(growth=growth_like, presplit=presplit_like) + + def test_wt_loc_override_skipped_when_production_has_presplit(self, tmp_path, mocker): + """ + When the production data's own empirical estimate for wt already had + direct pre-split coverage, the calibration MAP's ln_cfu0_wt_loc must + NOT override the production prior/guess CSV rows. + """ + cfg, priors, guesses = self._write_yaml_and_csvs(tmp_path) + pd.DataFrame({ + "parameter": ["growth.ln_cfu0.ln_cfu0_wt_loc_loc"], + "value": [13.0], + }).to_csv(priors, index=False) + pd.DataFrame({ + "parameter": ["ln_cfu0_wt_loc"], + "value": [13.0], + "flat_index": [float("nan")], + }).to_csv(guesses, index=False) + + orchestrator_prod = MagicMock() + orchestrator_prod.data = self._make_prod_data( + wt_has_presplit=True, spiked_has_presplit=False + ) + self._patch_pipeline( + mocker, + params={"ln_cfu0_wt_loc_auto_loc": np.float32(99.0)}, + field_mapping={ + "ln_cfu0_wt_loc": { + "component": "ln_cfu0", + "dist_class": "Normal", + "loc_field": "ln_cfu0_wt_loc_loc", + "scale_field": "ln_cfu0_wt_loc_scale", + "is_array": False, + }, + }, + ) + # _patch_pipeline patches read_configuration to a generic MagicMock; + # override it here (applied after, so it wins) with our data-bearing + # orchestrator_prod so the presplit gating has something real to + # inspect. + mocker.patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.read_configuration", + return_value=(orchestrator_prod, {}), + ) + + run_prefit_calibration(config_file=cfg, seed=1) + + new_priors = pd.read_csv(priors).set_index("parameter")["value"] + new_guesses = pd.read_csv(guesses) + # Untouched: still the original value, not the calibration MAP's 99.0 + assert new_priors["growth.ln_cfu0.ln_cfu0_wt_loc_loc"] == 13.0 + assert new_guesses.iloc[0]["value"] == 13.0 + assert not os.path.exists(priors + ".bak") + assert not os.path.exists(guesses + ".bak") + + def test_wt_loc_override_applied_when_production_has_no_presplit(self, tmp_path, mocker): + """ + When the production data's empirical estimate for wt had no + pre-split coverage (median fallback only), the calibration MAP's + ln_cfu0_wt_loc IS used to refine the production prior/guess. + """ + cfg, priors, guesses = self._write_yaml_and_csvs(tmp_path) + pd.DataFrame({ + "parameter": ["growth.ln_cfu0.ln_cfu0_wt_loc_loc"], + "value": [13.0], + }).to_csv(priors, index=False) + pd.DataFrame({ + "parameter": ["ln_cfu0_wt_loc"], + "value": [13.0], + "flat_index": [float("nan")], + }).to_csv(guesses, index=False) + + orchestrator_prod = MagicMock() + orchestrator_prod.data = self._make_prod_data( + wt_has_presplit=False, spiked_has_presplit=False + ) + self._patch_pipeline( + mocker, + params={"ln_cfu0_wt_loc_auto_loc": np.float32(99.0)}, + field_mapping={ + "ln_cfu0_wt_loc": { + "component": "ln_cfu0", + "dist_class": "Normal", + "loc_field": "ln_cfu0_wt_loc_loc", + "scale_field": "ln_cfu0_wt_loc_scale", + "is_array": False, + }, + }, + ) + # _patch_pipeline patches read_configuration to a generic MagicMock; + # override it here (applied after, so it wins) with our data-bearing + # orchestrator_prod so the presplit gating has something real to + # inspect. + mocker.patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.read_configuration", + return_value=(orchestrator_prod, {}), + ) + + run_prefit_calibration(config_file=cfg, seed=1) + + new_priors = pd.read_csv(priors).set_index("parameter")["value"] + new_guesses = pd.read_csv(guesses) + assert new_priors["growth.ln_cfu0.ln_cfu0_wt_loc_loc"] == pytest.approx(99.0) + assert new_guesses.iloc[0]["value"] == pytest.approx(99.0) + assert os.path.exists(priors + ".bak") + assert os.path.exists(guesses + ".bak") + # --------------------------------------------------------------------------- # _build_hessian_scale_updates diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 6215a59c..b6dbf843 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -431,6 +431,97 @@ def test_initialize_classes_logic(mocker): assert model._theta == "categorical_geno" +# --------------------------------------------------------------------------- +# presplit forwarding to component get_priors/get_guesses +# --------------------------------------------------------------------------- + +class _LnCfu0ModuleWithPresplit: + """ + A minimal, real (non-Mock) component module whose get_priors/get_guesses + declare a `presplit` parameter, so inspect.signature can actually detect + it -- MagicMock's auto-generated (*args, **kwargs) signature can't be + used to exercise this branch (see test below). + """ + recorded = {} + + @staticmethod + def get_priors(data=None, presplit=None): + _LnCfu0ModuleWithPresplit.recorded["priors_data"] = data + _LnCfu0ModuleWithPresplit.recorded["priors_presplit"] = presplit + return {} + + @staticmethod + def get_guesses(name, data, presplit=None): + _LnCfu0ModuleWithPresplit.recorded["guesses_data"] = data + _LnCfu0ModuleWithPresplit.recorded["guesses_presplit"] = presplit + return {} + + define_model = MagicMock() + guide = MagicMock() + + +def test_initialize_classes_forwards_presplit_to_declaring_component(mocker): + """ + _initialize_classes must forward self._data.presplit to a component's + get_priors/get_guesses only when its signature declares a `presplit` + parameter -- currently just the ln_cfu0 component. Components that + don't declare it (everything else, here plain MagicMocks) are + unaffected and keep working exactly as before. + """ + mock_growth_tm = create_mock_tm(is_growth=True) + mock_binding_tm = create_mock_tm(is_growth=False) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_growth_tm", return_value=mock_growth_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_binding_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_binding_tm", return_value=mock_binding_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._setup_batching", return_value={"batch_idx": jnp.array([0]), "batch_size": 1, "scale_vector": jnp.array([1.0]), "num_binding": 0}) + + fake_data = MagicMock() + fake_data.presplit = "PRESPLIT_SENTINEL" + mocker.patch("tfscreen.tfmodel.model_orchestrator.populate_dataclass", return_value=fake_data) + + _LnCfu0ModuleWithPresplit.recorded.clear() + + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", { + "condition_growth": {"independent": MagicMock()}, + "growth_transition": {"instant": MagicMock()}, + "ln_cfu0": {"hierarchical": _LnCfu0ModuleWithPresplit}, + "dk_geno": {"hierarchical_geno": MagicMock()}, + "activity": {"hierarchical_geno": MagicMock()}, + "theta": {"categorical_geno": MagicMock()}, + "transformation": {"logit_norm": MagicMock()}, + "theta_rescale": {"passthrough": MagicMock()}, + "theta_growth_noise": {"zero": MagicMock()}, + "theta_binding_noise": {"zero": MagicMock()}, + "growth_noise": {"zero": MagicMock()}, + "sample_offset": {"zero": MagicMock()}, + "observe_binding": MagicMock(), + "observe_growth": MagicMock(), + }, clear=True): + for k in ["condition_growth", "growth_transition", "dk_geno", "activity", + "theta", "transformation", "theta_growth_noise", + "theta_binding_noise", "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + mod = tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k] + mod.get_priors.return_value = {} + mod.get_guesses.return_value = {} + + ModelOrchestrator( + "g.csv", "b.csv", + theta="categorical_geno", transformation="logit_norm", + condition_growth="independent", growth_transition="instant", + ln_cfu0="hierarchical", activity="hierarchical_geno", + theta_growth_noise="zero", + ) + + # presplit forwarded to the component that declares it... + assert _LnCfu0ModuleWithPresplit.recorded["priors_presplit"] == "PRESPLIT_SENTINEL" + assert _LnCfu0ModuleWithPresplit.recorded["guesses_presplit"] == "PRESPLIT_SENTINEL" + # ...alongside the usual `data` kwarg, unaffected by the new plumbing. + assert _LnCfu0ModuleWithPresplit.recorded["priors_data"] is fake_data.growth + assert _LnCfu0ModuleWithPresplit.recorded["guesses_data"] is fake_data.growth + + # --------------------------------------------------------------------------- # dk_geno="pinned" wiring # --------------------------------------------------------------------------- From 7e083271b120df6c236ecbccfc9b05d10317f297 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 11:02:29 -0700 Subject: [PATCH 08/30] added k_ref fitting input --- CLAUDE.md | 13 +- reports/flake.txt | 656 +++++++++--------- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/base_growth_data.py | 133 ++++ src/tfscreen/simulate/scripts/simulate_cli.py | 12 +- src/tfscreen/tfmodel/analysis/extraction.py | 14 + src/tfscreen/tfmodel/data_class.py | 49 ++ src/tfscreen/tfmodel/generative/model.py | 47 ++ src/tfscreen/tfmodel/model_orchestrator.py | 188 ++++- .../simulate/test_base_growth_data.py | 119 ++++ tests/tfscreen/simulate/test_simulate_cli.py | 56 ++ .../analysis/test_extraction_robustness.py | 26 + tests/tfscreen/tfmodel/test_base_growth.py | 165 +++++ tests/tfscreen/tfmodel/test_data_class.py | 96 +++ .../tfmodel/test_model_orchestrator.py | 290 +++++++- 15 files changed, 1539 insertions(+), 327 deletions(-) create mode 100644 src/tfscreen/simulate/base_growth_data.py create mode 100644 tests/tfscreen/simulate/test_base_growth_data.py create mode 100644 tests/tfscreen/tfmodel/test_base_growth.py diff --git a/CLAUDE.md b/CLAUDE.md index 7de9cf8f..91457418 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -181,6 +181,15 @@ The optional `binding_data` YAML block configures calibration genotypes for whic - For `hill_mut`: the function `build_theta_gc_override_hill_mut` assembles theta for **all library genotypes** (not just the measured ones) by additively combining per-mutation logit-space deltas. The WT reference is taken from `SimPriors` defaults. Multi-mutant genotypes not directly measured in the CSV are assembled from single-mutant deltas; directly-measured multi-mutants use their CSV values directly. - Measured genotypes override any earlier simulated-path values in `theta_gc_override`. +### Base growth-rate calibration data + +The optional `base_growth_data` YAML block generates a simulated `base_growth_df`: direct reference-condition growth-rate "measurements" for a subset of genotypes, mirroring the inference-side `base_growth_df` input (see `tfmodel/model_orchestrator.py::_read_base_growth_df` and `generative/model.py`'s `base_growth_obs` block, which anchor `condition_growth`'s k/m against dk_geno's hierarchical hyperparameters to resolve an identifiability confound). + +- Generation lives in `simulate/base_growth_data.py::generate_base_growth_df`, called from `simulate/scripts/simulate_cli.py` (not `library_prediction.py`) since it only needs `parameters_df`, not the theta/growth machinery. +- Config: `k_ref` (required, the reference wt growth rate) plus optional `genotypes` (default `["wt"]`), `rates` (per-genotype true-rate override), and `noise`. +- Every requested genotype must already exist in `parameters_df` — `dk_geno` is looked up from the value already assigned during the normal per-library draw (`_assign_dk_geno` in `thermo_to_growth.py`), never redrawn. This mirrors the inference-side requirement that `base_growth_df` genotypes already exist in `growth_df`. +- `rate_true = k_ref + dk_geno[genotype]` unless overridden via `rates`; the observed `rate` adds Gaussian noise (sigma = `noise`), and `rate_std` is reported as that same flat `noise` value for every row (matching the `binding_data.noise` → `theta_std` convention). + ### theta_gc_override and theta_params_override These two dicts are the mechanism by which binding data is "pinned" into the growth simulation. @@ -204,11 +213,13 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/library_prediction.py` | Top-level orchestrator; assembles override dicts and calls `thermo_to_growth` | | `simulate/thermo_to_growth.py` | Prior-predictive sampling, theta injection, growth calculation, parameters_df assembly | | `simulate/binding_params.py` | CSV reading (with theta clipping), per-component override builders, binding theta assemblers | +| `simulate/base_growth_data.py` | Generates simulated direct growth-rate calibration data (`base_growth_data` YAML block) | | `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` | +| `simulate/scripts/simulate_cli.py` | `tfs-simulate` CLI entry point; runs `library_prediction` + `selection_experiment` across replicates and writes all output CSVs, including the optional `binding_data`/`presplit_data`/`base_growth_data` blocks | +| `simulate/run_simulation.py` | Simpler, non-CLI orchestrator (`run_simulation`); does not support `binding_data`/`presplit_data`/`base_growth_data` | ## YAML Standards diff --git a/reports/flake.txt b/reports/flake.txt index 76d216f3..aa155d34 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1290,25 +1290,26 @@ ./src/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./src/tfscreen/simulate/scripts/simulate_cli.py:119:15: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:120:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:121:16: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:120:15: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:121:17: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator -./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: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 -./src/tfscreen/simulate/scripts/simulate_cli.py:167:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:170:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:171:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:172:16: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:175:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:177:25: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:179:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:193:19: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:123:16: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:127:20: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:128:22: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:129:21: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:148:48: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/scripts/simulate_cli.py:149:14: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:150:16: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:155:17: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:168:19: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:171:19: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:172:17: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:173:16: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:176:17: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:178:25: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:180:19: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:194:19: E221 multiple spaces before operator +./src/tfscreen/simulate/scripts/simulate_cli.py:211:1: C901 'run_simulation_from_config' is too complex (12) ./src/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' @@ -1476,16 +1477,16 @@ ./src/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/analysis/extraction.py:85:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/analysis/extraction.py:103:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/extraction.py:182:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/extraction.py:260:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/extraction.py:261:29: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/analysis/extraction.py:262:29: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/analysis/extraction.py:317:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/analysis/extraction.py:369:1: C901 'extract_growth_predictions' is too complex (11) -./src/tfscreen/tfmodel/analysis/extraction.py:468:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/analysis/extraction.py:487:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/analysis/extraction.py:489:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/analysis/extraction.py:490:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/analysis/extraction.py:196:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/extraction.py:274:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/extraction.py:275:29: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/analysis/extraction.py:276:29: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/analysis/extraction.py:331:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/analysis/extraction.py:383:1: C901 'extract_growth_predictions' is too complex (11) +./src/tfscreen/tfmodel/analysis/extraction.py:482:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/analysis/extraction.py:501:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/analysis/extraction.py:503:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/analysis/extraction.py:504:16: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:41:15: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator @@ -1540,9 +1541,9 @@ ./src/tfscreen/tfmodel/data_class.py:116:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/data_class.py:133:49: W291 trailing whitespace ./src/tfscreen/tfmodel/data_class.py:135:76: W291 trailing whitespace -./src/tfscreen/tfmodel/data_class.py:226:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/data_class.py:233:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/data_class.py:234:5: E266 too many leading '#' for block comment +./src/tfscreen/tfmodel/data_class.py:275:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/data_class.py:282:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/data_class.py:283:5: E266 too many leading '#' for block comment ./src/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 @@ -3213,14 +3214,14 @@ ./src/tfscreen/tfmodel/generative/model.py:105:37: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/generative/model.py:106:24: F541 f-string is missing placeholders ./src/tfscreen/tfmodel/generative/model.py:106:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:135:36: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:136:24: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:136:44: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/model.py:232:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/model.py:233:19: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/model.py:276:28: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:277:28: F541 f-string is missing placeholders -./src/tfscreen/tfmodel/generative/model.py:283:1: W391 blank line at end of file +./src/tfscreen/tfmodel/generative/model.py:161:36: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:162:24: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:162:44: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/generative/model.py:258:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/model.py:259:19: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/model.py:323:28: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:324:28: F541 f-string is missing placeholders +./src/tfscreen/tfmodel/generative/model.py:330:1: W391 blank line at end of file ./src/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' @@ -3348,236 +3349,240 @@ ./src/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) ./src/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/inference/run_inference.py:718:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:720:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/inference/run_inference.py:720:37: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:720:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:753:31: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:765:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:766:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:773:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/inference/run_inference.py:773:31: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:773:41: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:787:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:788:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:789:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:790:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:791:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/inference/run_inference.py:798:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:799:31: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:881:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:895:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:898:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:899:49: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:908:36: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:915:27: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:915:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:917:61: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:966:5: E303 too many blank lines (4) -./src/tfscreen/tfmodel/inference/run_inference.py:1007:26: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1007:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1010:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1022:41: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1024:32: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1024:42: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1075:5: C901 'RunInference.get_map_posteriors' is too complex (13) -./src/tfscreen/tfmodel/inference/run_inference.py:1313:50: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/inference/run_inference.py:1354:29: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1357:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:703:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:705:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/inference/run_inference.py:705:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:705:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:738:31: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:750:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:751:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:758:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/inference/run_inference.py:758:31: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:758:41: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:772:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:773:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:774:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:775:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:776:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/inference/run_inference.py:783:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:784:31: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:866:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:880:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:883:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:884:49: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:893:36: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:900:27: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:900:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:902:61: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:951:5: E303 too many blank lines (4) +./src/tfscreen/tfmodel/inference/run_inference.py:992:26: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:992:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:995:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1007:41: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1009:32: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1009:42: W291 trailing whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1060:5: C901 'RunInference.get_map_posteriors' is too complex (13) +./src/tfscreen/tfmodel/inference/run_inference.py:1298:50: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/inference/run_inference.py:1339:29: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1342:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1347:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1355:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/inference/run_inference.py:1359:30: W291 trailing whitespace ./src/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1370:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/inference/run_inference.py:1374:30: W291 trailing whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1377:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1381:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/inference/run_inference.py:1387:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:37:1: E303 too many blank lines (3) -./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: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: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/inference/run_inference.py:1366:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/inference/run_inference.py:1372:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:39:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/model_orchestrator.py:73:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:76:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:80:25: E222 multiple spaces after operator +./src/tfscreen/tfmodel/model_orchestrator.py:80:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:80:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:81:42: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:85:65: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:85:88: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:105:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:105:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:105:55: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:105:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:106:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:120:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:124:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:125:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:127:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:210:58: 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:334:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/model_orchestrator.py:366:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:367:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:368:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:370:23: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:371:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:372:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:376:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:455:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:520:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:523:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:528:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:529:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:536:30: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:540:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:636:82: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:641:87: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:644:84: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:649:79: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:750:5: C901 'ModelOrchestrator._initialize_data' is too complex (18) -./src/tfscreen/tfmodel/model_orchestrator.py:750:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:775:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:776:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:778:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:779:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:779:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:779:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:780:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:780:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:781:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:785:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:786:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:791:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:798:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:800:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:800:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:802:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:805:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:807:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:809:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:821:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:829:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:851:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:852:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:852:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:853:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:853:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:854:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:854:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:855:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:855:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:857:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:864:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:884:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:884:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:884:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:891:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:937:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:938:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:939:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:940:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:980:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:983:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:984:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:985:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:989:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:990:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:991:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:992:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:994:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1005:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1005:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1008:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1009:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1014:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1015:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1016:58: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1018:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1023:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1027:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1031:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1034:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1040:86: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1042:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1049:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1105:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1106:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1107:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1108:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1115:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1116:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1117:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1193:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1194:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1196:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1269:5: C901 'ModelOrchestrator._initialize_classes' is too complex (20) -./src/tfscreen/tfmodel/model_orchestrator.py:1289:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1291:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1292:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1294:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1295:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1296:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1297:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1314:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1315:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1397:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1400:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1421:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1423:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1476:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1481:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1495:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1505:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1515:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1529:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1532:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1561:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1573:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1585:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1591:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1592:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1593:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1594:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1595:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1596:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1597:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1598:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1599:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1600:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1601:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1602:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1603:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1604:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1605:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1606:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:213:73: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:215:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:216:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:217:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:218:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:219:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:221:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:222:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:223:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:224:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:227:63: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:228:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:229:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:239:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:244:42: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:244:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:244:68: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:245:29: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:246:40: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:247:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:247:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:247:72: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:288:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:297:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:297:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:298:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:301:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:307:27: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:336:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:368:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:369:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:370:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:372:23: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:373:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:374:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:378:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:457:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:537:66: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:673:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:676:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:681:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:682:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:689:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:693:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:789:82: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:794:87: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:797:84: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:802:79: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:905:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) +./src/tfscreen/tfmodel/model_orchestrator.py:905:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:931:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:933:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:934:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:934:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:934:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:935:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:935:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:936:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:940:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:941:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:946:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:953:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:955:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:955:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:957:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:960:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:962:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:964:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:976:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:984:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1006:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1007:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1007:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1008:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1008:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1009:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1009:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1010:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1010:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1012:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1019:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1039:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1039:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1039:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1046:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1092:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1093:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1094:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1095:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1135:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1138:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1139:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1140:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1144:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1145:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1146:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1147:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1149:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1160:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1160:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1163:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1164:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1169:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1170:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1171:58: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1173:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1178:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1182:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1186:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1189:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1195:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1197:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1204:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1265:57: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1274:25: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1284:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1285:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1286:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1287:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1288:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1295:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1296:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1297:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1373:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1374:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1376:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1449:5: C901 'ModelOrchestrator._initialize_classes' is too complex (21) +./src/tfscreen/tfmodel/model_orchestrator.py:1469:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1471:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1472:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1474:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1475:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1476:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1477:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1494:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1495:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1496:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1577:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1580:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1601:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1603:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1662:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1667:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1681:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1691:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1701:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1715:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1718:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1747:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1759:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1771:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1777:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1778:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1779:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1780:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1781:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1782:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1783:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1784:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1785:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1786:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1787:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1788:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1789:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1790:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1791:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1792: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 @@ -5348,8 +5353,7 @@ ./tests/tfscreen/simulate/test_selection_experiment.py:1269:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1272:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1313:27: W292 no newline at end of file -./tests/tfscreen/simulate/test_simulate_cli.py:3:1: F401 'os' imported but unused -./tests/tfscreen/simulate/test_simulate_cli.py:247:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused +./tests/tfscreen/simulate/test_simulate_cli.py:303:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused ./tests/tfscreen/simulate/test_thermo_to_growth.py:28:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:32:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:41:1: E302 expected 2 blank lines, found 1 @@ -5454,26 +5458,25 @@ ./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_extraction_robustness.py:208:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:232:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:235:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:241:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:250:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:294:5: F841 local variable 'first_param' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:296:5: F841 local variable 'param_name' is assigned to but never used +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:308:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:311:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:314:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:320:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:325:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:338:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:342:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:361:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:401:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:407:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:414:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py:417: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 @@ -6959,34 +6962,33 @@ ./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:185:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:425:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:429:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:434:5: E722 do not use bare 'except' -./tests/tfscreen/tfmodel/inference/test_run_inference.py:436:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:421:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:426:5: E722 do not use bare 'except' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:428:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:431: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: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:442: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:449:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:441:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:443:1: E302 expected 2 blank lines, found 1 ./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:459:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:500:32: E741 ambiguous variable name 'l' -./tests/tfscreen/tfmodel/inference/test_run_inference.py:602:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:605:5: F841 local variable 'mock_seed' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_run_inference.py:492:32: E741 ambiguous variable name 'l' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:594:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:597:5: F841 local variable 'mock_seed' is assigned to but never used +./tests/tfscreen/tfmodel/inference/test_run_inference.py:598:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/inference/test_run_inference.py:606:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:614:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:619:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:623:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:611:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:615:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:619:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:623:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/inference/test_run_inference.py:627:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:631:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:635:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:638:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/inference/test_run_inference.py:646:1: E303 too many blank lines (3) -./tests/tfscreen/tfmodel/inference/test_run_inference.py:655:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:662:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:735:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/inference/test_run_inference.py:1118:25: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/inference/test_run_inference.py:1118:26: E201 whitespace after '[' -./tests/tfscreen/tfmodel/inference/test_run_inference.py:1119:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:630:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/inference/test_run_inference.py:638:1: E303 too many blank lines (3) +./tests/tfscreen/tfmodel/inference/test_run_inference.py:647:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:654:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:727:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1110:25: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1110:26: E201 whitespace after '[' +./tests/tfscreen/tfmodel/inference/test_run_inference.py:1111: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 @@ -7243,6 +7245,16 @@ ./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_base_growth.py:14:1: F401 'jax.numpy as jnp' imported but unused +./tests/tfscreen/tfmodel/test_base_growth.py:15:1: F401 'numpyro' imported but unused +./tests/tfscreen/tfmodel/test_base_growth.py:74:51: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:106:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:107:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:120:56: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:131:59: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:132:59: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:145:64: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:146:64: E127 continuation line over-indented for visual indent ./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 @@ -7337,7 +7349,7 @@ ./tests/tfscreen/tfmodel/test_model_orchestrator.py:1253:9: F401 'inspect' imported but unused ./tests/tfscreen/tfmodel/test_model_orchestrator.py:1650:34: E261 at least two spaces before inline comment ./tests/tfscreen/tfmodel/test_model_orchestrator.py:1894:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1901:10: W292 no newline at end of file +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1908:1: E302 expected 2 blank lines, found 1 ./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 @@ -7640,7 +7652,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 -47 C901 'cat_fit' is too complex (19) +48 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) @@ -7648,8 +7660,8 @@ 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 -195 E127 continuation line over-indented for visual indent -86 E128 continuation line under-indented for visual indent +205 E127 continuation line over-indented for visual indent +87 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' 28 E202 whitespace before ']' @@ -7658,7 +7670,7 @@ 1841 E221 multiple spaces before operator 26 E222 multiple spaces after operator 8 E225 missing whitespace around operator -1104 E231 missing whitespace after ',' +1105 E231 missing whitespace after ',' 103 E251 unexpected spaces around keyword / parameter equals 14 E252 missing whitespace around parameter equals 216 E261 at least two spaces before inline comment @@ -7667,7 +7679,7 @@ 2 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword 1 E301 expected 1 blank line, found 0 -783 E302 expected 2 blank lines, found 1 +782 E302 expected 2 blank lines, found 1 50 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 @@ -7680,12 +7692,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 +232 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 42 F841 local variable 'e' is assigned to but never used 629 W291 trailing whitespace -86 W292 no newline at end of file +85 W292 no newline at end of file 1606 W293 blank line contains whitespace 30 W391 blank line at end of file -7642 +7654 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 5eea9554..90cb634f 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/simulate/base_growth_data.py b/src/tfscreen/simulate/base_growth_data.py new file mode 100644 index 00000000..76787281 --- /dev/null +++ b/src/tfscreen/simulate/base_growth_data.py @@ -0,0 +1,133 @@ +""" +Generate simulated direct growth-rate calibration data (base_growth_data). + +This mirrors the inference-side ``base_growth_df`` input: a direct, +reference-condition growth-rate observation for a subset of genotypes, tied +to a shared reference rate (``k_ref``) and the existing per-genotype +``dk_geno`` value. It exists to give the hierarchical tfmodel inference a +direct anchor for wt's growth rate, resolving an identifiability confound +between condition_growth's k/m and dk_geno's hierarchical hyperparameters +(see model_orchestrator._read_base_growth_df / generative/model.py's +base_growth_obs block). + +Every genotype requested here must already be part of the simulated library +(i.e. present in ``parameters_df``) -- dk_geno is looked up from the value +already assigned during ``library_prediction``, never redrawn. +""" + +import pandas as pd + +from tfscreen.genetics import standardize_genotypes + + +def generate_base_growth_df(base_growth_cfg, parameters_df, rng): + """ + Generate a simulated base_growth_df. + + For each requested genotype (wt is always included), the true growth + rate is: + + rate_true = k_ref + dk_geno[genotype] + + unless overridden by an explicit value in ``base_growth_cfg["rates"]``, + in which case ``rate_true`` is that override. Gaussian noise (sigma = + ``noise``) is added to produce the observed ``rate``; ``rate_std`` is + reported as ``noise`` for every row, matching the + ``binding_data.noise`` -> ``theta_std`` convention used elsewhere in + this module. + + Parameters + ---------- + base_growth_cfg : dict + The 'base_growth_data' sub-dict from the config. Must contain: + k_ref : float + Reference (wt) growth rate, hr^-1. + May contain: + genotypes : list of str, default ["wt"] + Genotypes to include. 'wt' is always force-included even if + omitted. + rates : dict[str, float], optional + Explicit true-rate override for specific genotypes, bypassing + the k_ref + dk_geno calculation for that genotype. Every key + must also appear in (the resolved) ``genotypes``. + noise : float, default 0.0 + Sigma of the Gaussian noise added to the true rate to produce + the observed rate. + parameters_df : pandas.DataFrame + Output of library_prediction; must contain 'genotype' and 'dk_geno' + columns, one row per unique library genotype. + rng : numpy.random.Generator + Shared random-number generator for the noise draws. + + Returns + ------- + pandas.DataFrame + Columns: genotype, rate, rate_std, rate_true. ``rate_true`` is the + noise-free ground truth, included for validation (analogous to + presplit's ``ln_cfu_0_true``). + + Raises + ------ + ValueError + If 'k_ref' is missing from ``base_growth_cfg``, if any requested + genotype is not present in ``parameters_df``, or if ``rates`` + contains a genotype not in the resolved ``genotypes`` list. + """ + if "k_ref" not in base_growth_cfg: + raise ValueError( + "base_growth_data config must specify 'k_ref' (the reference " + "wt growth rate, hr^-1)." + ) + k_ref = float(base_growth_cfg["k_ref"]) + noise = float(base_growth_cfg.get("noise", 0.0)) + + raw_genotypes = list(base_growth_cfg.get("genotypes", ["wt"])) + genotypes = list(standardize_genotypes(raw_genotypes)) + if "wt" not in genotypes: + genotypes = ["wt"] + genotypes + + raw_rates = base_growth_cfg.get("rates", {}) + if raw_rates: + override_genotypes = standardize_genotypes(list(raw_rates.keys())) + rate_overrides = dict(zip(override_genotypes, raw_rates.values())) + else: + rate_overrides = {} + + library_genotypes = set(parameters_df["genotype"]) + missing = [g for g in genotypes if g not in library_genotypes] + if missing: + raise ValueError( + f"base_growth_data.genotypes {missing} not found in the " + "simulated library. Every genotype listed must already be part " + "of the library (see tile_combos / library_mixture)." + ) + + unrecognized_rate_keys = [g for g in rate_overrides if g not in genotypes] + if unrecognized_rate_keys: + raise ValueError( + f"base_growth_data.rates key(s) {unrecognized_rate_keys} are " + "not in base_growth_data.genotypes." + ) + + dk_geno_lookup = parameters_df.set_index("genotype")["dk_geno"] + + rows = [] + for g in genotypes: + if g in rate_overrides: + rate_true = float(rate_overrides[g]) + else: + rate_true = k_ref + float(dk_geno_lookup[g]) + + if noise > 0: + rate_obs = float(rate_true + rng.normal(0.0, noise)) + else: + rate_obs = rate_true + + rows.append({ + "genotype": g, + "rate": rate_obs, + "rate_std": noise, + "rate_true": rate_true, + }) + + return pd.DataFrame(rows) diff --git a/src/tfscreen/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index c029d7a9..ba72f5be 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -6,6 +6,7 @@ import tfscreen from tfscreen.simulate import library_prediction, selection_experiment from tfscreen.simulate.selection_experiment import _sim_index_hop +from tfscreen.simulate.base_growth_data import generate_base_growth_df from tfscreen.genetics import standardize_genotypes from tfscreen.process_raw import counts_to_lncfu from tfscreen.util.cli.generalized_main import generalized_main @@ -222,7 +223,9 @@ def run_simulation_from_config( selection_experiment. Writes library, parameters, genotype_theta (long-form: genotype/titrant_name/titrant_conc/theta), and analysis-ready growth CSV files. If the config contains a 'binding_data' block, also writes a - simulated binding curve CSV. + simulated binding curve CSV. If it contains a 'base_growth_data' block, + also writes a simulated direct growth-rate calibration CSV (see + tfscreen.simulate.base_growth_data.generate_base_growth_df). Parameters ---------- @@ -253,6 +256,8 @@ def out_path(name): output_names.append("binding") if "presplit_data" in cf: output_names.append("presplit") + if "base_growth_data" in cf: + output_names.append("base_growth") existing = [out_path(n) for n in output_names if os.path.exists(out_path(n))] if os.path.exists(config_out): @@ -328,6 +333,11 @@ def out_path(name): binding_df.to_csv(out_path("binding"), index=False) print(f"Wrote: {out_path('binding')}") + if "base_growth_data" in cf: + base_growth_df = generate_base_growth_df(cf["base_growth_data"], parameters_df, rng) + base_growth_df.to_csv(out_path("base_growth"), index=False) + print(f"Wrote: {out_path('base_growth')}") + if "presplit_data" in cf: print("\nGenerating presplit data...", flush=True) presplit_df = _generate_presplit_data(combined_sample_df, diff --git a/src/tfscreen/tfmodel/analysis/extraction.py b/src/tfscreen/tfmodel/analysis/extraction.py index 220dcf08..4f20aa83 100644 --- a/src/tfscreen/tfmodel/analysis/extraction.py +++ b/src/tfscreen/tfmodel/analysis/extraction.py @@ -160,6 +160,20 @@ def extract_parameters(orchestrator, posteriors, q_to_get=None): if module is not None and hasattr(module, "get_extract_specs"): extract.extend(module.get_extract_specs(ctx)) + # base_growth is not a swappable registry component (see + # model_orchestrator._read_base_growth_df / generative/model.py's + # base_growth_obs block), so its single global k_ref scalar is extracted + # here directly rather than via a component's get_extract_specs. + if getattr(orchestrator, "_base_growth_df", None) is not None: + k_ref_df = pd.DataFrame({"parameter": ["k_ref"], "map_all": [0]}) + extract.append(dict( + input_df=k_ref_df, + params_to_get=["k_ref"], + map_column="map_all", + get_columns=["parameter"], + in_run_prefix="base_growth_", + )) + params = {} for kwargs in extract: try: diff --git a/src/tfscreen/tfmodel/data_class.py b/src/tfscreen/tfmodel/data_class.py index 5b6f8d36..b818c14e 100644 --- a/src/tfscreen/tfmodel/data_class.py +++ b/src/tfscreen/tfmodel/data_class.py @@ -188,6 +188,38 @@ class PreSplitData: num_genotype: int = field(pytree_node=False) +@dataclass(frozen=True) +class BaseGrowthData: + """ + Holds the optional base (reference-condition) growth-rate observations + used to directly constrain dk_geno for a subset of genotypes. + + Unlike growth/binding, this measurement is taken independent of the + titrant/selection system entirely -- it is a direct read of "how fast + does this genotype grow" in whatever reference condition/medium the + measurement was made in, used to anchor a new global scalar (k_ref) and + tie it, via the existing per-genotype dk_geno latent, to genotypes with + directly-measured growth rates. See generative/model.py's + base_growth_obs block. + + Tensors are shaped ``(num_genotype,)`` using the same genotype ordering + as the companion GrowthData, so that slicing with + ``data.growth.batch_idx`` aligns the genotype axis -- the same pattern + PreSplitData uses. Genotypes with no measurement (or multiple raw + measurements collapsed via inverse-variance weighting during + construction -- see model_orchestrator._read_base_growth_df) have + good_mask == False and are excluded from the likelihood. + """ + + # Data tensors + rate_obs: jnp.ndarray + rate_std: jnp.ndarray + good_mask: jnp.ndarray + + # Tensor dimension (aligned with GrowthData) + num_genotype: int = field(pytree_node=False) + + @dataclass(frozen=True) class DataClass: """ @@ -209,6 +241,8 @@ class DataClass: binding: BindingData = field(default=None) # Optional pre-split observations (t = -t_pre aliquot before condition split). presplit: Any = field(default=None) + # Optional direct growth-rate measurements used to constrain dk_geno. + base_growth: Any = field(default=None) @dataclass(frozen=True) @@ -222,6 +256,21 @@ class GrowthPriors: theta_growth_noise: Any growth_noise: Any sample_offset: Any + # Prior (loc, scale) for the optional base_growth k_ref scalar; None when + # base_growth_df was not supplied (see BaseGrowthPriors). + base_growth: Any = field(default=None) + + +@dataclass(frozen=True) +class BaseGrowthPriors: + """ + Prior for the optional k_ref scalar (see BaseGrowthData / model.py's + base_growth_obs block). k_ref_loc is derived empirically from wt's row + in base_growth_df (dk_geno_wt == 0 makes wt's own measurement a direct + read of k_ref) -- see model_orchestrator._derive_k_ref_guess. + """ + k_ref_loc: float + k_ref_scale: float @dataclass(frozen=True) class BindingPriors: diff --git a/src/tfscreen/tfmodel/generative/model.py b/src/tfscreen/tfmodel/generative/model.py index 820649e1..039f394b 100644 --- a/src/tfscreen/tfmodel/generative/model.py +++ b/src/tfscreen/tfmodel/generative/model.py @@ -126,6 +126,32 @@ def jax_model(data: DataClass, data.growth, priors.growth.dk_geno) + # Optional base_growth calibration: a shared k_ref scalar tying dk_geno + # to direct growth-rate measurements for a subset of genotypes (wt at + # minimum) -- see data_class.BaseGrowthData and + # model_orchestrator._read_base_growth_df. Sampled unconditionally (both + # is_guide branches) so the guide registers the site; the actual + # likelihood (base_growth_obs, below) only fires in the non-guide branch. + if getattr(data, "base_growth", None) is not None: + if is_guide: + k_ref_loc = pyro.param( + "base_growth_k_ref_loc", + jnp.array(priors.growth.base_growth.k_ref_loc), + ) + k_ref_scale = pyro.param( + "base_growth_k_ref_scale", + jnp.array(priors.growth.base_growth.k_ref_scale), + constraint=dist.constraints.greater_than(1e-4), + ) + k_ref = pyro.sample("base_growth_k_ref", + dist.Normal(k_ref_loc, k_ref_scale)) + else: + k_ref = pyro.sample( + "base_growth_k_ref", + dist.Normal(priors.growth.base_growth.k_ref_loc, + priors.growth.base_growth.k_ref_scale), + ) + # activity activity = activity_model("activity", data.growth, @@ -247,6 +273,27 @@ def jax_model(data: DataClass, obs=obs_t0, ) + # Direct growth-rate measurements — anchors k_ref (and, via dk_geno's + # wt=0 pin, the shared k/m identifiability slack) to genotypes with + # a directly-measured reference-condition growth rate. + # dk_geno shape: (1,1,1,1,1,1,batch_size) -> flatten to (batch_size,). + if getattr(data, "base_growth", None) is not None: + bg = data.base_growth + bi = data.growth.batch_idx + rate_obs = bg.rate_obs[bi] + rate_std = bg.rate_std[bi] + mask = bg.good_mask[bi] + dk_geno_flat = dk_geno[0, 0, 0, 0, 0, 0, :] + with pyro.plate("shared_genotype_plate", + size=data.growth.batch_size, dim=-1): + with pyro.handlers.scale(scale=data.growth.scale_vector): + with pyro.handlers.mask(mask=mask): + pyro.sample( + "base_growth_obs", + dist.Normal(k_ref + dk_geno_flat, rate_std), + obs=rate_obs, + ) + # calculate observable (all tensors have correct dimensions) g_pre, g_sel = calculate_growth(params=growth_params, dk_geno=dk_geno, diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 808374c2..6b01b24d 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -13,8 +13,10 @@ BindingData, GrowthData, PreSplitData, + BaseGrowthData, PriorsClass, GrowthPriors, + BaseGrowthPriors, BindingPriors ) @@ -486,6 +488,157 @@ def _build_presplit_tm(presplit_df, growth_tm): return presplit_tm +# Weakly-informative default scale for k_ref's prior -- centred on the +# empirical guess (see _derive_k_ref_guess), wide enough that a handful of +# base_growth_df measurements dominate it rather than the reverse. +_K_REF_PRIOR_SCALE = 0.02 + + +def _read_base_growth_df(base_growth_df, growth_df): + """ + Read and validate the optional base (reference-condition) growth-rate + DataFrame. + + Rows whose genotype does not appear in growth_df are dropped -- mirrors + _read_presplit_df's sync/drop behaviour exactly (checked against + growth_df only, not binding_df). Multiple rows for the same genotype + are combined via inverse-variance weighting into a single (rate, + rate_std) per genotype, so downstream code always sees at most one row + per genotype. + + wt must be present after filtering: dk_geno is fixed to 0 for wt by + every dk_geno component, which makes wt's own measurement a direct read + of the new k_ref parameter (see model.py's base_growth_obs block). Every + other genotype is optional -- base_growth_df may cover anywhere from + just wt up to the full library. + + Parameters + ---------- + base_growth_df : pd.DataFrame or str + DataFrame or path to file with base growth-rate data. Required + columns: ``genotype``, ``rate``, ``rate_std``. + growth_df : pd.DataFrame + The already-processed growth DataFrame (growth_tm.df). Used to + determine the valid set of genotypes. + + Returns + ------- + pd.DataFrame + One row per genotype, columns ``genotype``, ``rate``, ``rate_std``. + + Raises + ------ + ValueError + If required columns are missing, or if wt is not present after + filtering against growth_df. + """ + base_growth_df = tfscreen.util.io.read_dataframe(base_growth_df) + base_growth_df = tfscreen.genetics.set_categorical_genotype(base_growth_df, + standardize=True) + tfscreen.util.dataframe.check_columns( + base_growth_df, + required_columns=["genotype", "rate", "rate_std"], + ) + + growth_genotypes = set(growth_df["genotype"]) + mask = base_growth_df["genotype"].isin(growth_genotypes) + n_dropped = int((~mask).sum()) + n_dropped_genos = base_growth_df.loc[~mask, "genotype"].nunique() + base_growth_df = base_growth_df[mask].copy() + if n_dropped > 0: + print( + f"Syncing base_growth_df to growth_df: {n_dropped} row(s) for " + f"{n_dropped_genos} genotype(s) not found in growth_df will be dropped.", + flush=True, + ) + + if "wt" not in set(base_growth_df["genotype"].astype(str)): + raise ValueError( + "base_growth_df must include a measurement for 'wt' (after " + "filtering against growth_df). wt anchors the new k_ref " + "parameter, since dk_geno is fixed to 0 for wt by every " + "dk_geno component." + ) + + rows = [] + for genotype, group in base_growth_df.groupby("genotype", observed=True): + precision = 1.0 / (group["rate_std"].to_numpy(dtype=float) ** 2) + combined_precision = precision.sum() + combined_rate = float( + (group["rate"].to_numpy(dtype=float) * precision).sum() / combined_precision + ) + combined_std = float(np.sqrt(1.0 / combined_precision)) + rows.append({"genotype": str(genotype), "rate": combined_rate, + "rate_std": combined_std}) + + return pd.DataFrame(rows) + + +def _build_base_growth_arrays(base_growth_df, genotype_labels): + """ + Build dense (num_genotype,) rate_obs/rate_std/good_mask arrays from the + processed base_growth_df, ordered to match genotype_labels (the growth + TensorManager's genotype axis) -- the same pattern + dk_geno.pinned.build_dk_geno_values uses. + + Genotypes in genotype_labels with no base_growth_df entry get + good_mask=False and dummy (0.0, 1.0) rate/std values, which the + likelihood mask in model.py excludes. + + Parameters + ---------- + base_growth_df : pd.DataFrame + Output of _read_base_growth_df; at most one row per genotype. + genotype_labels : Sequence[str] + Genotype order used by the model's genotype axis (e.g. + growth_tm.tensor_dim_labels[-1]). + + Returns + ------- + dict + ``{"rate_obs": np.ndarray, "rate_std": np.ndarray, "good_mask": np.ndarray}``, + each shape ``(len(genotype_labels),)``. + """ + label_to_idx = {str(g): i for i, g in enumerate(genotype_labels)} + num_genotype = len(genotype_labels) + + rate_obs = np.zeros(num_genotype, dtype=float) + rate_std = np.ones(num_genotype, dtype=float) + good_mask = np.zeros(num_genotype, dtype=bool) + + for _, row in base_growth_df.iterrows(): + idx = label_to_idx[str(row["genotype"])] + rate_obs[idx] = row["rate"] + rate_std[idx] = row["rate_std"] + good_mask[idx] = True + + return {"rate_obs": rate_obs, "rate_std": rate_std, "good_mask": good_mask} + + +def _derive_k_ref_guess(base_growth_df): + """ + Empirically derive k_ref's initial guess (and prior location) from wt's + measured rate in base_growth_df. + + dk_geno is fixed to exactly 0 for wt by every dk_geno component, so wt's + own measurement is a direct, uncontaminated read of k_ref + (rate_obs_wt ~ Normal(k_ref + 0, rate_std_wt)). + + Parameters + ---------- + base_growth_df : pd.DataFrame + Output of _read_base_growth_df; must contain a 'wt' row (enforced + there). + + Returns + ------- + float + wt's measured rate. + """ + wt_row = base_growth_df[base_growth_df["genotype"].astype(str) == "wt"] + return float(wt_row["rate"].iloc[0]) + + def _setup_batching(growth_genotypes, binding_genotypes, batch_size): @@ -698,11 +851,13 @@ def __init__(self, epistasis=False, thermo_data=None, binding_weight=None, - presplit_df=None): + presplit_df=None, + base_growth_df=None): self._ln_cfu_df = growth_df self._binding_df = binding_df self._presplit_df = presplit_df + self._base_growth_df = base_growth_df self._batch_size = batch_size self._binding_only = binding_only @@ -1099,12 +1254,37 @@ def _initialize_data(self): self.presplit_tm = None presplit_dataclass = None + # --------------------------------------------------------------------- + # base_growth dataclass (optional) -- direct growth-rate measurements + # used to constrain dk_geno via a new k_ref scalar (see model.py's + # base_growth_obs block). + + self._k_ref_guess = None + if self._base_growth_df is not None: + self.base_growth_df = _read_base_growth_df(self._base_growth_df, + self.growth_tm.df) + genotype_labels = self.growth_tm.tensor_dim_labels[ + self.growth_tm.tensor_dim_names.index("genotype") + ] + bg_arrays = _build_base_growth_arrays(self.base_growth_df, + genotype_labels) + base_growth_dataclass = populate_dataclass( + BaseGrowthData, + sources=[bg_arrays, + {"num_genotype": self.growth_tm.tensor_shape[-1]}], + ) + self._k_ref_guess = _derive_k_ref_guess(self.base_growth_df) + else: + self.base_growth_df = None + base_growth_dataclass = None + # --------------------------------------------------------------------- # Populate DataClass source_data = [{"growth":growth_dataclass, "binding":binding_dataclass, "presplit":presplit_dataclass, + "base_growth":base_growth_dataclass, "num_genotype":self.growth_tm.tensor_shape[-1]}] source_data.append(full_batch_data) @@ -1465,6 +1645,12 @@ def _initialize_classes(self): sample_offset=None, ) else: + if self._base_growth_df is not None: + priors_class_kwargs["growth"]["base_growth"] = BaseGrowthPriors( + k_ref_loc=self._k_ref_guess, + k_ref_scale=_K_REF_PRIOR_SCALE, + ) + init_params["base_growth_k_ref"] = jnp.array(self._k_ref_guess) growth_priors = populate_dataclass(GrowthPriors, sources=priors_class_kwargs["growth"]) binding_priors = populate_dataclass(BindingPriors, diff --git a/tests/tfscreen/simulate/test_base_growth_data.py b/tests/tfscreen/simulate/test_base_growth_data.py new file mode 100644 index 00000000..96e35ba2 --- /dev/null +++ b/tests/tfscreen/simulate/test_base_growth_data.py @@ -0,0 +1,119 @@ +"""Tests for tfscreen.simulate.base_growth_data.generate_base_growth_df.""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.base_growth_data import generate_base_growth_df + + +def _params_df(): + return pd.DataFrame({ + "genotype": ["wt", "A47V", "K12R"], + "dk_geno": [0.0, -0.02, -0.05], + }) + + +def test_basic_construction_default_genotypes(): + """With no 'genotypes' key, only wt is included, at rate == k_ref.""" + cfg = {"k_ref": 0.025} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + + assert set(result["genotype"]) == {"wt"} + row = result.iloc[0] + assert row["rate"] == pytest.approx(0.025) + assert row["rate_true"] == pytest.approx(0.025) + assert row["rate_std"] == pytest.approx(0.0) + + +def test_multiple_genotypes_use_k_ref_plus_dk_geno(): + cfg = {"k_ref": 0.025, "genotypes": ["wt", "A47V", "K12R"]} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + + result = result.set_index("genotype") + assert result.loc["wt", "rate_true"] == pytest.approx(0.025) + assert result.loc["A47V", "rate_true"] == pytest.approx(0.025 - 0.02) + assert result.loc["K12R", "rate_true"] == pytest.approx(0.025 - 0.05) + + +def test_wt_force_included_when_omitted_from_genotypes(): + cfg = {"k_ref": 0.025, "genotypes": ["A47V"]} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + assert "wt" in set(result["genotype"]) + assert set(result["genotype"]) == {"wt", "A47V"} + + +def test_wt_case_insensitive_not_duplicated(): + """A user spelling 'WT' explicitly must not create a duplicate wt row.""" + cfg = {"k_ref": 0.025, "genotypes": ["WT", "A47V"]} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + assert list(result["genotype"]).count("wt") == 1 + + +def test_rate_override_bypasses_dk_geno(): + cfg = { + "k_ref": 0.025, + "genotypes": ["wt", "A47V"], + "rates": {"A47V": 0.018}, + } + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng).set_index("genotype") + assert result.loc["A47V", "rate_true"] == pytest.approx(0.018) + assert result.loc["wt", "rate_true"] == pytest.approx(0.025) + + +def test_missing_genotype_raises(): + # Q99W is validly-formatted but not one of the genotypes in the library. + cfg = {"k_ref": 0.025, "genotypes": ["wt", "Q99W"]} + rng = np.random.default_rng(0) + with pytest.raises(ValueError, match="not found in the simulated library"): + generate_base_growth_df(cfg, _params_df(), rng) + + +def test_missing_genotype_in_rates_but_valid_elsewhere_raises(): + """A genotype that IS in the library but was never listed in + base_growth_data.genotypes cannot be targeted via rates.""" + cfg = { + "k_ref": 0.025, + "genotypes": ["wt"], + "rates": {"K12R": 0.01}, # valid library genotype, but not requested + } + rng = np.random.default_rng(0) + with pytest.raises(ValueError, match="not in base_growth_data.genotypes"): + generate_base_growth_df(cfg, _params_df(), rng) + + +def test_missing_k_ref_raises(): + cfg = {"genotypes": ["wt"]} + rng = np.random.default_rng(0) + with pytest.raises(ValueError, match="k_ref"): + generate_base_growth_df(cfg, _params_df(), rng) + + +def test_noise_perturbs_rate_and_sets_rate_std(): + cfg = {"k_ref": 0.025, "genotypes": ["wt", "A47V"], "noise": 0.01} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + + assert (result["rate_std"] == 0.01).all() + # With noise > 0 and a seeded rng, observed rate should differ from truth. + assert not np.allclose(result["rate"], result["rate_true"]) + + +def test_zero_noise_rate_equals_rate_true(): + cfg = {"k_ref": 0.025, "genotypes": ["wt", "A47V"]} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + assert np.allclose(result["rate"], result["rate_true"]) + assert (result["rate_std"] == 0.0).all() + + +def test_output_columns(): + cfg = {"k_ref": 0.025} + rng = np.random.default_rng(0) + result = generate_base_growth_df(cfg, _params_df(), rng) + assert set(result.columns) >= {"genotype", "rate", "rate_std", "rate_true"} diff --git a/tests/tfscreen/simulate/test_simulate_cli.py b/tests/tfscreen/simulate/test_simulate_cli.py index c448de1f..06915886 100644 --- a/tests/tfscreen/simulate/test_simulate_cli.py +++ b/tests/tfscreen/simulate/test_simulate_cli.py @@ -155,6 +155,62 @@ def capture_csv(self_df, path, **kwargs): assert stem in written, f"Expected '{stem}' CSV to be written" +# --------------------------------------------------------------------------- +# base_growth_data: written only when configured, using parameters_df's dk_geno +# --------------------------------------------------------------------------- + +def test_base_growth_not_written_without_config(tmp_path): + """No base_growth CSV is written when 'base_growth_data' is absent.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written_paths = [] + + def capture_csv(self_df, path, **kwargs): + written_paths.append(str(path)) + + with patch("tfscreen.util.read_yaml", return_value={"seed": 0}), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + basenames = "\n".join(os.path.basename(p) for p in written_paths) + assert "base_growth" not in basenames + + +def test_base_growth_written_when_configured(tmp_path): + """A 'base_growth_data' block produces a base_growth CSV computed from + parameters_df's dk_geno column.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written = {} + + def capture_csv(self_df, path, **kwargs): + written[str(path)] = self_df.copy() + + cfg = {"seed": 0, "base_growth_data": {"k_ref": 0.025}} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + base_growth_paths = [p for p in written if "base_growth" in os.path.basename(p)] + assert len(base_growth_paths) == 1 + result = written[base_growth_paths[0]] + assert set(result["genotype"]) == {"wt"} + assert float(result.loc[result["genotype"] == "wt", "rate"].iloc[0]) == pytest.approx(0.025) + + # --------------------------------------------------------------------------- # _generate_binding_data: uses pre-computed theta from library_prediction # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py b/tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py index c3592876..f32ce2e5 100644 --- a/tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py +++ b/tests/tfscreen/tfmodel/analysis/test_extraction_robustness.py @@ -161,6 +161,32 @@ def test_extract_parameters_all_models(mock_model): params = extract_parameters(mock_model, posteriors) assert "hill_n" in params + +def test_extract_parameters_base_growth_k_ref(mock_model): + """ + base_growth's k_ref is a single global scalar, not a swappable registry + component, so it's extracted directly in extract_parameters (gated on + orchestrator._base_growth_df) rather than via get_extract_specs. + """ + mock_model._base_growth_df = pd.DataFrame({ + "genotype": ["wt"], "rate": [0.02], "rate_std": [0.001], + }) + posteriors = {"base_growth_k_ref": np.random.rand(10, 1)} + params = extract_parameters(mock_model, posteriors) + assert "k_ref" in params + assert len(params["k_ref"]) == 1 + + +def test_extract_parameters_no_base_growth_skips_k_ref(mock_model): + """Without base_growth_df, no k_ref extraction is attempted (and the + posterior file need not contain it).""" + mock_model._base_growth_df = None + posteriors = {"theta_theta": np.random.rand(10, 1)} + mock_model._theta = "categorical_geno" + params = extract_parameters(mock_model, posteriors) + assert "k_ref" not in params + + def test_extract_theta_curves_manual_genotype(mock_model): """Test extract_theta_curves with manual_titrant_df including genotype.""" mock_model._theta = "hill_geno" diff --git a/tests/tfscreen/tfmodel/test_base_growth.py b/tests/tfscreen/tfmodel/test_base_growth.py new file mode 100644 index 00000000..06105c53 --- /dev/null +++ b/tests/tfscreen/tfmodel/test_base_growth.py @@ -0,0 +1,165 @@ +""" +Tests for the optional base_growth (direct reference-condition growth-rate) +calibration path. + +Coverage: + - ModelOrchestrator: base_growth_df=None (no change), base_growth_df passed in + - jax_model: base_growth_obs / base_growth_k_ref sites fire (model and guide) + when data.base_growth is set, and are absent when it is not. +""" + +import pytest +import numpy as np +import pandas as pd +import jax.numpy as jnp +import numpyro +from numpyro.handlers import trace, seed + +from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator +from tfscreen.tfmodel.data_class import BaseGrowthData + + +# --------------------------------------------------------------------------- +# Shared fixtures +# --------------------------------------------------------------------------- + +@pytest.fixture +def minimal_growth_df(): + """Minimal growth DataFrame with three genotypes (including wt).""" + rows = [] + for rep in [1, 2]: + for geno in ["wt", "A1V", "A2V"]: + for t_sel in [60.0, 90.0]: + rows.append({ + "library": "lib", + "replicate": rep, + "condition_pre": "-kan", + "condition_sel": "+kan", + "titrant_name": "iptg", + "titrant_conc": 0.0, + "t_pre": 30.0, + "t_sel": t_sel, + "genotype": geno, + "ln_cfu": 10.0, + "ln_cfu_std": 0.5, + }) + return pd.DataFrame(rows) + + +@pytest.fixture +def minimal_binding_df(): + return pd.DataFrame({ + "genotype": ["wt", "A1V", "A2V"], + "titrant_name": ["iptg"] * 3, + "titrant_conc": [0.0] * 3, + "theta_obs": [0.5] * 3, + "theta_std": [0.1] * 3, + }) + + +@pytest.fixture +def minimal_base_growth_df(): + return pd.DataFrame({ + "genotype": ["wt", "A1V"], + "rate": [0.021, 0.018], + "rate_std": [0.001, 0.002], + }) + + +# --------------------------------------------------------------------------- +# ModelOrchestrator integration (light smoke test, no JAX tracing) +# --------------------------------------------------------------------------- + +def test_model_orchestrator_without_base_growth(minimal_growth_df, + minimal_binding_df): + """Passing base_growth_df=None leaves data.base_growth as None.""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=None) + assert orchestrator.data.base_growth is None + assert orchestrator.priors.growth.base_growth is None + + +def test_model_orchestrator_with_base_growth(minimal_growth_df, + minimal_binding_df, + minimal_base_growth_df): + """Passing base_growth_df populates data.base_growth as a BaseGrowthData + and priors.growth.base_growth with a k_ref prior derived from wt.""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=minimal_base_growth_df) + bg = orchestrator.data.base_growth + assert bg is not None + assert isinstance(bg, BaseGrowthData) + assert bg.num_genotype == 3 + assert bg.rate_obs.shape == (3,) + assert bg.good_mask.sum() == 2 + + base_growth_priors = orchestrator.priors.growth.base_growth + assert base_growth_priors is not None + assert base_growth_priors.k_ref_loc == pytest.approx(0.021) + + +# --------------------------------------------------------------------------- +# jax_model: base_growth_obs / base_growth_k_ref sites fire +# --------------------------------------------------------------------------- + +def test_jax_model_base_growth_sites_present(minimal_growth_df, + minimal_binding_df, + minimal_base_growth_df): + """base_growth_obs and base_growth_k_ref sample sites appear in the + model trace when data.base_growth is not None.""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=minimal_base_growth_df) + + model_fn = orchestrator.jax_model + tr = trace(seed(model_fn, 0)).get_trace(orchestrator.data, orchestrator.priors) + assert "base_growth_obs" in tr + assert "base_growth_k_ref" in tr + + +def test_jax_model_no_base_growth_sites_without_data(minimal_growth_df, + minimal_binding_df): + """Neither site appears when base_growth_df is not given.""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df) + + model_fn = orchestrator.jax_model + tr = trace(seed(model_fn, 0)).get_trace(orchestrator.data, orchestrator.priors) + assert "base_growth_obs" not in tr + assert "base_growth_k_ref" not in tr + + +def test_jax_model_guide_base_growth_k_ref_site_present(minimal_growth_df, + minimal_binding_df, + minimal_base_growth_df): + """The guide must register base_growth_k_ref (via its own pyro.param + variational parameters) but never the observation site itself.""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=minimal_base_growth_df) + + guide_fn = orchestrator.jax_model_guide + tr = trace(seed(guide_fn, 0)).get_trace(orchestrator.data, orchestrator.priors) + assert "base_growth_k_ref" in tr + assert "base_growth_obs" not in tr + + +def test_base_growth_obs_masks_genotypes_without_measurement(minimal_growth_df, + minimal_binding_df, + minimal_base_growth_df): + """A2V has no base_growth measurement, so its base_growth_obs log_prob + contribution must be exactly zero (fully masked out).""" + orchestrator = ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=minimal_base_growth_df) + + model_fn = orchestrator.jax_model + tr = trace(seed(model_fn, 0)).get_trace(orchestrator.data, orchestrator.priors) + + site = tr["base_growth_obs"] + log_prob = site["fn"].log_prob(site["value"]) + + genotype_labels = orchestrator.growth_tm.tensor_dim_labels[ + orchestrator.growth_tm.tensor_dim_names.index("genotype") + ] + batch_idx = np.asarray(orchestrator.data.growth.batch_idx) + a2v_positions = [i for i, geno_idx in enumerate(batch_idx) + if str(genotype_labels[geno_idx]) == "A2V"] + assert len(a2v_positions) > 0 + assert np.allclose(np.asarray(log_prob)[a2v_positions], 0.0) diff --git a/tests/tfscreen/tfmodel/test_data_class.py b/tests/tfscreen/tfmodel/test_data_class.py index c8b0de9e..ab86f426 100644 --- a/tests/tfscreen/tfmodel/test_data_class.py +++ b/tests/tfscreen/tfmodel/test_data_class.py @@ -15,8 +15,10 @@ GrowthData, BindingData, PreSplitData, + BaseGrowthData, DataClass, GrowthPriors, + BaseGrowthPriors, BindingPriors, PriorsClass, ) @@ -214,6 +216,50 @@ def test_replace_works(self): assert ps.num_genotype == G +# --------------------------------------------------------------------------- +# BaseGrowthData +# --------------------------------------------------------------------------- + +class TestBaseGrowthData: + def test_construction(self): + G = 3 + bg = BaseGrowthData( + rate_obs=jnp.zeros(G), + rate_std=jnp.ones(G), + good_mask=jnp.ones(G, dtype=bool), + num_genotype=G, + ) + assert bg.num_genotype == G + assert bg.rate_obs.shape == (G,) + assert bg.rate_std.shape == (G,) + assert bg.good_mask.shape == (G,) + + def test_replace_works(self): + G = 3 + bg = BaseGrowthData( + rate_obs=jnp.zeros(G), + rate_std=jnp.ones(G), + good_mask=jnp.ones(G, dtype=bool), + num_genotype=G, + ) + bg2 = bg.replace(num_genotype=10) + assert bg2.num_genotype == 10 + assert bg.num_genotype == G + + def test_replace_updates_rate_obs(self): + G = 3 + bg = BaseGrowthData( + rate_obs=jnp.zeros(G), + rate_std=jnp.ones(G), + good_mask=jnp.ones(G, dtype=bool), + num_genotype=G, + ) + new_rate = jnp.array([0.01, 0.02, 0.03]) + bg2 = bg.replace(rate_obs=new_rate) + assert jnp.array_equal(bg2.rate_obs, new_rate) + assert jnp.array_equal(bg.rate_obs, jnp.zeros(G)) + + # --------------------------------------------------------------------------- # DataClass # --------------------------------------------------------------------------- @@ -238,6 +284,7 @@ def test_default_growth_is_none(self): assert dc.growth is None assert dc.binding is None assert dc.presplit is None + assert dc.base_growth is None def test_replace_growth(self): dc = _make_data_class() @@ -250,6 +297,18 @@ def test_batch_idx_shape(self): dc = _make_data_class(num_genotype=6) assert dc.batch_idx.shape == (6,) + def test_replace_base_growth(self): + dc = _make_data_class(num_genotype=4) + bg = BaseGrowthData( + rate_obs=jnp.zeros(4), + rate_std=jnp.ones(4), + good_mask=jnp.ones(4, dtype=bool), + num_genotype=4, + ) + dc2 = dc.replace(base_growth=bg) + assert dc2.base_growth is bg + assert dc.base_growth is None + # --------------------------------------------------------------------------- # PriorsClass @@ -274,3 +333,40 @@ def test_construction(self): assert pc.growth is gp assert pc.binding is bp assert pc.theta is bp + + def test_growth_priors_base_growth_defaults_to_none(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, + ) + assert gp.base_growth is None + + def test_base_growth_priors_construction(self): + bgp = BaseGrowthPriors(k_ref_loc=0.02, k_ref_scale=0.02) + assert bgp.k_ref_loc == pytest.approx(0.02) + assert bgp.k_ref_scale == pytest.approx(0.02) + + def test_growth_priors_with_base_growth_set(self): + mock_any = MagicMock() + bgp = BaseGrowthPriors(k_ref_loc=0.015, k_ref_scale=0.01) + 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, + base_growth=bgp, + ) + assert gp.base_growth is bgp diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index b6dbf843..a5b25ded 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -1898,4 +1898,292 @@ def test_presplit_combined_key_matches_growth_tm_categories(self): 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 + ) + +# --------------------------------------------------------------------------- +# base_growth_df: _read_base_growth_df / _build_base_growth_arrays / +# _derive_k_ref_guess +# --------------------------------------------------------------------------- + +class TestBaseGrowthDf: + """ + Tests for the base_growth_df dk_geno-calibration input: a direct, + uncertainty-weighted observation of growth rate tied to a new k_ref + scalar plus the existing per-genotype dk_geno latent (see model.py's + base_growth_obs block). + """ + + @staticmethod + def _growth_df(genotypes=("wt", "A2G", "K3R")): + rows = [] + for geno in genotypes: + rows.append({ + "library": "kanR", "replicate": 1, "genotype": geno, + "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, + }) + return pd.DataFrame(rows) + + def test_basic_construction(self): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.02, 0.015], + "rate_std": [0.001, 0.002], + }) + + result = _read_base_growth_df(base_growth_df_raw, growth_df) + assert set(result["genotype"]) == {"wt", "A2G"} + assert len(result) == 2 + + def test_missing_required_column_raises(self): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + bad_df = pd.DataFrame({"genotype": ["wt"], "rate": [0.02]}) # no rate_std + + with pytest.raises(ValueError): + _read_base_growth_df(bad_df, growth_df) + + def test_genotype_not_in_growth_df_is_dropped(self, capsys): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + # A5T is validly-formatted but not one of the genotypes in growth_df. + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A5T"], + "rate": [0.02, 0.05], + "rate_std": [0.001, 0.001], + }) + + result = _read_base_growth_df(base_growth_df_raw, growth_df) + assert set(result["genotype"]) == {"wt"} + captured = capsys.readouterr() + assert "Syncing base_growth_df to growth_df" in captured.out + + def test_missing_wt_after_filtering_raises(self): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + # A2G is in growth_df, but wt is not present in base_growth_df at all. + base_growth_df_raw = pd.DataFrame({ + "genotype": ["A2G"], + "rate": [0.015], + "rate_std": [0.002], + }) + + with pytest.raises(ValueError, match="wt"): + _read_base_growth_df(base_growth_df_raw, growth_df) + + def test_wt_dropped_by_growth_df_filter_raises(self): + """wt present in base_growth_df but not in growth_df -- still an error, + since post-filtering wt is what's actually required.""" + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df(genotypes=("A2G",))) # no wt at all + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.02, 0.015], + "rate_std": [0.001, 0.002], + }) + + with pytest.raises(ValueError, match="wt"): + _read_base_growth_df(base_growth_df_raw, growth_df) + + def test_multiple_rows_per_genotype_combined_by_inverse_variance(self): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + # Two independent measurements of wt: precision-weighted mean. + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "wt"], + "rate": [0.02, 0.03], + "rate_std": [0.01, 0.02], + }) + + result = _read_base_growth_df(base_growth_df_raw, growth_df) + assert len(result) == 1 + + precision = np.array([1 / 0.01**2, 1 / 0.02**2]) + expected_rate = float(np.sum(np.array([0.02, 0.03]) * precision) / precision.sum()) + expected_std = float(np.sqrt(1.0 / precision.sum())) + + row = result.iloc[0] + assert row["genotype"] == "wt" + assert row["rate"] == pytest.approx(expected_rate) + assert row["rate_std"] == pytest.approx(expected_std) + # Combined precision must exceed either individual measurement's. + assert row["rate_std"] < 0.01 + + def test_build_base_growth_arrays_shapes_and_values(self): + from tfscreen.tfmodel.model_orchestrator import ( + _read_base_growth_df, + _build_base_growth_arrays, + ) + + growth_df = _read_growth_df(self._growth_df()) + tm = _build_growth_tm(growth_df) + genotype_labels = tm.tensor_dim_labels[tm.tensor_dim_names.index("genotype")] + + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.02, 0.015], + "rate_std": [0.001, 0.002], + }) + processed = _read_base_growth_df(base_growth_df_raw, growth_df) + arrays = _build_base_growth_arrays(processed, genotype_labels) + + assert arrays["rate_obs"].shape == (len(genotype_labels),) + assert arrays["rate_std"].shape == (len(genotype_labels),) + assert arrays["good_mask"].shape == (len(genotype_labels),) + + label_to_idx = {str(g): i for i, g in enumerate(genotype_labels)} + wt_idx = label_to_idx["wt"] + a2g_idx = label_to_idx["A2G"] + k3r_idx = label_to_idx["K3R"] # not in base_growth_df_raw + + assert arrays["good_mask"][wt_idx] + assert arrays["rate_obs"][wt_idx] == pytest.approx(0.02) + assert arrays["rate_std"][wt_idx] == pytest.approx(0.001) + + assert arrays["good_mask"][a2g_idx] + assert arrays["rate_obs"][a2g_idx] == pytest.approx(0.015) + + assert not arrays["good_mask"][k3r_idx] + + def test_derive_k_ref_guess_returns_wt_rate(self): + from tfscreen.tfmodel.model_orchestrator import ( + _read_base_growth_df, + _derive_k_ref_guess, + ) + + growth_df = _read_growth_df(self._growth_df()) + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.021, 0.015], + "rate_std": [0.001, 0.002], + }) + processed = _read_base_growth_df(base_growth_df_raw, growth_df) + + guess = _derive_k_ref_guess(processed) + assert guess == pytest.approx(0.021) + + def test_base_growth_df_wires_k_ref_into_growth_priors(self, mocker): + """ + End-to-end: supplying base_growth_df must derive a k_ref guess from + wt's rate and thread it into growth_priors.base_growth as a + BaseGrowthPriors(k_ref_loc=guess, k_ref_scale=_K_REF_PRIOR_SCALE) + instance. Without base_growth_df, growth_priors.base_growth must + stay None (its dataclass default). + """ + from tfscreen.tfmodel.model_orchestrator import _K_REF_PRIOR_SCALE + from tfscreen.tfmodel.tensors.populate_dataclass import ( + populate_dataclass as real_populate_dataclass, + ) + from tfscreen.tfmodel.data_class import DataClass, BaseGrowthPriors + + mock_growth_tm = create_mock_tm(is_growth=True) + mock_binding_tm = create_mock_tm(is_growth=False) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_growth_tm", return_value=mock_growth_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_binding_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_binding_tm", return_value=mock_binding_tm) + mocker.patch( + "tfscreen.tfmodel.model_orchestrator._setup_batching", + return_value={ + "batch_idx": jnp.arange(7), "batch_size": 7, + "scale_vector": jnp.ones(7), "num_binding": 0, + }, + ) + mocker.patch( + "tfscreen.tfmodel.model_orchestrator._read_base_growth_df", + return_value=pd.DataFrame({ + "genotype": ["wt"], "rate": [0.0234], "rate_std": [0.001], + }), + ) + mocker.patch( + "tfscreen.tfmodel.model_orchestrator._build_base_growth_arrays", + return_value={ + "rate_obs": np.zeros(7), "rate_std": np.ones(7), + "good_mask": np.zeros(7, dtype=bool), + }, + ) + + # Real populate_dataclass everywhere except DataClass, which would + # otherwise require a fully-realistic set of growth/binding tensors + # that this test has no need to build. + def _populate_side_effect(target_dataclass, sources): + if target_dataclass is DataClass: + return MagicMock() + return real_populate_dataclass(target_dataclass, sources) + + mocker.patch( + "tfscreen.tfmodel.model_orchestrator.populate_dataclass", + side_effect=_populate_side_effect, + ) + + registry = { + "condition_growth": {"hierarchical": MagicMock()}, + "growth_transition": {"instant": MagicMock()}, + "ln_cfu0": {"hierarchical": MagicMock()}, + "dk_geno": {"hierarchical_geno": MagicMock()}, + "activity": {"hierarchical_geno": MagicMock()}, + "theta": {"hill_geno": MagicMock()}, + "transformation": {"single": MagicMock()}, + "theta_rescale": {"passthrough": MagicMock()}, + "theta_growth_noise": {"zero": MagicMock()}, + "theta_binding_noise": {"zero": MagicMock()}, + "growth_noise": {"zero": MagicMock()}, + "sample_offset": {"zero": MagicMock()}, + "observe_binding": MagicMock(), + "observe_growth": MagicMock(), + } + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", registry, clear=True): + for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", + "activity", "theta", "transformation", "theta_growth_noise", + "theta_binding_noise", "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + mod = tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k] + mod.get_priors.return_value = {} + mod.get_guesses.return_value = {} + + model = ModelOrchestrator( + "g.csv", "b.csv", + base_growth_df="base_growth.csv", + condition_growth="hierarchical", + growth_transition="instant", + activity="hierarchical_geno", + theta="hill_geno", + transformation="single", + theta_growth_noise="zero", + ) + + base_growth_priors = model._priors.growth.base_growth + assert isinstance(base_growth_priors, BaseGrowthPriors) + assert base_growth_priors.k_ref_loc == pytest.approx(0.0234) + assert base_growth_priors.k_ref_scale == _K_REF_PRIOR_SCALE + + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", registry, clear=True): + for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", + "activity", "theta", "transformation", "theta_growth_noise", + "theta_binding_noise", "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + mod = tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k] + mod.get_priors.return_value = {} + mod.get_guesses.return_value = {} + + model_no_base_growth = ModelOrchestrator( + "g.csv", "b.csv", + condition_growth="hierarchical", + growth_transition="instant", + activity="hierarchical_geno", + theta="hill_geno", + transformation="single", + theta_growth_noise="zero", + ) + + assert model_no_base_growth._priors.growth.base_growth is None From 1c29b5b0257a9f1c58069df34ab6719f94c0f7a0 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 14:19:18 -0700 Subject: [PATCH 09/30] catch trailing example from last commit --- examples/simulate/simulate_config.yaml | 31 ++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/examples/simulate/simulate_config.yaml b/examples/simulate/simulate_config.yaml index 91eae1c5..69bca5f0 100644 --- a/examples/simulate/simulate_config.yaml +++ b/examples/simulate/simulate_config.yaml @@ -292,6 +292,37 @@ seed: null # titrant_conc: [0, 0.0001, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0] # noise: 0.02 +# --------------------------------------------------------------------------- +# Base growth-rate calibration data (optional) +# --------------------------------------------------------------------------- + +# If present, tfs-simulate also writes a base_growth CSV: direct +# reference-condition growth-rate "measurements" for a subset of genotypes, +# tied to the per-genotype dk_geno already assigned above and a shared +# reference rate k_ref. Feeds tfs-configure-model's --base_growth_df, which +# anchors the hierarchical model's dk_geno/condition_growth identifiability +# (see CLAUDE.md). +# +# k_ref (required): the reference (wt) growth rate, hr^-1. +# genotypes (optional, default ["wt"]): genotypes to include. Every genotype +# listed must already be part of the simulated library (tile_combos); +# 'wt' is always force-included even if omitted. dk_geno is looked up +# from the value already assigned to that genotype -- never redrawn. +# rates (optional): per-genotype explicit true-rate override, bypassing the +# k_ref + dk_geno calculation for that genotype. Every key must also +# appear in genotypes. +# noise (optional, default 0.0): sigma of Gaussian noise added to the true +# rate to produce the observed rate; also reported as rate_std. +# +# base_growth_data: +# k_ref: 0.025 +# genotypes: +# - wt +# - A47V +# rates: +# A47V: 0.018 +# noise: 0.001 + # --------------------------------------------------------------------------- # Pre-split data simulation (optional) # --------------------------------------------------------------------------- From e9ed48e2888411d1ff9240488a7f568409b6db57 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 14:45:50 -0700 Subject: [PATCH 10/30] wired base_growth file in --- src/tfscreen/tfmodel/configuration_io.py | 19 ++++- src/tfscreen/tfmodel/model_orchestrator.py | 1 + .../tfmodel/scripts/configure_model_cli.py | 20 +++++- .../tfmodel/scripts/test_configure_and_run.py | 70 +++++++++++++++++++ tests/tfscreen/tfmodel/test_base_growth.py | 44 ++++++++++++ .../tfmodel/test_model_orchestrator.py | 2 + 6 files changed, 152 insertions(+), 4 deletions(-) diff --git a/src/tfscreen/tfmodel/configuration_io.py b/src/tfscreen/tfmodel/configuration_io.py index 06f6752d..50fd0f56 100644 --- a/src/tfscreen/tfmodel/configuration_io.py +++ b/src/tfscreen/tfmodel/configuration_io.py @@ -117,7 +117,8 @@ def write_configuration(orchestrator, out_prefix, growth_df_path=None, binding_df_path=None, - presplit_df_path=None): + presplit_df_path=None, + base_growth_df_path=None): """ Write model configuration and extracted priors/guesses to files. @@ -131,6 +132,11 @@ def write_configuration(orchestrator, Path to growth data CSV. binding_df_path : str Path to binding data CSV. + presplit_df_path : str, optional + Path to the pre-split observation CSV. + base_growth_df_path : str, optional + Path to the base_growth_df CSV (direct growth-rate measurements + anchoring the k_ref latent; see model_orchestrator._read_base_growth_df). """ # Construct priors and guesses dataframes priors_list = [] @@ -157,6 +163,8 @@ def write_configuration(orchestrator, data_paths["binding"] = binding_df_path if presplit_df_path is not None: data_paths["presplit"] = presplit_df_path + if base_growth_df_path is not None: + data_paths["base_growth"] = base_growth_df_path config = { "tfscreen_version": __version__, @@ -280,6 +288,7 @@ def read_configuration(config_file): growth_df_path = config["data"].get("growth") binding_df_path = config["data"].get("binding") presplit_df_path = config["data"].get("presplit") + base_growth_df_path = config["data"].get("base_growth") settings = config["components"] else: raise ValueError(f"Configuration file '{config_file}' has an unrecognized format.") @@ -289,14 +298,18 @@ def read_configuration(config_file): warnings.warn(f"Configuration file version {config['tfscreen_version']} does not match current tfscreen version {__version__}") batch_size = settings.pop("batch_size", None) - # presplit_df is a data path, not a component setting; pop it if it - # ended up in settings (older configs that serialised it there). + # presplit_df / base_growth_df are data paths, not component settings; + # pop them since they're already passed explicitly below (they end up + # in settings because ModelOrchestrator.settings includes them for + # round-tripping the raw path the user originally supplied). settings.pop("presplit_df", None) + settings.pop("base_growth_df", None) orchestrator = ModelOrchestrator(growth_df_path, binding_df_path, batch_size=batch_size, presplit_df=presplit_df_path, + base_growth_df=base_growth_df_path, **settings) # Update Priors from CSV diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 6b01b24d..e6554459 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -1795,4 +1795,5 @@ def settings(self): "thermo_data": self._thermo_data, "binding_weight": self._binding_weight, "presplit_df": getattr(self, "_presplit_df", None), + "base_growth_df": getattr(self, "_base_growth_df", None), } diff --git a/src/tfscreen/tfmodel/scripts/configure_model_cli.py b/src/tfscreen/tfmodel/scripts/configure_model_cli.py index e52348a7..99b896da 100644 --- a/src/tfscreen/tfmodel/scripts/configure_model_cli.py +++ b/src/tfscreen/tfmodel/scripts/configure_model_cli.py @@ -49,6 +49,7 @@ def check_component_compatibility(condition_growth_model, theta_rescale_model): def configure_model(binding_df, growth_df=None, presplit_df=None, + base_growth_df=None, out_prefix="tfs_configure", condition_growth_model="linear", growth_transition_model="instant", @@ -88,6 +89,19 @@ def configure_model(binding_df, Path to the growth data CSV file (ln_cfu measurements per genotype, replicate, and timepoint). When omitted, a binding-only model is configured. + presplit_df : str, optional + Path to the pre-split (t = -t_pre) sequencing-observation CSV file. + Provides a direct constraint on ln_cfu0 for genotypes it covers. See + data_class.PreSplitData. + base_growth_df : str, optional + Path to a CSV of direct, reference-condition growth-rate + measurements (columns: genotype, rate, rate_std) for a subset of + genotypes (wt at minimum). Anchors the new k_ref latent scalar to + dk_geno via ``rate_obs ~ Normal(k_ref + dk_geno, rate_std)``, + resolving an identifiability confound between condition_growth's + k/m and dk_geno's hierarchical hyperparameters. See + model_orchestrator._read_base_growth_df and generative/model.py's + base_growth_obs block. out_prefix : str, optional Prefix for the three output files ({out_prefix}_config.yaml, {out_prefix}_priors.csv, {out_prefix}_guesses.csv). @@ -191,6 +205,7 @@ def configure_model(binding_df, orchestrator = ModelOrchestrator(growth_df, binding_df, presplit_df=presplit_df, + base_growth_df=base_growth_df, binding_only=binding_only, condition_growth=condition_growth_model, growth_transition=growth_transition_model, @@ -214,17 +229,20 @@ def configure_model(binding_df, # names, the data file paths, and the parameter guesses/priors. growth_path = None if binding_only else (growth_df if isinstance(growth_df, str) else "growth.csv") presplit_path = presplit_df if isinstance(presplit_df, str) else None + base_growth_path = base_growth_df if isinstance(base_growth_df, str) else None write_configuration(orchestrator=orchestrator, out_prefix=out_prefix, growth_df_path=growth_path, binding_df_path=binding_df if isinstance(binding_df, str) else "binding.csv", - presplit_df_path=presplit_path) + presplit_df_path=presplit_path, + base_growth_df_path=base_growth_path) def main(): return generalized_main(configure_model, manual_arg_types={"binding_df":str, "growth_df":str, "presplit_df":str, + "base_growth_df":str, "spiked":list, "thermo_data":str, "batch_size":int, diff --git a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py index 1d1a5269..96d58998 100644 --- a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py +++ b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py @@ -94,6 +94,39 @@ def test_configure_growth_analysis_coverage(mock_orchestrator, tmpdir): assert "genotype" in guesses_df.columns # genotype mapping assert "dim_0" in guesses_df.columns # fallback mapping + +def test_configure_model_passes_base_growth_df_to_orchestrator_and_config(mock_orchestrator, tmpdir): + """base_growth_df must reach ModelOrchestrator and be recorded under + config['data']['base_growth'] in the written YAML.""" + mock_orchestrator_class, mock_orchestrator_inst = mock_orchestrator + mock_orchestrator_inst.settings = {"batch_size": 128, "theta": "hill_geno", + "base_growth_df": "bg.csv"} + out_prefix = os.path.join(tmpdir, "test") + + configure_model("b.csv", growth_df="g.csv", base_growth_df="bg.csv", + out_prefix=out_prefix) + + assert mock_orchestrator_class.call_args.kwargs["base_growth_df"] == "bg.csv" + + with open(f"{out_prefix}_config.yaml") as f: + written_config = yaml.safe_load(f) + assert written_config["data"]["base_growth"] == "bg.csv" + + +def test_configure_model_omits_base_growth_when_not_given(mock_orchestrator, tmpdir): + """Without base_growth_df, no 'base_growth' key is written under data.""" + mock_orchestrator_class, mock_orchestrator_inst = mock_orchestrator + out_prefix = os.path.join(tmpdir, "test") + + configure_model("b.csv", growth_df="g.csv", out_prefix=out_prefix) + + assert mock_orchestrator_class.call_args.kwargs["base_growth_df"] is None + + with open(f"{out_prefix}_config.yaml") as f: + written_config = yaml.safe_load(f) + assert "base_growth" not in written_config["data"] + + def test_read_configuration_logic(tmpdir, mocker): config_path = os.path.join(tmpdir, "config.yaml") priors_path = os.path.join(tmpdir, "priors.csv") @@ -130,6 +163,43 @@ def test_read_configuration_logic(tmpdir, mocker): assert init_params["param1"] == 0.5 assert isinstance(init_params["param2"], jnp.ndarray) + +def test_read_configuration_passes_base_growth_df_path(tmpdir, mocker): + """data.base_growth must reach ModelOrchestrator as base_growth_df, and + any stray 'base_growth_df' left in components (round-tripped via + ModelOrchestrator.settings) must be popped rather than passed twice.""" + config_path = os.path.join(tmpdir, "config.yaml") + priors_path = os.path.join(tmpdir, "priors.csv") + guesses_path = os.path.join(tmpdir, "guesses.csv") + + config = { + "data": {"growth": "g.csv", "binding": "b.csv", "base_growth": "bg.csv"}, + "components": {"batch_size": 256, "base_growth_df": "bg.csv"}, + "priors_file": "priors.csv", + "guesses_file": "guesses.csv" + } + with open(config_path, "w") as f: + yaml.dump(config, f) + + pd.DataFrame({"parameter": ["p1"], "value": [1.0]}).to_csv(priors_path, index=False) + pd.DataFrame({"parameter": ["param1"], "value": [0.5]}).to_csv(guesses_path, index=False) + + mock_orchestrator_class = mocker.patch("tfscreen.tfmodel.configuration_io.ModelOrchestrator") + mock_orchestrator_inst = mock_orchestrator_class.return_value + mock_orchestrator_inst.init_params = {"param1": 0.0} + + mocker.patch("tfscreen.tfmodel.configuration_io._update_dataclass", + return_value=MagicMock()) + + # If 'base_growth_df' weren't popped from settings before being passed + # explicitly, this call would raise TypeError ("got multiple values for + # keyword argument 'base_growth_df'") before even reaching the mock. + read_configuration(config_path) + + call_kwargs = mock_orchestrator_class.call_args.kwargs + assert call_kwargs["base_growth_df"] == "bg.csv" + + def test_read_configuration_errors(tmpdir): config_path = os.path.join(tmpdir, "bad_config.yaml") diff --git a/tests/tfscreen/tfmodel/test_base_growth.py b/tests/tfscreen/tfmodel/test_base_growth.py index 06105c53..a3051dab 100644 --- a/tests/tfscreen/tfmodel/test_base_growth.py +++ b/tests/tfscreen/tfmodel/test_base_growth.py @@ -6,8 +6,12 @@ - ModelOrchestrator: base_growth_df=None (no change), base_growth_df passed in - jax_model: base_growth_obs / base_growth_k_ref sites fire (model and guide) when data.base_growth is set, and are absent when it is not. + - Full tfs-configure-model / tfs-fit-model CLI round trip: base_growth_df + survives write_configuration -> YAML -> read_configuration. """ +import os + import pytest import numpy as np import pandas as pd @@ -17,6 +21,8 @@ from tfscreen.tfmodel.model_orchestrator import ModelOrchestrator from tfscreen.tfmodel.data_class import BaseGrowthData +from tfscreen.tfmodel.scripts.configure_model_cli import configure_model +from tfscreen.tfmodel.configuration_io import read_configuration # --------------------------------------------------------------------------- @@ -163,3 +169,41 @@ def test_base_growth_obs_masks_genotypes_without_measurement(minimal_growth_df, if str(genotype_labels[geno_idx]) == "A2V"] assert len(a2v_positions) > 0 assert np.allclose(np.asarray(log_prob)[a2v_positions], 0.0) + + +# --------------------------------------------------------------------------- +# Full CLI round trip: tfs-configure-model -> tfs_configure_config.yaml -> +# tfs-fit-model (via read_configuration) +# --------------------------------------------------------------------------- + +def test_configure_model_to_read_configuration_round_trip(tmp_path, + minimal_growth_df, + minimal_binding_df, + minimal_base_growth_df): + """base_growth_df must survive the real tfs-configure-model -> YAML -> + tfs-fit-model (read_configuration) round trip, ending up as a proper + BaseGrowthData on the orchestrator rebuilt from the config file.""" + growth_path = os.path.join(tmp_path, "growth.csv") + binding_path = os.path.join(tmp_path, "binding.csv") + base_growth_path = os.path.join(tmp_path, "base_growth.csv") + minimal_growth_df.to_csv(growth_path, index=False) + minimal_binding_df.to_csv(binding_path, index=False) + minimal_base_growth_df.to_csv(base_growth_path, index=False) + + out_prefix = os.path.join(tmp_path, "tfs_configure") + configure_model(binding_path, growth_df=growth_path, + base_growth_df=base_growth_path, + out_prefix=out_prefix, + theta_growth_noise_model="zero") + + config_path = f"{out_prefix}_config.yaml" + orchestrator, init_params = read_configuration(config_path) + + bg = orchestrator.data.base_growth + assert bg is not None + assert isinstance(bg, BaseGrowthData) + assert bg.num_genotype == 3 + assert bg.good_mask.sum() == 2 + assert orchestrator.priors.growth.base_growth is not None + assert orchestrator.priors.growth.base_growth.k_ref_loc == pytest.approx(0.021) + assert "base_growth_k_ref" in init_params diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index a5b25ded..8478ea9a 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -799,6 +799,7 @@ def test_model_class_properties(initialized_model_class): model._epistasis = True model._thermo_data = None model._binding_weight = 1.0 + model._base_growth_df = "bg.csv" assert ModelOrchestrator.jax_model.fget(model) == "jm" assert ModelOrchestrator.jax_model_guide.fget(model) == "jmg" @@ -820,6 +821,7 @@ def test_model_class_properties(initialized_model_class): assert ModelOrchestrator.settings.fget(model)["spiked_genotypes"] == ["s"] assert ModelOrchestrator.settings.fget(model)["growth_shares_replicates"] == False assert ModelOrchestrator.settings.fget(model)["epistasis"] == True + assert ModelOrchestrator.settings.fget(model)["base_growth_df"] == "bg.csv" assert ModelOrchestrator.get_batch.fget(model) == get_batch def test_extract_parameters_full(initialized_model_class): From 3c9be7d9c0218d30209c1dfba5e9771a6375c1a0 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 15:15:38 -0700 Subject: [PATCH 11/30] fixed bugs --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 4320 ++++++++++++++++- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/selection_experiment.py | 2 +- src/tfscreen/tfmodel/analysis/prediction.py | 145 +- .../simulate/test_selection_experiment.py | 11 +- .../tfmodel/analysis/test_prediction.py | 116 + 8 files changed, 4370 insertions(+), 230 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 97afee55..7d01273f 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.42%coverage96.42% \ No newline at end of file +coverage: 99.32%coverage99.32% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index f2be4178..6c98efaa 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3758tests3758 \ No newline at end of file +tests: 3801tests3801 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index aa155d34..23ed0556 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1,3 +1,3878 @@ +./build/lib/tfscreen/__init__.py:19:1: W391 blank line at end of file +./build/lib/tfscreen/__version__.py:5:16: W291 trailing whitespace +./build/lib/tfscreen/analysis/__init__.py:13:1: W391 blank line at end of file +./build/lib/tfscreen/analysis/cat_response/__init__.py:2:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/__init__.py:3:55: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: C901 'cat_fit' is too complex (19) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:25:80: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:26:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:42:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:51:51: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:87:49: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:88:40: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:51: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:90:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:91:40: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:92:48: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:94:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:108:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:110:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:115:48: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:117:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:124:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:125:47: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:72: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:74: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:130:13: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:148:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:150:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:155:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:172:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:174:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:55: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:62: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:57: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:65: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:191:9: E701 multiple statements on one line (colon) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:192:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:204:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:205:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:206:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:207:36: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:209:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:5: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:32: W292 no newline at end of file +./build/lib/tfscreen/analysis/cat_response/cat_response.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/cat_response.py:23:73: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:26:78: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:44:74: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:45:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:46:26: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:51:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:57:43: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:97:43: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:98:26: W291 trailing whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:130:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/cat_response/cat_response.py:134:34: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:138:42: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/cat_response/cat_response.py:141:56: W292 no newline at end of file +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:21:1: C901 'cat_response' is too complex (11) +./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:91:56: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: C901 'mutant_cycle_pivot' is too complex (11) +./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/extract_epistasis.py:33:77: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:34:25: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:78:25: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:96:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:113:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:125:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:129:1: C901 'extract_epistasis' is too complex (12) +./build/lib/tfscreen/analysis/extract_epistasis.py:133:47: E252 missing whitespace around parameter equals +./build/lib/tfscreen/analysis/extract_epistasis.py:133:48: E252 missing whitespace around parameter equals +./build/lib/tfscreen/analysis/extract_epistasis.py:159:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:183:36: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:184:27: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:187:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:192:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:201:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:208:55: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:208:60: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:208:65: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/extract_epistasis.py:210:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:216:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:223:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:229:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:231:10: W291 trailing whitespace +./build/lib/tfscreen/analysis/extract_epistasis.py:233:30: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/analysis/stats_test_suite.py:8:31: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:8:42: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:55:75: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:66:52: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:104:33: W291 trailing whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:134:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:143:26: E231 missing whitespace after ',' +./build/lib/tfscreen/analysis/stats_test_suite.py:144:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:148:5: E303 too many blank lines (2) +./build/lib/tfscreen/analysis/stats_test_suite.py:149:22: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:150:15: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:151:26: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:155:21: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:156:24: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:157:24: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:158:32: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:159:21: E231 missing whitespace after ':' +./build/lib/tfscreen/analysis/stats_test_suite.py:161:1: W293 blank line contains whitespace +./build/lib/tfscreen/analysis/stats_test_suite.py:163:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/build_cycles.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/build_cycles.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/build_cycles.py:69:26: W291 trailing whitespace +./build/lib/tfscreen/genetics/build_cycles.py:78:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/build_mut_geno_matrix.py:5:1: C901 'build_mut_geno_matrix' is too complex (17) +./build/lib/tfscreen/genetics/combine_mutation_effects.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/combine_mutation_effects.py:11:50: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:32:73: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:34:71: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:35:21: W291 trailing whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:65:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:73:27: E261 at least two spaces before inline comment +./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E117 over-indented +./build/lib/tfscreen/genetics/combine_mutation_effects.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:89:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/combine_mutation_effects.py:104:25: W292 no newline at end of file +./build/lib/tfscreen/genetics/count_mutation_backgrounds.py:8:1: C901 'count_mutation_backgrounds' is too complex (12) +./build/lib/tfscreen/genetics/data.py:25:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:26:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:27:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:28:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:29:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:30:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:31:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:32:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:33:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:34:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:35:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:36:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:37:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:38:8: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:41:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:42:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:43:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:44:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:45:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:46:23: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/data.py:46:28: W292 no newline at end of file +./build/lib/tfscreen/genetics/expand_genotype_columns.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/expand_genotype_columns.py:16:51: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:47:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:64:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:77:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:79:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/expand_genotype_columns.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:95:41: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:96:31: W291 trailing whitespace +./build/lib/tfscreen/genetics/expand_genotype_columns.py:105:14: W292 no newline at end of file +./build/lib/tfscreen/genetics/genotype_sorting.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/genotype_sorting.py:9:58: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:11:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:16:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:17:74: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:18:81: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:19:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:20:35: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:29:11: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:37:41: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:43:79: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:51:74: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:53:30: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:53:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:57:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:70:39: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:86:37: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:86:46: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:89:55: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:92:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:100:67: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:140:8: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:141:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E117 over-indented +./build/lib/tfscreen/genetics/genotype_sorting.py:218:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:221:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/genotype_sorting.py:221:32: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:221:50: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/genotype_sorting.py:240:40: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:273:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:274:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:292:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/genotype_sorting.py:298:1: W391 blank line at end of file +./build/lib/tfscreen/genetics/get_single_with_wt.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/get_single_with_wt.py:46:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:55:59: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:58:38: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:59:38: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:60:39: E231 missing whitespace after ':' +./build/lib/tfscreen/genetics/get_single_with_wt.py:63:11: E124 closing bracket does not match visual indentation +./build/lib/tfscreen/genetics/get_single_with_wt.py:65:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:66:52: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:78:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/get_single_with_wt.py:80:49: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/get_single_with_wt.py:87:77: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:90:69: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:93:37: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:94:61: W291 trailing whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:97:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/get_single_with_wt.py:107:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/library_manager.py:76:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:91:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:94:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:158:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:159:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/genetics/library_manager.py:169:22: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:181:5: C901 'LibraryManager._parse_and_validate' is too complex (12) +./build/lib/tfscreen/genetics/library_manager.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:226:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:235:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:244:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:250:9: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:251:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:254:27: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:254:36: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:258:32: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:258:46: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:51: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:58: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:288:70: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:300:48: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:300:94: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:307:35: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:309:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:310:49: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:311:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:313:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:316:37: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:316:49: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:318:30: E701 multiple statements on one line (colon) +./build/lib/tfscreen/genetics/library_manager.py:321:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:324:18: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/genetics/library_manager.py:373:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:378:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:380:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:386:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:415:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:421:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:427:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:466:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:467:78: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:471:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:476:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:478:25: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:478:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:479:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:482:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:488:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:493:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:526:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:527:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:528:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:555:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:560:73: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:560:82: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:561:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:562:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:562:55: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:562:63: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:563:39: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:563:43: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:564:34: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:564:38: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:566:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:568:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:605:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:611:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:613:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:616:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:617:5: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:648:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:650:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:656:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:657:31: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:661:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:663:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:665:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:695:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:698:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:703:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:708:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:710:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:712:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:713:30: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:721:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:740:28: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:740:41: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:748:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:776:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:781:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:787:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:790:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:791:39: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:794:72: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:795:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:798:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:806:9: E303 too many blank lines (2) +./build/lib/tfscreen/genetics/library_manager.py:807:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:810:76: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:811:15: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:825:1: W293 blank line contains whitespace +./build/lib/tfscreen/genetics/library_manager.py:838:79: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:839:75: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:840:34: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:841:58: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:845:64: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:853:37: W291 trailing whitespace +./build/lib/tfscreen/genetics/library_manager.py:854:27: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:856:40: E231 missing whitespace after ',' +./build/lib/tfscreen/genetics/library_manager.py:859:1: W391 blank line at end of file +./build/lib/tfscreen/mle/__init__.py:16:1: W391 blank line at end of file +./build/lib/tfscreen/mle/curve_models/__init__.py:4:77: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:5:42: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:11:77: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:16:76: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:18:29: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:52:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:53:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:54:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:55:22: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:58:28: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:59:28: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:60:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:61:24: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:62:27: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:65:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:66:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:67:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:68:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:69:30: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:72:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:73:29: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:74:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:75:25: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:76:28: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:79:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:80:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:81:37: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:82:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:83:35: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:86:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:87:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:88:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:89:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:90:33: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:93:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:94:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:95:32: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:96:27: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:97:30: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:100:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:101:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:102:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:103:26: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:104:29: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:104:55: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/__init__.py:107:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:108:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:109:36: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:110:31: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:111:34: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/__init__.py:114:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:115:34: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:116:35: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:117:30: E231 missing whitespace after ':' +./build/lib/tfscreen/mle/curve_models/__init__.py:117:33: E201 whitespace after '[' +./build/lib/tfscreen/mle/curve_models/guesses.py:3:69: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:25:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:25:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:42:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:42:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:45:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:65:23: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:69:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:89:23: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:109:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:110:24: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:114:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:129:35: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:130:24: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:134:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:150:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:155:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:165:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:181:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:196:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:212:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:215:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:217:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:222:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:225:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:243:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:247:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:250:26: E225 missing whitespace around operator +./build/lib/tfscreen/mle/curve_models/guesses.py:252:10: E261 at least two spaces before inline comment +./build/lib/tfscreen/mle/curve_models/guesses.py:257:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:257:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:260:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:271:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:271:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:274:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:274:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:277:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:288:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:288:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:291:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:291:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:294:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:305:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:305:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:308:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/guesses.py:308:21: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:311:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/guesses.py:322:20: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:322:25: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/guesses.py:324:1: W391 blank line at end of file +./build/lib/tfscreen/mle/curve_models/models.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:38:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:39:26: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:40:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:41:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:68:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:70:51: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:75:25: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:88:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:91:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:130:27: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:42: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:130:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:132:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:203:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:206:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:206:41: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:207:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:207:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:210:38: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:211:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:213:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:213:47: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:214:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:251:30: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:251:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:252:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:254:30: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:254:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:255:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/curve_models/models.py:259:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:262:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:301:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:304:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/curve_models/models.py:316:28: W291 trailing whitespace +./build/lib/tfscreen/mle/curve_models/models.py:326:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/curve_models/models.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:26:72: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:29:56: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:34:72: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:36:69: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:41:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:71:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:77:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:123:5: E301 expected 1 blank line, found 0 +./build/lib/tfscreen/mle/fit_manager.py:186:62: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:223:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:225:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:227:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:247:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:250:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:269:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:272:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:291:24: W291 trailing whitespace +./build/lib/tfscreen/mle/fit_manager.py:294:41: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:320:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:337:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:340:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:344:5: E303 too many blank lines (2) +./build/lib/tfscreen/mle/fit_manager.py:344:40: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fit_manager.py:425:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:456:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fit_manager.py:473:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/__init__.py:7:1: W391 blank line at end of file +./build/lib/tfscreen/mle/fitters/_util.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/_util.py:5:14: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:5:24: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:5:31: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/_util.py:6:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/_util.py:19:18: E225 missing whitespace around operator +./build/lib/tfscreen/mle/fitters/_util.py:21:44: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/_util.py:27:34: W292 no newline at end of file +./build/lib/tfscreen/mle/fitters/least_squares.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/least_squares.py:42:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:43:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:44:5: E303 too many blank lines (2) +./build/lib/tfscreen/mle/fitters/least_squares.py:44:76: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:47:38: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/least_squares.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:119:18: F541 f-string is missing placeholders +./build/lib/tfscreen/mle/fitters/least_squares.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:126:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/least_squares.py:128:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/matrix_nls.py:13:76: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:35: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:37: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:39: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:56:52: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/fitters/matrix_nls.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_nls.py:67:54: W292 no newline at end of file +./build/lib/tfscreen/mle/fitters/matrix_wls.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/fitters/matrix_wls.py:27:81: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:30:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:42:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:52:40: W291 trailing whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:54:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/fitters/matrix_wls.py:55:52: W292 no newline at end of file +./build/lib/tfscreen/mle/predict_with_error.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/mle/predict_with_error.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/predict_with_error.py:42:36: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:54:1: W293 blank line contains whitespace +./build/lib/tfscreen/mle/predict_with_error.py:57:43: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:61:45: E231 missing whitespace after ',' +./build/lib/tfscreen/mle/predict_with_error.py:74:32: W292 no newline at end of file +./build/lib/tfscreen/plot/__init__.py:36:63: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:13:1: C901 'cat_fits' is too complex (11) +./build/lib/tfscreen/plot/cat_fits.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/cat_fits.py:13:15: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:13:17: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:99:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:99:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:113:80: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:119:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:120:74: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:121:14: W291 trailing whitespace +./build/lib/tfscreen/plot/cat_fits.py:123:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:123:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:128:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:128:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:131:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:137:53: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:147:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:147:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:163:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:163:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/cat_fits.py:171:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:172:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:173:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:174:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:175:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:176:12: E701 multiple statements on one line (colon) +./build/lib/tfscreen/plot/cat_fits.py:187:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/cat_fits.py:187:5: W292 no newline at end of file +./build/lib/tfscreen/plot/corner.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/corner.py:11:76: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:12:23: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:17:66: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:19:80: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:38:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/corner.py:39:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:47:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:63: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:51:73: W291 trailing whitespace +./build/lib/tfscreen/plot/corner.py:54:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/corner.py:55:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/corner.py:64:15: W292 no newline at end of file +./build/lib/tfscreen/plot/default_styles.py:17:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:17:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:17:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:18:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:19:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:27:8: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:28:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:29:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:33:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:34:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:38:8: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:39:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:40:16: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:44:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:45:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:46:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:47:14: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:54:9: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:55:12: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:56:13: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:56:16: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/default_styles.py:58:41: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:59:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:59:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:59:48: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/default_styles.py:62:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:63:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:63:32: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/default_styles.py:64:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:65:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:66:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:70:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:71:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:72:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:73:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:74:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:79:18: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:79:21: W291 trailing whitespace +./build/lib/tfscreen/plot/default_styles.py:80:17: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:81:22: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:82:20: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:83:33: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/default_styles.py:84:2: W292 no newline at end of file +./build/lib/tfscreen/plot/err_vs_mag.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/err_vs_mag.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/err_vs_mag.py:20:34: W291 trailing whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:33:55: W291 trailing whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:43:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:44:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:49:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:49:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:55:5: E303 too many blank lines (3) +./build/lib/tfscreen/plot/err_vs_mag.py:57:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:62:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:37: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:62:50: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:63:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:64:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_vs_mag.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_vs_mag.py:70:14: W292 no newline at end of file +./build/lib/tfscreen/plot/err_zscore.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/err_zscore.py:21:77: W291 trailing whitespace +./build/lib/tfscreen/plot/err_zscore.py:22:37: W291 trailing whitespace +./build/lib/tfscreen/plot/err_zscore.py:52:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:52:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:53:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:54:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:54:51: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:57:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:58:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:72:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:73:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:73:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:73:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:74:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:78:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/err_zscore.py:79:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/err_zscore.py:79:41: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:16:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/est_v_real_summary.py:24:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/est_v_real_summary.py:54:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/est_v_real_summary.py:57:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:70:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:72:5: E303 too many blank lines (2) +./build/lib/tfscreen/plot/est_v_real_summary.py:72:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:72:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:72:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/est_v_real_summary.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:102:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/est_v_real_summary.py:106:1: W391 blank line at end of file +./build/lib/tfscreen/plot/geno_trajectory.py:29:1: C901 'plot_geno_trajectory' is too complex (14) +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:15:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:17:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:19:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:23:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:26:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:32:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:33:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:42:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:44:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:17:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:18:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:20:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:24:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:26:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:27:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:39:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:41:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:15:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:16:53: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:19:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:20:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:21:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:23:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:25:17: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:33:25: E211 whitespace before '(' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:73: E261 at least two spaces before inline comment +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:74: E262 inline comment should start with '# ' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:50:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:52:19: W292 no newline at end of file +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:6:18: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: C901 '_build_heatmap_collection' is too complex (11) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:88:38: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:90:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:93:32: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:107:55: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:110:55: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:125:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:126:48: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:129:68: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:142:33: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:143:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:13: E221 multiple spaces before operator +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:28: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:151:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:154:33: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:155:16: E221 multiple spaces before operator +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:156:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:34: E203 whitespace before ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:34: E203 whitespace before ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:41: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:41: E202 whitespace before ']' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:160:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:66: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: C901 '_build_color_mapper' is too complex (13) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:217:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:39: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:243:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:276:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:280:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:281:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:338:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:373:40: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:375:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:382:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:385:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:388:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:443:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:448:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:456:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:457:1: C901 'heatmap' is too complex (13) +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:509:76: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:528:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:531:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:561:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:569:53: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:570:5: F841 local variable 'e' is assigned to but never used +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:580:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:589:75: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:590:39: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:37: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:57: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:593:33: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:596:29: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:612:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:615:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:620:20: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:621:69: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:622:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:625:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:629:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:636:35: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:637:34: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:638:32: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:639:37: E231 missing whitespace after ':' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:643:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:644:57: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:645:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:647:72: W291 trailing whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:34: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:56: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:671:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:672:43: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:679:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/heatmap/heatmap_core.py:680:19: W292 no newline at end of file +./build/lib/tfscreen/plot/helper.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:28:78: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:29:40: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:31:55: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:51:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:60:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:62:71: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:64:61: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:69:47: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:70:26: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:74:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/helper.py:84:76: W291 trailing whitespace +./build/lib/tfscreen/plot/helper.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:93:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/helper.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/helper.py:100:17: W292 no newline at end of file +./build/lib/tfscreen/plot/hill_fit.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/plot_theta_fits.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/plot_theta_fits.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:84:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:84:50: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:86:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:88:73: E225 missing whitespace around operator +./build/lib/tfscreen/plot/plot_theta_fits.py:89:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:92:52: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:95:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:98:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:98:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:99:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:102:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:102:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:103:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:105:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:108:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:108:46: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:115:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:121:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:124:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:130:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:133:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:139:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:141:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/plot_theta_fits.py:144:22: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/plot_theta_fits.py:153:1: W391 blank line at end of file +./build/lib/tfscreen/plot/uncertainty_calibration.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/uncertainty_calibration.py:21:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/uncertainty_calibration.py:24:63: W291 trailing whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:65:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:71:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:71:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:84:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:84:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:15: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:18: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:87:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:89:21: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:19: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:27: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:30: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:40: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:45: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:90:58: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:25: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:38: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:41: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:46: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:91:59: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/plot/uncertainty_calibration.py:93:24: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:94:18: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/uncertainty_calibration.py:97:14: W292 no newline at end of file +./build/lib/tfscreen/plot/xy_corr.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/plot/xy_corr.py:24:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/plot/xy_corr.py:63:47: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:64:35: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:69:31: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:69:42: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:88:17: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/plot/xy_corr.py:89:17: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/plot/xy_corr.py:91:20: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:28: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:36: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:44: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:49: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:62: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:91:67: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:93:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:94:23: E231 missing whitespace after ',' +./build/lib/tfscreen/plot/xy_corr.py:97:14: W292 no newline at end of file +./build/lib/tfscreen/process_raw/_counts_io.py:110:16: F541 f-string is missing placeholders +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:30:69: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:77:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:110:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:114:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:147:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:191:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:193:41: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:194:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:197:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:200:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:203:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:212:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:213:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:214:64: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:229:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:49: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:66: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:238:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/counts_to_lncfu.py:241:52: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:21:14: E401 multiple imports on one line +./build/lib/tfscreen/process_raw/fastq_to_counts.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/fastq_to_counts.py:26:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:69:44: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:104:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:113:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:136:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:137:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:138:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:139:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:144:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:149:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:156:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:188:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:194:15: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:204:42: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/fastq_to_counts.py:207:42: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/fastq_to_counts.py:208:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:216:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:219:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:220:40: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:223:54: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:226:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:233:66: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:247:18: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:249:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:260:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:262:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:263:45: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:266:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:267:5: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:290:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:296:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:46: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:302:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:303:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:304:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:305:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:306:28: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:318:50: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:319:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:322:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:324:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:326:58: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:32: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:332:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:334:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:32: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:55: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:336:57: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:338:35: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:347:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:348:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:9: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:5: E303 too many blank lines (2) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:30: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:361:15: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:364:79: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:365:79: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:367:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:368:21: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:371:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:377:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:380:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:381:20: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:403:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:405:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:406:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:410:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:411:43: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:435:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:440:65: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:451:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:458:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:459:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:460:78: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:464:40: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:34: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:471:77: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:476:34: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:481:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:482:45: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:487:75: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:35: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:44: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:496:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:497:40: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:506:68: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:511:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:43: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:516:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:526:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:529:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:34: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:44: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:546:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:553:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:47: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:558:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:565:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:567:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:30: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:39: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:571:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:574:22: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:576:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:579:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:580:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:581:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:584:78: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:586:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:594:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:595:66: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:596:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:600:49: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:602:67: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:603:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:604:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:605:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:610:27: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:612:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:613:26: E701 multiple statements on one line (colon) +./build/lib/tfscreen/process_raw/fastq_to_counts.py:614:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:618:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:623:62: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:624:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:625:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:652:50: W291 trailing whitespace +./build/lib/tfscreen/process_raw/fastq_to_counts.py:653:50: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/fastq_to_counts.py:664:1: W391 blank line at end of file +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:28: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:29: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:26: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:27: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:21: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:22: E252 missing whitespace around parameter equals +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:18:5: E125 continuation line with same indent as next logical line +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:75:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:79:44: W292 no newline at end of file +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:25:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:26:39: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:46:87: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:47:87: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:56:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:64:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:66:71: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:82:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:83:70: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:85:51: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:88:76: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:96:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:105:74: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:142:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:165:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:168:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:173:45: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:181:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:182:43: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:25: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:40: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:207:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:237:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:257:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:258:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:259:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:260:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E117 over-indented +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:291:27: E231 missing whitespace after ':' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:292:25: E231 missing whitespace after ':' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:296:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:297:69: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:298:73: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:299:72: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:300:54: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:314:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:37: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:54: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:337:67: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:348:71: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:354:71: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:357:80: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:361:70: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:374:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:389:29: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:396:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:397:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:398:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:399:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:400:23: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:401:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:403:57: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:406:59: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:407:1: W293 blank line contains whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:410:38: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:411:31: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:413:37: W291 trailing whitespace +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:417:39: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:418:33: E231 missing whitespace after ',' +./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:420:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:77:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:78:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:79:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:86:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/__init__.py:29:2: W292 no newline at end of file +./build/lib/tfscreen/simulate/binding_params.py:225:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) +./build/lib/tfscreen/simulate/binding_params.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:290:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:292:13: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:293:13: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:296:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:298:12: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:299:12: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:318:21: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:321:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:321:43: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:323:23: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:324:23: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:330:32: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:332:28: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:333:28: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:336:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:350:14: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:350:31: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:352:10: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:352:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:353:10: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:353:27: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:383:22: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:385:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:386:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:389:18: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/binding_params.py:391:15: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/build_sample_dataframes.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/build_sample_dataframes.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file +./build/lib/tfscreen/simulate/library_prediction.py:28:1: C901 'library_prediction' is too complex (14) +./build/lib/tfscreen/simulate/library_prediction.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used +./build/lib/tfscreen/simulate/run_simulation.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/run_simulation.py:17:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:18:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:21:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:22:23: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:22:62: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:24:47: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:25:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:34:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:38:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:50:38: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:50:39: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:51:39: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:51:40: E252 missing whitespace around parameter equals +./build/lib/tfscreen/simulate/run_simulation.py:53:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:56:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:71:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:72:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/run_simulation.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:82:46: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:83:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:88:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:88:62: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:91:26: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:92:29: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:93:33: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:94:25: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:95:25: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/run_simulation.py:96:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:100:50: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/run_simulation.py:101:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:106:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/run_simulation.py:107:1: W391 blank line at end of file +./build/lib/tfscreen/simulate/sample_theta.py:170:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:171:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:172:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:173:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:174:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:175:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:176:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:120:15: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:121:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:123:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:127:20: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:128:22: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:129:21: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:148:48: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:149:14: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:150:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:155:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:168:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:171:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:172:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:173:16: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:176:17: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:178:25: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:180:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:194:19: E221 multiple spaces before operator +./build/lib/tfscreen/simulate/scripts/simulate_cli.py:211:1: C901 'run_simulation_from_config' is too complex (12) +./build/lib/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:45:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:46:36: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:71:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:72:1: C901 '_check_dict_number' is too complex (13) +./build/lib/tfscreen/simulate/selection_experiment.py:72:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:115:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:158:1: C901 '_check_cf' is too complex (25) +./build/lib/tfscreen/simulate/selection_experiment.py:180:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:199:57: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:223:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:224:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:290:1: C901 '_check_lib_spec' is too complex (12) +./build/lib/tfscreen/simulate/selection_experiment.py:290:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:342:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:347:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:369:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:422:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:438:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:446:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:446:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:456:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:466:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:509:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:513:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:514:75: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:524:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:527:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:573:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:584:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:585:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:588:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:592:55: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:598:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:603:30: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:604:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:608:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:678:50: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:678:52: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:680:75: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:682:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:683:46: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:684:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:685:67: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:735:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:752:79: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:758:29: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:800:43: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:806:74: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:807:18: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:813:79: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:815:33: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:820:80: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:825:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:831:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:842:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:885:73: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:890:76: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:907:25: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1015:26: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:44: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:52: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1015:60: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1023:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1024:32: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1032:42: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1041:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1042:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1044:63: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1052:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1059:28: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1061:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1062:24: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1069:79: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1074:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1075:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1077:36: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1079:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1089:128: E501 line too long (145 > 127 characters) +./build/lib/tfscreen/simulate/selection_experiment.py:1090:128: E501 line too long (145 > 127 characters) +./build/lib/tfscreen/simulate/selection_experiment.py:1094:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1095:72: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1099:34: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1106:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1108:20: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1108:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1109:20: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1111:32: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1112:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1124:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1132:41: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1139:49: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1141:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1146:36: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:37: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:45: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1147:61: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1152:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/simulate/selection_experiment.py:1187:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1208:57: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1209:53: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1212:28: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1212:39: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1217:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1223:78: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1226:19: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1234:33: E261 at least two spaces before inline comment +./build/lib/tfscreen/simulate/selection_experiment.py:1235:49: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1236:37: E231 missing whitespace after ':' +./build/lib/tfscreen/simulate/selection_experiment.py:1238:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1239:76: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1241:19: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1243:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1251:77: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1252:43: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1256:41: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/selection_experiment.py:1259:49: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1283:71: W291 trailing whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1291:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1292:76: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1297:11: F541 f-string is missing placeholders +./build/lib/tfscreen/simulate/selection_experiment.py:1302:38: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1319:6: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/simulate/selection_experiment.py:1326:51: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1327:48: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1328:1: W293 blank line contains whitespace +./build/lib/tfscreen/simulate/selection_experiment.py:1329:33: E231 missing whitespace after ',' +./build/lib/tfscreen/simulate/selection_experiment.py:1332:1: W391 blank line at end of file +./build/lib/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) +./build/lib/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (18) +./build/lib/tfscreen/simulate/thermo_to_growth.py:626:41: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/__init__.py:2:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:3:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:18:65: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:22:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:23:19: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:26:66: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:30:72: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:33:26: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:37:37: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:40:9: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:41:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:43:56: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/__init__.py:46:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:33:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:34:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:35:34: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:119:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:120:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:121:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:122:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:474:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:511:1: C901 'summarize_sbc' is too complex (16) +./build/lib/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/extraction.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/extraction.py:103:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:196:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:274:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/extraction.py:275:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:276:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:331:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:383:1: C901 'extract_growth_predictions' is too complex (11) +./build/lib/tfscreen/tfmodel/analysis/extraction.py:482:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/extraction.py:501:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:503:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/extraction.py:504:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:41:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/analysis/prediction.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:165:1: C901 'copy_orchestrator' is too complex (11) +./build/lib/tfscreen/tfmodel/analysis/prediction.py:292:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:399:1: C901 'predict' is too complex (29) +./build/lib/tfscreen/tfmodel/analysis/prediction.py:542:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:545:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:550:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prediction.py:570:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/prediction.py:572:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/analysis/prediction.py:604:58: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/analysis/prediction.py:607:26: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/tfmodel/analysis/prediction.py:607:26: E117 over-indented +./build/lib/tfscreen/tfmodel/analysis/prediction.py:610:25: E122 continuation line missing indentation or outdented +./build/lib/tfscreen/tfmodel/analysis/prediction.py:616:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/analysis/prior_predictive.py:104:33: E203 whitespace before ':' +./build/lib/tfscreen/tfmodel/configuration_io.py:19:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (32) +./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:198:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:201:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:203:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:204:40: E713 test for membership should be 'not in' +./build/lib/tfscreen/tfmodel/configuration_io.py:210:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:211:31: E713 test for membership should be 'not in' +./build/lib/tfscreen/tfmodel/configuration_io.py:217:18: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:233:33: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/configuration_io.py:245:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:259:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:259:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/configuration_io.py:261:1: C901 'read_configuration' is too complex (20) +./build/lib/tfscreen/tfmodel/configuration_io.py:261:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/configuration_io.py:298:128: E501 line too long (139 > 127 characters) +./build/lib/tfscreen/tfmodel/configuration_io.py:309:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:310:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:311:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:312:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:313:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/configuration_io.py:319:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:331:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:346:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/configuration_io.py:351:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/data_class.py:42:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:116:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/data_class.py:133:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:135:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/data_class.py:275:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/data_class.py:282:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/data_class.py:283:5: E266 too many leading '#' for block comment +./build/lib/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:17:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:48:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:51:45: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:59:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:60:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:71:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:78:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:108:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:47:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:100:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:104:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:108:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:118:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:57: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:126:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:164:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:166:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:170:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:178:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:182:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:57: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:210:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:246:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:250:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:269:7: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:54:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:112:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:24:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:63:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:64:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:65:38: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:66:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:71:45: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:76:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:88:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:96:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:104:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:105:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:117:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:120:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:121:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:37: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:64: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:39: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:126:39: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:127:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:129:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:131:67: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:134:38: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:135:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:137:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:146:45: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:151:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:163:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:54: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:175:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:185:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:219:64: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:220:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:224:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:243:7: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:72:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:141:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:19:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:33:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:42:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:45:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:53:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:63:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:70:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:82:21: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:84:47: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:93:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:98:14: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:38:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:39:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:42:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:43:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:44:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:49:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:96:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:100:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:104:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:105:106: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:108:33: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:111:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:113:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:121:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:169:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:170:80: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:83: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:97: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:175:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:177:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:178:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:179:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:183:83: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:189:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:197:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:50: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:203:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:221:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:267:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:269:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:277:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:284:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:287:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:292:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:307:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:309:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:311:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:312:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:313:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:314:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:316:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:317:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:319:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:320:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:323:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:334:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:335:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:336:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:343:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:344:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:345:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:348:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:351:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:352:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:355:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:358:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:362:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:92:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:237:40: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:260:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:274:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:280:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:282:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:283:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:284:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:285:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:286:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:287:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:288:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:289:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:290:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:313:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:135:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:23:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:52:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:53:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:73:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:79:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:40:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:41:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:42:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:95:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:101:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:213:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:230:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:295:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:333:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:370:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:420:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:421:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:422:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:423:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:424:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:425:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:426:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:427:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:428:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:433:1: C901 '_empirical_group_estimates' is too complex (15) +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:462:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:463:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:465:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:490:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:493:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:510:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:519:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:529:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:532:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:535:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:549:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:550:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:553:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:554:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:566:46: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:580:16: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:624:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:629:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:630:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:631:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:650:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:654:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:655:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:657:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:661:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:671:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:678:15: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:716:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:134:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:239:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:275:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:317:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:318:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:319:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:320:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:321:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:322:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:323:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:324:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:325:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:326:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:331:15: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:348:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:349:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:356:16: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:393:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:398:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:399:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:411:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:415:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:417:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:418:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:420:21: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:438:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:450:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:10:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:27:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:28:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:67:6: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:68:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:82:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:89:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:93:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:94:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:95:65: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:96:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:97:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:102:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:107:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:118:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:120:41: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:129:68: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:133:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:136:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:158:26: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:175:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:185:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:194:48: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:18:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:19:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:47:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:95:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:104:48: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:126:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:225:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:282:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:285:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:415:41: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:454:27: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:507:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:545:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:549:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:550:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:552:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:553:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:567:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:573:18: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:160:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:166:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:167:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:170:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:176:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:178:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:179:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:182:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:186:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:259:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:261:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:262:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:74: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:269:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:270:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:271:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:274:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:312:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:321:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:326:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:330:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:335:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:339:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:344:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:349:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:353:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:357:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:361:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:369:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:372:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:375:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:378:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:384:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:388:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:390:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:74: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:399:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:400:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:401:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:403:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:405:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:464:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:466:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:469:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:482:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:484:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:485:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:490:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:492:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:493:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:498:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:500:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:501:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:506:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:508:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:509:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:514:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:516:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:517:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:520:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:521:70: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:522:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:526:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:14: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:565:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:568:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:571:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:572:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:598:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:599:50: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:600:46: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:602:50: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:603:52: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:604:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:606:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:607:51: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:608:47: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:610:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:611:51: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:612:47: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:632:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:666:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:674:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:675:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:676:45: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:678:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:680:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:683:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:685:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:686:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:771:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:773:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:774:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:777:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:779:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:780:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:792:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:820:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:882:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:885:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:193:76: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:300:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:301:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:302:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:38: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:367:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:370:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:608:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:610:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:611:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:44: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:73: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:71: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:71: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:700:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:702:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:705:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:714:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:748:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:750:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:751:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:755:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:756:70: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:757:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:761:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:19: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:21: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:14: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:16: E251 unexpected spaces around keyword / parameter equals +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:846:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1013:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1015:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1016:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1017:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1018:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1019:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1020:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:43: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1029:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1031:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1032:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1033:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1035:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1036:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1040:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1042:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1043:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1086:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1141:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1154:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1157:14: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:188:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:189:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:190:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:386:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:387:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:396:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:399:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:401:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:403:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:409:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:411:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:414:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:416:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:422:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:424:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:426:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:429:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:430:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:431:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:432:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:444:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:446:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:447:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:473:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:474:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:496:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:497:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:498:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:499:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:501:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:505:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:506:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:507:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:508:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:510:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:514:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:516:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:519:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:523:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:529:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:533:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:534:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:535:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:536:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:539:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:540:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:600:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:603:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:607:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:610:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:614:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:633:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:649:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:650:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:662:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:663:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:664:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:665:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:666:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:667:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:668:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:669:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:670:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:671:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:797:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:798:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:799:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:801:12: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:85:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:222:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:223:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:228:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:229:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:233:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:234:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:260:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:270:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:332:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:337:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:339:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:343:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:347:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:349:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:351:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:353:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:364:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:406:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:408:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:410:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:411:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:412:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:414:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:418:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:431:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:434:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:435:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:471:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:479:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:481:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:482:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:483:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:484:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:485:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:486:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:497:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:498:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:499:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:500:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:501:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:504:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:505:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:516:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:518:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:556:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:105:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:259:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:264:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:267:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:270:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:271:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:305:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:320:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:363:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:388:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:389:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:392:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:396:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:400:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:402:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:404:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:406:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:408:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:423:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:465:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:467:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:469:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:470:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:471:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:473:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:477:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:490:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:493:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:494:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:515:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:536:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:539:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:542:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:546:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:550:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:563:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:565:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:566:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:567:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:578:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:579:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:580:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:582:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:585:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:586:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:717:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:757:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:181:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:269:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:299:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:367:17: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:183:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:184:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:185:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:240:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:393:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:394:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:408:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:410:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:412:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:414:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:415:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:420:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:422:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:425:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:427:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:433:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:435:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:437:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:439:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:440:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:442:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:443:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:444:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:445:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:457:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:459:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:460:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:481:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:485:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:489:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:512:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:513:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:514:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:515:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:517:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:521:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:522:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:523:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:524:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:526:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:530:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:532:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (138 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:535:128: E501 line too long (128 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:539:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:545:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:549:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:550:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:551:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:552:128: E501 line too long (142 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:555:128: E501 line too long (132 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:556:128: E501 line too long (129 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:618:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:621:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:625:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:628:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:632:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:635:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:636:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:653:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:655:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:674:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:675:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:35: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:687:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:688:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:689:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:690:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:691:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:692:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:693:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:694:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:695:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:696:41: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:770:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:778:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:786:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:806:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:826:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:827:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:828:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:830:12: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:242:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:248:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:249:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:253:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:254:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:297:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:365:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:369:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:371:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:374:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:378:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:380:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:382:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:386:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:395:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:441:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:444:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:445:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:446:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:447:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:449:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:453:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:466:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:469:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:470:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:507:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:513:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:519:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:520:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:521:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:522:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:523:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:524:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:525:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:537:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:538:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:539:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:540:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:541:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:542:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:545:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:546:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:557:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:559:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:597:25: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:690:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:707:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:708:38: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:727:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:38: E202 whitespace before ']' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:104:6: E201 whitespace after '[' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:258:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:263:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:266:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:269:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:270:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:309:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:324:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:368:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:393:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:394:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:397:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:401:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:405:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:407:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:409:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:411:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:413:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:417:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:432:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:478:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:480:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:482:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:483:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:484:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:486:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:490:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:503:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:506:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:507:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:529:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:544:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:546:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:548:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:550:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:552:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:556:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:564:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:566:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:567:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:568:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:578:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:580:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:582:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:583:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:584:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:587:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:588:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:666:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:701:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:722:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:762:25: E127 continuation line over-indented for visual indent +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:104:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:155:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:230:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:246:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:276:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:336:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:353:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:360:15: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:236:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:237:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:238:31: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:276:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:299:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:535:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:571:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:575:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:577:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:578:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:579:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:581:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:591:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:592:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:602:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:603:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:604:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:605:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:606:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:607:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:608:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:609:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:679:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:684:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:696:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:699:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:704:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:168:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:200:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:201:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:206:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:207:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:239:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:272:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:290:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:296:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:301:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:304:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:306:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:317:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:357:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:359:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:361:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:362:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:363:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:365:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:382:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:385:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:386:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:403:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:416:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:420:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:421:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:422:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:423:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:424:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:426:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:436:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:437:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:438:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:439:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:442:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:443:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:514:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:518:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:530:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:533:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:537:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:555:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:557:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:182:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:190:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:231:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:250:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:252:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:269:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:292:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:302:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:304:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:306:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:330:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:332:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:333:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:334:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:336:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:358:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:363:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:380:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:384:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:395:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:397:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:405:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:418:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:420:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:428:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:432:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:438:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:443:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:444:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:445:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:448:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:449:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:450:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:451:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:521:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:525:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:537:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:540:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:544:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:562:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:133:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:137:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:142:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:143:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:165:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:234:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:238:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:243:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:250:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:275:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:342:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:356:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:361:15: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:160:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:198:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:199:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:34: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:221:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:222:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:264:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:269:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:273:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:275:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:23: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:284:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:286:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:288:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:290:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:308:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:310:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:311:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:312:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:24: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:128: E501 line too long (135 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:128: E501 line too long (140 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:316:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:128: E501 line too long (140 > 127 characters) +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:324:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:327:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:330:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:336:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:344:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:360:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:361:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:53: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:393:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:394:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:395:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:396:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:397:37: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:398:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:399:36: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:402:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:412:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:413:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:33: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:424:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:425:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:426:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:427:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:428:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:429:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:430:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:431:39: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:484:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:489:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:490:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:495:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:498:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:502:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:503:16: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:108:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:111:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:135:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:136:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:141:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:142:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:171:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:205:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:223:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:229:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:234:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:236:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:238:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:240:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:241:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:242:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:247:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:264:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:281:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:284:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:285:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:286:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:287:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:289:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:293:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:306:24: E741 ambiguous variable name 'l' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:309:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:310:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:327:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:343:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:344:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:345:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:346:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:347:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:348:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:349:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:361:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:362:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:363:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:364:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:365:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:368:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:369:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:423:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:428:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:434:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:439:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:442:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:446:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:465:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: E402 module level import not at top of file +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:124:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:132:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:165:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:174:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:176:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:196:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:197:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:214:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:231:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:237:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:246:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:248:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:250:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:251:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:272:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:274:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:278:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:296:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:297:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:298:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:300:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:19: E225 missing whitespace around operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:314:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:318:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:319:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:331:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:340:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:352:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:354:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:357:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:358:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:359:31: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:362:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:363:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:364:30: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:22: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:376:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:377:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:378:27: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:379:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:382:29: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:383:28: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:384:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:385:32: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:437:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:438:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:442:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:446:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:449:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:454:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:457:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:461:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:480:13: E221 multiple spaces before operator +./build/lib/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 +./build/lib/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 +./build/lib/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 +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:115:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:116:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:121:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:126:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:127:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:144:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:211:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:212:8: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:216:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:221:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:9: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:228:6: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:249:40: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:309:17: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:323:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:324:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:328:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:329:15: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:99:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:110:40: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:111:48: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:112:49: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:76:7: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:91:16: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:102:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:86:14: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:115:21: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:171:13: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:181:18: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/nn.py:62:10: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:11:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:15:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:33:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:36:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:48:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:131:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:156:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:162:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:167:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:175:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:181:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:185:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:189:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:192:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:194:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:197:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:204:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:207:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:211:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:232:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:241:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:249:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:270:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:279:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:305:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:307:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:331:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:352:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:364:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:368:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:391:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:414:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:441:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:446:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:450:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:453:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:455:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:457:21: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:480:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:482:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:483:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:484:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:486:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:490:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:493:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:46:36: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:15:35: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:21:25: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:21: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:24:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:32:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:45:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:51:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/model.py:12:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/model.py:44:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/model.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/model.py:105:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:106:24: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:106:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:161:36: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:162:24: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:162:44: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/model.py:258:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/model.py:259:19: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/generative/model.py:323:28: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:324:28: F541 f-string is missing placeholders +./build/lib/tfscreen/tfmodel/generative/model.py:330:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:82: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:51:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:57:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/binding.py:67:11: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:8:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:68: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:89: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:73:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:87:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:95:5: F841 local variable 'nu' is assigned to but never used +./build/lib/tfscreen/tfmodel/generative/observe/growth.py:97:11: W292 no newline at end of file +./build/lib/tfscreen/tfmodel/generative/registry.py:58:29: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/registry.py:59:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/generative/registry.py:62:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:63:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:64:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:65:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:67:14: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:68:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:69:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:71:14: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:72:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:73:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:74:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:76:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:77:16: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:78:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:79:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:80:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:81:24: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:83:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:88:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:92:12: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:93:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:94:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:95:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:96:19: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:97:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:98:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:99:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:100:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:101:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:102:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:103:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:104:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:105:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:106:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:107:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:108:37: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:110:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:111:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:112:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:113:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:115:26: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:116:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:117:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:119:19: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:120:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:121:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:123:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:124:15: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:125:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:127:24: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:128:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:129:17: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:130:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:131:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:132:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:133:18: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:135:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/generative/registry.py:136:21: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: C901 'load_posteriors' is too complex (12) +./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/inference/posteriors.py:117:17: F841 local variable 'e' is assigned to but never used +./build/lib/tfscreen/tfmodel/inference/run_inference.py:21:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:29:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:30:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:31:1: E402 module level import not at top of file +./build/lib/tfscreen/tfmodel/inference/run_inference.py:32:1: E302 expected 2 blank lines, found 0 +./build/lib/tfscreen/tfmodel/inference/run_inference.py:35:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:36:69: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:22: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:28: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:57:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:63:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:65:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:79:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:87:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:93:20: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:98:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:105:34: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:107:87: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:123:58: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:124:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:129:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:132:5: C901 'RunInference.run_optimization' is too complex (18) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:223:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:224:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:238:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:241:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:242:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:251:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:253:53: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:261:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:288:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:299:48: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:304:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:308:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:318:128: E501 line too long (177 > 127 characters) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:324:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:325:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:332:60: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:346:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:347:50: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment +./build/lib/tfscreen/tfmodel/inference/run_inference.py:703:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:738:31: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:750:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:751:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:31: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:772:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:774:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:775:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:776:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:783:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:784:31: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:866:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:880:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:883:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:884:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:893:36: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:900:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:900:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:902:61: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:951:5: E303 too many blank lines (4) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:992:26: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:992:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:995:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:41: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1009:32: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1009:42: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1060:5: C901 'RunInference.get_map_posteriors' is too complex (13) +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1298:50: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1339:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1342:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1347:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1355:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1359:30: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1366:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/inference/run_inference.py:1372:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:39:1: E303 too many blank lines (3) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:76:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:25: E222 multiple spaces after operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:81:42: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:85:65: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:85:88: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:30: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:63: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:106:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:120:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:124:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:125:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:127:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/model_orchestrator.py:210:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:73: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:215:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:216:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:217:61: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:218:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:219:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:221:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:222:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:223:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:224:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:227:63: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:228:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:229:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:239:63: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:42: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:68: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:29: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:246:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:72: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:288:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:297:33: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:297:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:298:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:301:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:307:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:336:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/model_orchestrator.py:368:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:369:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:370:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:372:23: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:373:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:374:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:378:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:457:12: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:537:66: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:673:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:676:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:681:52: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:682:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:689:30: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:693:38: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:789:82: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:794:87: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:797:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:802:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:905:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:905:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:931:28: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:933:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:48: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:935:46: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:935:66: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:936:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:940:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:941:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:946:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:953:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:955:10: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:955:10: E116 unexpected indentation (comment) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:957:76: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:960:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:962:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:964:49: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:976:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:984:57: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1006:38: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1007:41: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1007:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1008:44: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1008:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1009:40: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1009:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1010:46: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1010:71: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1012:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1019:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1046:40: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1092:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1093:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1094:26: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1095:32: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1135:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1138:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1139:32: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1140:60: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1144:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1145:36: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1146:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1147:38: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1149:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1160:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1160:62: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1163:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1164:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1169:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1170:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1171:58: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1173:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1178:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1182:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1186:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1189:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1195:86: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1197:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1204:77: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1265:57: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1274:25: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1284:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1285:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1286:35: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1287:38: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1288:39: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1295:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1296:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1297:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1373:25: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1374:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1376:31: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1449:5: C901 'ModelOrchestrator._initialize_classes' is too complex (21) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1469:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1471:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1472:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1474:68: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1475:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1476:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1477:40: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1494:42: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1495:43: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:40: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:53: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:56: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1577:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1580:69: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1601:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1603:9: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1662:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1667:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1681:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1691:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1701:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1715:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1718:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1747:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1759:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1771:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1777:25: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1778:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1779:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1780:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1781:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1782:22: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1783:32: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1784:23: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1785:20: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1786:29: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1787:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1788:33: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1789:34: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1790:27: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1791:28: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/model_orchestrator.py:1792:31: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:212:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:213:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:214:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:215:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:216:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:217:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:218:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:219:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:220:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:221:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:225:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:226:22: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:240:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:242:59: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:243:58: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:244:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:245:63: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:246:55: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:247:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:248:59: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:249:63: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:250:55: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:252:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:124:35: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:126:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:130:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:245:39: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:247:51: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:251:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:514:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:516:60: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:517:53: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:518:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:519:66: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:520:66: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:521:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:522:65: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:523:64: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:524:72: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:525:74: E231 missing whitespace after ':' +./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:527:1: E305 expected 2 blank lines after class or function definition, found 1 +./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used +./build/lib/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:115:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:116:23: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:207:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:208:11: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:213:20: E221 multiple spaces before operator +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:290:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:291:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:24: E128 continuation line under-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:295:1: C901 '_inject_calibration_priors' is too complex (21) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:554:1: C901 '_build_csv_updates' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:612:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:613:35: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:752:1: C901 '_apply_guesses_updates' is too complex (12) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:904:1: E303 too many blank lines (3) +./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:908:1: E302 expected 2 blank lines, found 3 +./build/lib/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) +./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) +./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) +./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:521:1: C901 'summarize_fit' is too complex (59) +./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) +./build/lib/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/batch.py:44:59: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:46:47: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:47:55: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:48:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:49:45: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:50:69: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:51:69: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:52:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/batch.py:53:67: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:6:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:86:63: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:95:28: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:101:1: W391 blank line at end of file +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:22: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:27: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:80:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:107:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:111:54: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:113:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:118:49: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:119:50: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:122:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:148:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:161:79: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:179:39: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:183:71: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:184:67: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:186:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:200:51: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:204:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:236:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:238:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:244:43: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:29: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:282:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:295:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:302:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:308:58: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:314:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:315:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:320:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:321:55: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:322:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:330:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:331:34: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:334:37: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:339:74: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:357:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:361:70: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:365:84: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:366:55: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:367:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:377:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:379:34: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:395:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:398:53: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:405:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:409:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:410:82: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:422:36: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:429:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:435:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:451:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:452:43: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:458:66: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:460:51: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:466:78: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:467:75: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:469:77: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:476:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:477:73: W291 trailing whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:487:40: E231 missing whitespace after ',' +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:493:5: E303 too many blank lines (2) +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:502:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:512:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:517:1: W293 blank line contains whitespace +./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:528:1: W391 blank line at end of file +./build/lib/tfscreen/util/__init__.py:71:2: W292 no newline at end of file +./build/lib/tfscreen/util/cli/__init__.py:16:1: W391 blank line at end of file +./build/lib/tfscreen/util/cli/generalized_main.py:1:11: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:5:1: C901 'generalized_main' is too complex (15) +./build/lib/tfscreen/util/cli/generalized_main.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/cli/generalized_main.py:13:78: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:14:46: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:24:69: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:27:51: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:30:51: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:57:77: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:58:36: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:69:30: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:74:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:75:74: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:85:58: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:87:34: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:87:48: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:92:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:94:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:97:39: W291 trailing whitespace +./build/lib/tfscreen/util/cli/generalized_main.py:104:45: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:104:59: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:104:75: E231 missing whitespace after ',' +./build/lib/tfscreen/util/cli/generalized_main.py:105:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/__init__.py:28:2: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/add_group_columns.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/add_group_columns.py:8:79: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:9:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:10:82: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:12:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:13:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:25:75: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:42:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:43:12: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:47:36: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:52:29: E211 whitespace before '(' +./build/lib/tfscreen/util/dataframe/add_group_columns.py:65:77: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:70:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:73:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:80:51: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:81:51: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/add_group_columns.py:90:21: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/check_columns.py:4:1: E303 too many blank lines (3) +./build/lib/tfscreen/util/dataframe/check_columns.py:4:21: E231 missing whitespace after ',' +./build/lib/tfscreen/util/dataframe/check_columns.py:35:30: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:3:1: F811 redefinition of unused 'np' from line 1 +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/chunk_by_group.py:74:44: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:63:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:65:49: E231 missing whitespace after ',' +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:68:5: E303 too many blank lines (2) +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:84:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:89:74: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:90:76: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:91:22: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:100:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:105:36: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:111:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/df_to_arrays.py:112:24: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:62:1: W391 blank line at end of file +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:56:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:61:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:80:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:95:37: W292 no newline at end of file +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:9:14: W291 trailing whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: C901 'get_scaled_cfu' is too complex (17) +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:62:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:67:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:76:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:130:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:131:14: W292 no newline at end of file +./build/lib/tfscreen/util/io/read_dataframe.py:7:1: C901 'read_dataframe' is too complex (16) +./build/lib/tfscreen/util/io/read_dataframe.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/io/read_dataframe.py:79:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/io/read_dataframe.py:84:27: E127 continuation line over-indented for visual indent +./build/lib/tfscreen/util/io/read_dataframe.py:85:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/io/read_dataframe.py:102:14: W292 no newline at end of file +./build/lib/tfscreen/util/io/read_yaml.py:31:1: C901 'read_yaml' is too complex (12) +./build/lib/tfscreen/util/numerical/array_search.py:7:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/array_search.py:48:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/array_search.py:80:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:82:31: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/numerical/array_search.py:90:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:97:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/array_search.py:98:37: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/broadcast_args.py:4:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/broadcast_args.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/broadcast_args.py:90:1: W391 blank line at end of file +./build/lib/tfscreen/util/numerical/padding.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/padding.py:29:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:34:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:37:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:41:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:43:48: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/padding.py:44:36: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/padding.py:46:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:50:30: E203 whitespace before ':' +./build/lib/tfscreen/util/numerical/padding.py:52:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/padding.py:53:21: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/transform.py:10:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/transform.py:189:36: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/xfill.py:3:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/xfill.py:14:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:26:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:32:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/xfill.py:58:14: E111 indentation is not a multiple of 4 +./build/lib/tfscreen/util/numerical/xfill.py:58:14: E117 over-indented +./build/lib/tfscreen/util/numerical/xfill.py:58:29: E261 at least two spaces before inline comment +./build/lib/tfscreen/util/numerical/xfill.py:79:20: W292 no newline at end of file +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:5:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:45:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:50:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:57:22: E231 missing whitespace after ',' +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:66:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:69:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:70:71: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:71:34: W291 trailing whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:73:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:74:23: W292 no newline at end of file +./build/lib/tfscreen/util/validation/check.py:37:1: C901 'check_number' is too complex (12) +./build/lib/tfscreen/util/validation/check.py:37:1: E302 expected 2 blank lines, found 1 +./build/lib/tfscreen/util/validation/check.py:92:1: W293 blank line contains whitespace +./build/lib/tfscreen/util/validation/check.py:118:18: W292 no newline at end of file ./scripts/generate_struct_ensemble.py:266:11: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:272:24: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:433:18: E221 multiple spaces before operator @@ -1492,48 +5367,47 @@ ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/analysis/prediction.py:13:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/prediction.py:72:1: C901 'copy_orchestrator' is too complex (11) -./src/tfscreen/tfmodel/analysis/prediction.py:199:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/analysis/prediction.py:306:1: C901 'predict' is too complex (24) -./src/tfscreen/tfmodel/analysis/prediction.py:449:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:452:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:457:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:460:67: W291 trailing whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:461:76: W291 trailing whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:465:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:472:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/analysis/prediction.py:481:58: E741 ambiguous variable name 'l' -./src/tfscreen/tfmodel/analysis/prediction.py:484:26: E111 indentation is not a multiple of 4 -./src/tfscreen/tfmodel/analysis/prediction.py:484:26: E117 over-indented -./src/tfscreen/tfmodel/analysis/prediction.py:487:25: E122 continuation line missing indentation or outdented -./src/tfscreen/tfmodel/analysis/prediction.py:493:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:165:1: C901 'copy_orchestrator' is too complex (11) +./src/tfscreen/tfmodel/analysis/prediction.py:292:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/analysis/prediction.py:399:1: C901 'predict' is too complex (29) +./src/tfscreen/tfmodel/analysis/prediction.py:542:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:545:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:550:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/analysis/prediction.py:570:31: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/analysis/prediction.py:572:31: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/analysis/prediction.py:604:58: E741 ambiguous variable name 'l' +./src/tfscreen/tfmodel/analysis/prediction.py:607:26: E111 indentation is not a multiple of 4 +./src/tfscreen/tfmodel/analysis/prediction.py:607:26: E117 over-indented +./src/tfscreen/tfmodel/analysis/prediction.py:610:25: E122 continuation line missing indentation or outdented +./src/tfscreen/tfmodel/analysis/prediction.py:616: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 -./src/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (31) +./src/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (32) ./src/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:190:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:193:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:195:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:196:40: E713 test for membership should be 'not in' -./src/tfscreen/tfmodel/configuration_io.py:202:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:203:31: E713 test for membership should be 'not in' -./src/tfscreen/tfmodel/configuration_io.py:209:18: W291 trailing whitespace -./src/tfscreen/tfmodel/configuration_io.py:225:33: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/configuration_io.py:237:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:251:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/configuration_io.py:251:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/configuration_io.py:253:1: C901 'read_configuration' is too complex (20) -./src/tfscreen/tfmodel/configuration_io.py:253:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:289:128: E501 line too long (139 > 127 characters) -./src/tfscreen/tfmodel/configuration_io.py:297:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:298:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:299:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:300:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:306:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:318:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:333:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:338:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:198:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:201:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:203:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:204:40: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:210:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:211:31: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:217:18: W291 trailing whitespace +./src/tfscreen/tfmodel/configuration_io.py:233:33: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/configuration_io.py:245:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:259:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/configuration_io.py:259:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/configuration_io.py:261:1: C901 'read_configuration' is too complex (20) +./src/tfscreen/tfmodel/configuration_io.py:261:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/configuration_io.py:298:128: E501 line too long (139 > 127 characters) +./src/tfscreen/tfmodel/configuration_io.py:309:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:310:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:311:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:312:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:313:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:319:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:331:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:346:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:351:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) @@ -3583,36 +7457,38 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:1790:27: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/model_orchestrator.py:1791:28: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/model_orchestrator.py:1792: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 -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:195:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:196:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:197:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:198:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:199:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:200:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:201:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:202:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:203:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:204:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:205:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:223:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:225:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:226:58: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:227:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:228:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:229:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:230:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:231:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:232:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:234:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:212:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:213:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:214:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:215:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:216:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:217:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:218:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:219:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:220:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:221:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:225:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:226:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:240:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:242:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:243:58: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:244:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:245:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:246:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:247:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:248:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:249:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:250:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:252:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' @@ -7019,66 +10895,65 @@ ./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_configure_and_run.py:134:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:151:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:155:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:71: E203 whitespace before ',' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:158:1: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:159:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:192:17: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:205:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:208:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:216:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:225:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:225:49: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:233:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:233:54: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:128: E501 line too long (142 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:236:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:239:76: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:128: E501 line too long (150 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:312:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:317:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:445:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:460:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:468:124: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:468:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:471:9: F841 local variable 'mock_ri_class' is assigned to but never used +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:474:44: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:490: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 @@ -7245,16 +11120,19 @@ ./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_base_growth.py:14:1: F401 'jax.numpy as jnp' imported but unused -./tests/tfscreen/tfmodel/test_base_growth.py:15:1: F401 'numpyro' imported but unused -./tests/tfscreen/tfmodel/test_base_growth.py:74:51: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:106:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:107:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:120:56: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:131:59: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:132:59: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:145:64: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/test_base_growth.py:146:64: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:18:1: F401 'jax.numpy as jnp' imported but unused +./tests/tfscreen/tfmodel/test_base_growth.py:19:1: F401 'numpyro' imported but unused +./tests/tfscreen/tfmodel/test_base_growth.py:80:51: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:112:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:113:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:126:56: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:137:59: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:138:59: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:151:64: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:152:64: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:180:60: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:181:60: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/test_base_growth.py:182:60: E127 continuation line over-indented for visual indent ./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 @@ -7304,52 +11182,52 @@ ./tests/tfscreen/tfmodel/test_model_orchestrator.py:502:18: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/test_model_orchestrator.py:503:18: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/test_model_orchestrator.py:673:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:821:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:825:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:833:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:839:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:840:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:842:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:844:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:856:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:861:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:869:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:877:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:888:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:891:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:898:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:905:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:913:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:918:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:923:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:929:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:938:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:942:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:952:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:953:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:955:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:956:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:968:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:983:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:984:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:987:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:990:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1253:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1650:34: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1894:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1908:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:823:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:827:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:835:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:842:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:844:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:846:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:858:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:863:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:871:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:890:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:893:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:900:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:907:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:915:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:920:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:925:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:931:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:940:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:944:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:954:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:955:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:957:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:958:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:976:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:985:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:986:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:989:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:992:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1255:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1652:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1896:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1910:1: E302 expected 2 blank lines, found 1 ./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 @@ -7652,52 +11530,52 @@ ./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 -48 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) -11 E117 over-indented -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 -205 E127 continuation line over-indented for visual indent -87 E128 continuation line under-indented for visual indent +96 C901 'cat_fit' is too complex (19) +20 E111 indentation is not a multiple of 4 +9 E114 indentation is not a multiple of 4 (comment) +8 E116 unexpected indentation (comment) +16 E117 over-indented +2 E122 continuation line missing indentation or outdented +3 E124 closing bracket does not match visual indentation +12 E125 continuation line with same indent as next logical line +261 E127 continuation line over-indented for visual indent +162 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 ',' -4 E211 whitespace before '(' -1841 E221 multiple spaces before operator -26 E222 multiple spaces after operator -8 E225 missing whitespace around operator -1105 E231 missing whitespace after ',' -103 E251 unexpected spaces around keyword / parameter equals -14 E252 missing whitespace around parameter equals -216 E261 at least two spaces before inline comment -1 E262 inline comment should start with '# ' +72 E201 whitespace after '[' +48 E202 whitespace before ']' +10 E203 whitespace before ',' +8 E211 whitespace before '(' +3034 E221 multiple spaces before operator +27 E222 multiple spaces after operator +16 E225 missing whitespace around operator +1998 E231 missing whitespace after ',' +127 E251 unexpected spaces around keyword / parameter equals +28 E252 missing whitespace around parameter equals +236 E261 at least two spaces before inline comment +2 E262 inline comment should start with '# ' 2 E265 block comment should start with '# ' -2 E266 too many leading '#' for block comment +3 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword -1 E301 expected 1 blank line, found 0 -782 E302 expected 2 blank lines, found 1 -50 E303 too many blank lines (2) -16 E305 expected 2 blank lines after class or function definition, found 1 +2 E301 expected 1 blank line, found 0 +950 E302 expected 2 blank lines, found 1 +90 E303 too many blank lines (2) +24 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 -37 E402 module level import not at top of file -86 E501 line too long (145 > 127 characters) -46 E701 multiple statements on one line (colon) -5 E712 comparison to True should be 'if cond is True:' or 'if cond:' -2 E713 test for membership should be 'not in' +2 E401 multiple imports on one line +54 E402 module level import not at top of file +138 E501 line too long (145 > 127 characters) +60 E701 multiple statements on one line (colon) +7 E712 comparison to True should be 'if cond is True:' or 'if cond:' +4 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def -20 E741 ambiguous variable name 'l' -232 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 -42 F841 local variable 'e' is assigned to but never used -629 W291 trailing whitespace -85 W292 no newline at end of file -1606 W293 blank line contains whitespace -30 W391 blank line at end of file -7654 +27 E741 ambiguous variable name 'l' +280 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +18 F541 f-string is missing placeholders +5 F811 redefinition of unused 'np' from line 1 +56 F841 local variable 'e' is assigned to but never used +1070 W291 trailing whitespace +133 W292 no newline at end of file +2178 W293 blank line contains whitespace +51 W391 blank line at end of file +11532 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 90cb634f..8d1da0d7 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/simulate/selection_experiment.py b/src/tfscreen/simulate/selection_experiment.py index ad7a10a7..5a1a8b0c 100644 --- a/src/tfscreen/simulate/selection_experiment.py +++ b/src/tfscreen/simulate/selection_experiment.py @@ -66,7 +66,7 @@ # Column selectors (rarely overridden) "condition_selector", "library_selector", # Optional output blocks - "binding_data", "presplit_data", + "binding_data", "presplit_data", "base_growth_data", }) def _check_dict_number( diff --git a/src/tfscreen/tfmodel/analysis/prediction.py b/src/tfscreen/tfmodel/analysis/prediction.py index ba118709..3e5d0659 100644 --- a/src/tfscreen/tfmodel/analysis/prediction.py +++ b/src/tfscreen/tfmodel/analysis/prediction.py @@ -69,6 +69,99 @@ def _align_site_to_tm_dims(spatial_shape, tm_sizes): return result +def _is_condition_rep_site(site_trace): + """ + Detect whether a model trace entry is plated purely on condition_rep + (e.g. ``condition_growth_k``/``condition_growth_m`` from the + ``growth/linear.py``, ``power.py``, ``saturation.py`` components). + + condition_rep is a TensorManager map_group (see + ``model_orchestrator._build_growth_tm``'s ``add_map_tensor(..., + name="condition_rep")`` call), not a pivot dimension of the 7-D growth + tensor, so it never appears in ``tensor_dim_names`` and can never be + aligned by ``_align_site_to_tm_dims``. + + Parameters + ---------- + site_trace : dict + A single entry from a NumPyro model trace (``model_trace[site]``). + + Returns + ------- + bool + True if the site's only plate is a ``"*_condition_parameters"`` + plate (the naming convention shared by all condition_growth + components). + """ + frames = site_trace.get("cond_indep_stack", []) + return ( + len(frames) == 1 + and frames[0].name.lower().endswith("_condition_parameters") + ) + + +def _condition_rep_output_df(growth_tm, site_samples, q_to_get, num_samples): + """ + Build a predict() output DataFrame for a site plated on condition_rep. + + condition_rep pools condition_pre and condition_sel labels into one + shared parameter index (see ``TensorManager.add_map_tensor`` and + ``model_orchestrator._build_growth_tm``), so a single growth_df row does + not correspond 1:1 to one condition_rep -- its pre-phase and sel-phase + conditions can resolve to different (or the same) condition_rep. + Forcing such a site onto the genotype/condition growth_df grid it does + not naturally belong to (as the generic TM-shape alignment used for + other sites would) silently mis-attributes values. Instead this reports + the site at its own natural grain -- one row per condition_rep -- + mirroring the convention already used by each component's + ``get_extract_specs()`` (consumed by ``tfs-extract-params``). + + Parameters + ---------- + growth_tm : TensorManager + The (possibly genotype/condition-subsetted) growth TensorManager + whose ``map_groups["condition_rep"]`` gives the condition_rep + ordering that ``site_samples`` is already aligned to (see the + condition_rep reindexing added to the parameter-slicing loop in + ``predict()``). + site_samples : array-like + Shape ``(num_samples, num_condition_rep)``. + q_to_get : dict + Mapping of output column name to quantile value. + num_samples : int or None + Number of posterior draws to report as ``sample_0`` ... columns. + + Returns + ------- + pd.DataFrame + One row per condition_rep, with metadata columns from + ``map_groups["condition_rep"]`` (e.g. ``library``, ``condition_rep``, + and ``replicate`` unless ``growth_shares_replicates``) plus quantile + and (optionally) sample columns. + """ + cond_rep_df = growth_tm.map_groups["condition_rep"] + df = (cond_rep_df + .sort_values("map_condition_rep") + .drop(columns=["map_condition_rep"]) + .reset_index(drop=True)) + + for q_name, q_val in q_to_get.items(): + df[q_name] = np.quantile(site_samples, q_val, axis=0) + + if num_samples is not None and num_samples > 0: + site_samples_np = np.array(site_samples) + S = site_samples_np.shape[0] + chosen = np.random.choice(S, size=num_samples, replace=num_samples > S) + samples_df = pd.DataFrame( + site_samples_np[chosen].T, + columns=[f"sample_{i}" for i in range(num_samples)], + index=df.index, + ) + df = pd.concat([df, samples_df], axis=1) + + return df + + def copy_orchestrator(orchestrator, t_pre=None, t_sel=None, @@ -457,19 +550,49 @@ def predict(orchestrator, val = val[sample_indices] - # Slice any plated dimension to match the new data labels. - # This handles genotype subsetting and any other model plates (like + # Slice any plated dimension to match the new data labels. + # This handles genotype subsetting and any other model plates (like # titrant_conc in congression/categorical models). for frame in site.get("cond_indep_stack", []): plate_name = frame.name.lower() - + + # condition_rep (the "*_condition_parameters" plate used by the + # condition_growth components -- see growth/linear.py, power.py, + # saturation.py) is never a tensor_dim_names entry: it is a + # TensorManager map_group that pools condition_pre and + # condition_sel labels into one shared index space, not a pivot + # dimension of the 7-D growth tensor. The substring search below + # against tensor_dim_names can never match it, so it needs its + # own reindexing path keyed on the condition_rep map_group table + # instead of tensor_dim_labels. + if plate_name.endswith("_condition_parameters"): + old_cond_df = (orchestrator.growth_tm.map_groups["condition_rep"] + .sort_values("map_condition_rep")) + new_cond_df = (new_orchestrator.growth_tm.map_groups["condition_rep"] + .sort_values("map_condition_rep")) + key_cols = [c for c in old_cond_df.columns if c != "map_condition_rep"] + old_keys = list(old_cond_df[key_cols].itertuples(index=False, name=None)) + new_keys = list(new_cond_df[key_cols].itertuples(index=False, name=None)) + + if old_keys != new_keys: + try: + indices = [old_keys.index(k) for k in new_keys] + except ValueError: + raise ValueError( + f"Site '{site_name}' is plated on condition_rep " + f"and cannot be expanded to new condition(s)." + ) + val = jnp.take(val, jnp.array(indices), axis=frame.dim) + + continue + # Find the corresponding dimension in the TensorManager dim_idx = None for i, name in enumerate(orchestrator.growth_tm.tensor_dim_names): if name.lower() in plate_name: dim_idx = i break - + if dim_idx is not None: old_labels = orchestrator.growth_tm.tensor_dim_labels[dim_idx] new_labels = new_orchestrator.growth_tm.tensor_dim_labels[dim_idx] @@ -558,6 +681,20 @@ def predict(orchestrator, for site in predict_sites: site_samples = predictions[site] # shape: (num_samples, ...) + # condition_rep-plated sites (e.g. condition_growth_k/m) have no + # genotype/replicate/time/condition_pre/condition_sel/titrant axis at + # all -- their only dimension is condition_rep, which is a + # TensorManager map_group, not a tensor_dim_names pivot axis. The + # generic TM-shape alignment below has no way to represent that + # axis, so it would silently mis-align them (e.g. always reporting + # the first condition_rep's value). Report these at their own + # natural grain instead. + if _is_condition_rep_site(model_trace.get(site, {})): + all_dfs[site] = _condition_rep_output_df( + tm, site_samples, q_to_get, num_samples + ) + continue + # Map each axis of the site's spatial shape to the correct TM dimension. # Right-to-left alignment works for full-rank and tail-aligned sites; # _align_site_to_tm_dims falls back to subsequence matching for sites diff --git a/tests/tfscreen/simulate/test_selection_experiment.py b/tests/tfscreen/simulate/test_selection_experiment.py index 7915b92f..bf34168e 100644 --- a/tests/tfscreen/simulate/test_selection_experiment.py +++ b/tests/tfscreen/simulate/test_selection_experiment.py @@ -1310,4 +1310,13 @@ def test_check_cf_multiple_unknown_keys(base_config: dict): def test_check_cf_all_known_keys_accepted(base_config: dict): # Every key in the fixture must already be a known key; no error should be raised. - _check_cf(base_config) \ No newline at end of file + _check_cf(base_config) + + +def test_check_cf_accepts_base_growth_data(base_config: dict): + """base_growth_data must be a recognized optional output block (it drives + tfs-simulate's simulated base_growth CSV -- see + simulate/base_growth_data.py and simulate/scripts/simulate_cli.py).""" + cf = dict(base_config) + cf["base_growth_data"] = {"k_ref": 0.025} + _check_cf(cf) \ No newline at end of file diff --git a/tests/tfscreen/tfmodel/analysis/test_prediction.py b/tests/tfscreen/tfmodel/analysis/test_prediction.py index 83f2dd8e..17802b12 100644 --- a/tests/tfscreen/tfmodel/analysis/test_prediction.py +++ b/tests/tfscreen/tfmodel/analysis/test_prediction.py @@ -684,3 +684,119 @@ def test_no_population_reference_when_transformation_does_not_need_one( ) assert captured["data"].growth.external_theta_population is None + + +# --------------------------------------------------------------------------- +# predict() output alignment for condition_rep-plated sites +# --------------------------------------------------------------------------- + +class TestPredictConditionRepSites: + """ + condition_growth_k/m (growth/linear.py) are plated on condition_rep -- a + TensorManager map_group that pools condition_pre and condition_sel + labels into one shared index space, never a tensor_dim_names pivot + axis. Verify predict() reports genuinely distinct per-condition values + for such sites instead of silently broadcasting the first + condition_rep's value to every row (the bug fixed by + _is_condition_rep_site / _condition_rep_output_df in prediction.py). + """ + + @pytest.fixture + def multi_condition_orchestrator(self): + """Two genotypes, both spanning two distinct condition_sel values + (same condition_pre throughout), giving num_condition_rep == 3 + ('pre-1', 'sel+1', 'sel+2').""" + growth_df = pd.DataFrame({ + "library": ["lib"] * 8, + "genotype": ["wt", "wt", "wt", "wt", + "M42V", "M42V", "M42V", "M42V"], + "titrant_name": ["tit1"] * 8, + "titrant_conc": [0.0, 1.0, 0.0, 1.0] * 2, + "condition_pre": ["pre-1"] * 8, + "condition_sel": ["sel+1", "sel+1", "sel+2", "sel+2"] * 2, + "t_pre": [10.0] * 8, + "t_sel": [0.0, 20.0, 0.0, 20.0] * 2, + "ln_cfu": [0.0, 5.0, 0.0, 3.0] * 2, + "ln_cfu_std": [0.1] * 8, + "replicate": [1] * 8, + }) + binding_df = pd.DataFrame({ + "genotype": ["wt", "M42V"], + "titrant_name": ["tit1", "tit1"], + "titrant_conc": [0.5, 0.5], + "theta_obs": [0.5, 0.2], + "theta_std": [0.01, 0.01], + }) + return ModelOrchestrator(growth_df, binding_df, transformation="single") + + def _fake_posteriors(self, orchestrator, condition_growth_k_values): + from numpyro.handlers import seed, trace as nptrace + + seeded = seed(orchestrator.jax_model, rng_seed=0) + model_tr = nptrace(seeded).get_trace( + data=orchestrator.data, priors=orchestrator.priors, + ) + fake_posteriors = { + name: np.zeros((1,) + site["value"].shape) + for name, site in model_tr.items() + if site["type"] == "sample" and not site.get("is_observed", False) + } + assert fake_posteriors["condition_growth_k"].shape[1] == len(condition_growth_k_values) + fake_posteriors["condition_growth_k"] = np.asarray([condition_growth_k_values]) + return fake_posteriors + + def test_condition_growth_k_differs_by_condition_rep( + self, multi_condition_orchestrator): + # num_condition_rep == 3, sorted alphabetically: pre-1, sel+1, sel+2 + true_values = [0.111, 0.222, 0.333] + fake_posteriors = self._fake_posteriors( + multi_condition_orchestrator, true_values + ) + + result = predict( + multi_condition_orchestrator, + fake_posteriors, + predict_sites=["condition_growth_k"], + num_samples=None, + num_marginal_samples=1, + genotypes=["wt"], + ) + + assert len(result) == 3 + assert set(result["condition_rep"]) == {"pre-1", "sel+1", "sel+2"} + + by_cond = result.set_index("condition_rep")["q0.5"] + assert np.isclose(by_cond["pre-1"], 0.111) + assert np.isclose(by_cond["sel+1"], 0.222) + assert np.isclose(by_cond["sel+2"], 0.333) + + # The historical bug reported every row with the first + # condition_rep's value -- guard against regressing to that. + assert len(set(np.round(by_cond.values, 6))) == 3 + + def test_condition_growth_k_and_m_together( + self, multi_condition_orchestrator): + """Requesting condition_growth_k and condition_growth_m together + (as in the originally reported bug) must independently align each + site to its own condition_rep values.""" + fake_posteriors = self._fake_posteriors( + multi_condition_orchestrator, [0.111, 0.222, 0.333] + ) + fake_posteriors["condition_growth_m"] = np.asarray([[0.01, 0.02, 0.03]]) + + result = predict( + multi_condition_orchestrator, + fake_posteriors, + predict_sites=["condition_growth_k", "condition_growth_m"], + num_samples=None, + num_marginal_samples=1, + genotypes=["wt"], + ) + + k_df = result["condition_growth_k"].set_index("condition_rep")["q0.5"] + m_df = result["condition_growth_m"].set_index("condition_rep")["q0.5"] + + assert np.isclose(k_df["sel+1"], 0.222) + assert np.isclose(k_df["sel+2"], 0.333) + assert np.isclose(m_df["sel+1"], 0.02) + assert np.isclose(m_df["sel+2"], 0.03) From 66166438b14d4e168627301e8f22d8622a425b9f Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 17:21:00 -0700 Subject: [PATCH 12/30] moved presplit and base_growth into observer --- CLAUDE.md | 1 + docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- examples/simulate/.simulate_config.yaml.swp | Bin 0 -> 16384 bytes examples/simulate/simulate_config.yaml | 7 +- reports/flake.txt | 439 +++++++++--------- reports/junit/junit.xml | 2 +- src/tfscreen/tfmodel/generative/model.py | 102 ++-- .../tfmodel/generative/observe/base_growth.py | 111 +++++ .../tfmodel/generative/observe/presplit.py | 90 ++++ src/tfscreen/tfmodel/generative/registry.py | 8 +- src/tfscreen/tfmodel/model_orchestrator.py | 33 ++ .../observe/test_observe_base_growth.py | 194 ++++++++ .../observe/test_observe_presplit.py | 181 ++++++++ .../tfmodel/generative/test_registry.py | 3 +- tests/tfscreen/tfmodel/test_base_growth.py | 14 + .../tfmodel/test_model_orchestrator.py | 32 ++ 17 files changed, 923 insertions(+), 298 deletions(-) create mode 100644 examples/simulate/.simulate_config.yaml.swp create mode 100644 src/tfscreen/tfmodel/generative/observe/base_growth.py create mode 100644 src/tfscreen/tfmodel/generative/observe/presplit.py create mode 100644 tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py create mode 100644 tests/tfscreen/tfmodel/generative/observe/test_observe_presplit.py diff --git a/CLAUDE.md b/CLAUDE.md index 91457418..127a3d4a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -189,6 +189,7 @@ The optional `base_growth_data` YAML block generates a simulated `base_growth_df - Config: `k_ref` (required, the reference wt growth rate) plus optional `genotypes` (default `["wt"]`), `rates` (per-genotype true-rate override), and `noise`. - Every requested genotype must already exist in `parameters_df` — `dk_geno` is looked up from the value already assigned during the normal per-library draw (`_assign_dk_geno` in `thermo_to_growth.py`), never redrawn. This mirrors the inference-side requirement that `base_growth_df` genotypes already exist in `growth_df`. - `rate_true = k_ref + dk_geno[genotype]` unless overridden via `rates`; the observed `rate` adds Gaussian noise (sigma = `noise`), and `rate_std` is reported as that same flat `noise` value for every row (matching the `binding_data.noise` → `theta_std` convention). +- **`noise` must be strictly positive if the CSV is fed to `tfs-configure-model --base_growth_df`.** `rate_std` is used directly as a Normal likelihood scale — both when `_read_base_growth_df` inverse-variance-combines multiple rows per genotype, and in the `base_growth_obs` likelihood itself. `rate_std == 0.0` (the default when `noise` is omitted) causes a division-by-zero (`1/rate_std**2`) that produces a NaN `k_ref` prior location, surfacing as a numpyro "invalid loc parameter" crash the first time the model is traced (`tfs-prefit-calibration` or `tfs-fit-model`) — not at `tfs-simulate` or `tfs-configure-model` time, which makes it confusing to diagnose. `_read_base_growth_df` raises a clear `ValueError` naming the offending genotypes if any `rate_std <= 0` is present. ### theta_gc_override and theta_params_override diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 7d01273f..321067b6 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 99.32%coverage99.32% \ No newline at end of file +coverage: 96.48%coverage96.48% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 6c98efaa..0d03591a 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3801tests3801 \ No newline at end of file +tests: 3819tests3819 \ No newline at end of file diff --git a/examples/simulate/.simulate_config.yaml.swp b/examples/simulate/.simulate_config.yaml.swp new file mode 100644 index 0000000000000000000000000000000000000000..e31a9141cc4c223d4c482253499fde00040f3a32 GIT binary patch literal 16384 zcmeI3O^h5z6~{XS<3I=?ath*5StIRkyfgcen1nSX_#=VHiESmebBLm$rn_dQvOV4H zuIil~4v-kcfq?kFAP#TD`Sw&0lMYC zr@O1_)vNz|_4TT^zjo>IC)J0#>k-#`qUg#OAAkPWcmMPQS3Y-JG}7hRjV0mwS6^pa z?)q6m>ZfXftCPIkS}n?aSnBcEX2aE?^_@7)GvikMz{RC8*{a#m<09pav*Rk&-pp@$ zah?tAushY`^ag5ev$PDf4AczV72UtFz9#oa7VcGdzxQHGOv^yaK+8bOK+8bOK+8bO zK+8bO!2b~gzBm+pn)be>Y4gL)?``{j-)yck&HG38rT?Qz|3vft^ZU}@Xwqjpjz8{8 zzrA_BulaqXQDCM=^Sb?M8E6@38E6@38E6@38E6@38E6@38E6@38E6^!4;au%6upCT z?~{!-=l`?)|C{fQqF2Dzz@y+aI0XLkt|a0t9gfFS{QgI^Ks_y%|kyg|EP1_lTR_kj93 zqOQG?yy~Y$jVrG+@48AoW7EV>3!{c6%fpRMCwl5sX<}oyjZ=PPqJu=0X2@p^rTwHy z)F>~VaiiR*qO^IbCL@zcL6zEmsmrOdS)5jhaR*8oYhT(OluErVQX6Y;^9XA`oy5fXxX2y3KTalPE>}Ux(k(b`7L0*-rfYRDP@MDH~X^q=d8LiXligLb+ zw>tg2%951>g<%Y@dm}p>t*A3ADqB`bsV5nVB&IO@m-%$6bSV;)R?l3(0S2ZtS!`nm+fMeY6-IkLE75=+shOf0|E3z4NraD*J)7PG1YHf!_=*$UB+&~%Z$?K#o0oEGDaG%~ao)X8Z5jMnZ)=-saeC3&8Js`IMS8d|PE}5q52R~< z&x!M#I#GBVpVr=6aiL>MtjYI3%2{u)s_~5}7aASTZS+p9Z}iR_>s?&y>F)V6Gwu>Q zM$?J)BUKBg)95lDAt$C~MxEPOQR^EWa-rXa(4u6T>9LKkqN*58osC^X;!IR0kK?M) zSv;*9+c31PQ=2HW6Pv=Tg&yA}@qN;QT8ep3Hw~ViXX$iVEdEsB2MJjy_;N1)KSAY)`EEGy^sAc z9%`p1j|gsg9C{HSO7SB(c_3>{ zVM&yCJVk;og=cbT-_$~_A|%v~oKQmhp;AZG_<;?(y7kZl>A&Aj zsq)sfvu@H&YiDSpE9{m@dd^&S3=}Fg*^pkx3^DQYQhfbXp7}CQ867THGU71?neMQw zwz8Zda+^s`X3J$6-{}q%4Kii=e6n(0^-Y-Tn43%#d7BzO@EiAYhUaG&9K%CuI_nE7 zYIeUN_w_{FS?_EtJckDLBRVl6$jpThwIiyDB%1{vcU0sjd|DWio!U{Fv3iOYi;c9M z&d#Fx2py7nF4HN+o9gE?)T}MiX`4#+7N1IS%>-98Q!gT(8QDE!xr$SnIawCu$Ow~q zkhMG4i#|=YK^w%eI@u{0*f7KW#ikm1O)rrS73{s6c#K4G>)@{BzmXY!$ui4#+W0?bfMt22XTndjfN&Ay3m{tH#?)fU3`j~@pPPjQ~GxLjgnV&#Gb z=${*FinTzND;?X!u{?40N8oq6;PwMhq63 z<$T3Hx0Ceeeg3fsQQ|RY&t8b4dKjfwhuP+aC(K(rkz9Ymlo|AfCrqp~-z1$rdtyFG zsA~t9fi0cy%|;xSn9e4Z*;E@3BILx}Uf3ffsH__I=~_ZNey>7tM$^tf_A2vS*Ve;u zC(F)W$hWE1kp5Ktij9#JU1RaMqBgqfY>pVV8f>DLGQ;A41?)1;!p?|^EM+}z61v;X zUZXwHZ2P3wvsR`}vJJZ>D>d2w|B1czkJx+5{(pA<{wjO@&w?u;1J8l8;1u{EI126o zcYwp-XT$)$3QmJl;P1o%egL+B1((31;1u{9v4K~>%ivq!o8Sp>JNPj%g0hJhe3ak6 z5-a!#_zZXvd>Cwk*U?vW{-NmIUM&MH11$qB11$qB11$spqYTI~g6vaR(KewLRmNKw>XMH~2$NRFgl{ zBp%xd5zcyp)#()ECaU0j$pDQIb1q}Ko=+r5t(HntA7W4!<>f>m&w3PDnFqwfE^L2@ zIn8?Upz5vld|A;x*+jEO=YeRI><~iqHY}k-@pF|gDo+h*HO|;1|La;;AVI2_{q~%f z!vfStP1zDyHsy7ewOLGOWZAV#TpI4`D6g2n>n);CeS=yi1Pf?g$C;E6j~s)b`owe2 z5Do!qfucRFN-W1p95jdwj6(D_1iR&6NBE>xA>PXNgg>awaR~x*q0PHgO4#kBiLtU# zQbf*_E{sG(^LMtjL3bUDeU80c5$&keCg|YVyLNnSljrLQo-_qP5~(KQC3(pd_^)g2`qv52oWfBU?mN)DX7BBoh z7VA?B7qTMu=5K$`OLqtkEk>U?rgV*^nR(>c>4x0s#xhA8_8M?)J-pzM=79$<1zWE_ z6y8V-F2upb;GK}%3y(Zfhag0F_v2l!aIj-x~J$#Q#D`m>^sxXG \ No newline at end of file + \ No newline at end of file diff --git a/src/tfscreen/tfmodel/generative/model.py b/src/tfscreen/tfmodel/generative/model.py index 039f394b..b895ff89 100644 --- a/src/tfscreen/tfmodel/generative/model.py +++ b/src/tfscreen/tfmodel/generative/model.py @@ -7,7 +7,6 @@ import jax.numpy as jnp import numpyro as pyro -import numpyro.distributions as dist def jax_model(data: DataClass, priors: PriorsClass, @@ -37,11 +36,13 @@ def jax_model(data: DataClass, - calculate_growth - theta_binding_noise - theta_growth_noise - - binding_observer - - growth_observer + - observe_binding + - observe_growth - is_guide - The dictionary can also optionally have `batch_idx` (which overrides - whatever is in `batch_size`) or `batch_size`. + The dictionary can also optionally have `observe_presplit` and/or + `observe_base_growth` (the side-channel observers, present only when + their data was supplied), plus `batch_idx` (which overrides whatever + is in `batch_size`) or `batch_size`. """ # ------------------------------------------------------------------------- @@ -88,6 +89,13 @@ def jax_model(data: DataClass, calculate_growth = control["calculate_growth"] growth_observer = control["observe_growth"] + # Optional side-channel observers. Present in `control` only when their + # data was supplied (see model_orchestrator._initialize_classes). Each is + # the .observe function in the main model and the .guide function in the + # guide, exactly like binding_observer/growth_observer. + presplit_observer = control.get("observe_presplit") + base_growth_observer = control.get("observe_base_growth") + # ------------------------------------------------------------------------- # Calculate theta @@ -126,32 +134,6 @@ def jax_model(data: DataClass, data.growth, priors.growth.dk_geno) - # Optional base_growth calibration: a shared k_ref scalar tying dk_geno - # to direct growth-rate measurements for a subset of genotypes (wt at - # minimum) -- see data_class.BaseGrowthData and - # model_orchestrator._read_base_growth_df. Sampled unconditionally (both - # is_guide branches) so the guide registers the site; the actual - # likelihood (base_growth_obs, below) only fires in the non-guide branch. - if getattr(data, "base_growth", None) is not None: - if is_guide: - k_ref_loc = pyro.param( - "base_growth_k_ref_loc", - jnp.array(priors.growth.base_growth.k_ref_loc), - ) - k_ref_scale = pyro.param( - "base_growth_k_ref_scale", - jnp.array(priors.growth.base_growth.k_ref_scale), - constraint=dist.constraints.greater_than(1e-4), - ) - k_ref = pyro.sample("base_growth_k_ref", - dist.Normal(k_ref_loc, k_ref_scale)) - else: - k_ref = pyro.sample( - "base_growth_k_ref", - dist.Normal(priors.growth.base_growth.k_ref_loc, - priors.growth.base_growth.k_ref_scale), - ) - # activity activity = activity_model("activity", data.growth, @@ -245,54 +227,32 @@ def jax_model(data: DataClass, growth_observer("final_binding_obs", data.growth, None) binding_observer("final_growth_obs", data.binding, None) + # Register side-channel guide sites. presplit.guide is a no-op (it + # introduces no latents); base_growth.guide registers the k_ref + # variational site so the guide matches the model. + if presplit_observer is not None: + presplit_observer("presplit", data.presplit, ln_cfu0, + growth=data.growth) + if base_growth_observer is not None: + base_growth_observer("base_growth", data.base_growth, dk_geno, + growth=data.growth, + priors=priors.growth.base_growth) + # real calculation else: # Pre-split (t = -t_pre) observations — direct constraint on ln_cfu0. - # ln_cfu0 shape: (num_rep, 1, num_cp, 1, 1, 1, batch_size) - # Squeeze broadcast dims to get (num_rep, num_cp, batch_size). - if getattr(data, "presplit", None) is not None: - ln_cfu0_3d = ln_cfu0[:, 0, :, 0, 0, 0, :] - ps = data.presplit - bi = data.growth.batch_idx - obs_t0 = ps.ln_cfu_t0[:, :, bi] - std_t0 = ps.ln_cfu_t0_std[:, :, bi] - mask_t0 = ps.good_mask[:, :, bi] - with pyro.plate("presplit_replicate", - size=ps.num_replicate, dim=-3): - with pyro.plate("presplit_condition_pre", - size=ps.num_condition_pre, dim=-2): - with pyro.plate("shared_genotype_plate", - size=data.growth.batch_size, dim=-1): - with pyro.handlers.scale( - scale=data.growth.scale_vector): - with pyro.handlers.mask(mask=mask_t0): - pyro.sample( - "presplit_obs", - dist.Normal(ln_cfu0_3d, std_t0), - obs=obs_t0, - ) + if presplit_observer is not None: + presplit_observer("presplit", data.presplit, ln_cfu0, + growth=data.growth) # Direct growth-rate measurements — anchors k_ref (and, via dk_geno's # wt=0 pin, the shared k/m identifiability slack) to genotypes with # a directly-measured reference-condition growth rate. - # dk_geno shape: (1,1,1,1,1,1,batch_size) -> flatten to (batch_size,). - if getattr(data, "base_growth", None) is not None: - bg = data.base_growth - bi = data.growth.batch_idx - rate_obs = bg.rate_obs[bi] - rate_std = bg.rate_std[bi] - mask = bg.good_mask[bi] - dk_geno_flat = dk_geno[0, 0, 0, 0, 0, 0, :] - with pyro.plate("shared_genotype_plate", - size=data.growth.batch_size, dim=-1): - with pyro.handlers.scale(scale=data.growth.scale_vector): - with pyro.handlers.mask(mask=mask): - pyro.sample( - "base_growth_obs", - dist.Normal(k_ref + dk_geno_flat, rate_std), - obs=rate_obs, - ) + if base_growth_observer is not None: + base_growth_observer("base_growth", data.base_growth, dk_geno, + growth=data.growth, + priors=priors.growth.base_growth) # calculate observable (all tensors have correct dimensions) g_pre, g_sel = calculate_growth(params=growth_params, diff --git a/src/tfscreen/tfmodel/generative/observe/base_growth.py b/src/tfscreen/tfmodel/generative/observe/base_growth.py new file mode 100644 index 00000000..b004aefd --- /dev/null +++ b/src/tfscreen/tfmodel/generative/observe/base_growth.py @@ -0,0 +1,111 @@ +import numpyro as pyro +import numpyro.distributions as dist + +from jax import numpy as jnp + +from tfscreen.tfmodel.data_class import ( + BaseGrowthData, + GrowthData, + BaseGrowthPriors, +) + + +def observe(name: str, + data: BaseGrowthData, + dk_geno: jnp.ndarray, + *, + growth: GrowthData, + priors: BaseGrowthPriors): + """ + Defines the observation site for the base (reference-condition) + growth-rate data. + + Unlike growth/binding, this measurement is taken independent of the + titrant/selection system -- it is a direct read of the reference-condition + growth rate for a subset of genotypes. It anchors a shared global scalar + ``k_ref`` and ties it, via the per-genotype ``dk_geno`` latent (with + ``dk_geno_wt == 0`` pinned), to genotypes with a directly-measured growth + rate. This resolves the k/m identifiability confound described in + ``BaseGrowthData`` and ``model_orchestrator._read_base_growth_df``. + + This observer *owns* the ``k_ref`` latent -- it is sampled here (from its + prior) and used only in the ``{name}_obs`` likelihood, exactly the way the + growth observer owns its ``nu`` degrees-of-freedom latent. The companion + ``guide`` provides the matching variational site. + + The genotype batch state (``batch_idx``/``batch_size``/``scale_vector``) + is borrowed from the companion GrowthData so the genotype axis stays + aligned with the growth mini-batch, and the innermost plate is the shared + ``"shared_genotype_plate"``. A mask (``data.good_mask``) excludes + genotypes with no measurement from the likelihood. + + Parameters + ---------- + name : str + Prefix for the ``k_ref`` and observation sample sites. + data : BaseGrowthData + Base growth-rate observations, shaped ``(num_genotype,)``. + dk_geno : jnp.ndarray + The per-genotype pleiotropic growth-effect latent from the growth + model, shaped ``(1, 1, 1, 1, 1, 1, batch_size)``. Flattened here to + ``(batch_size,)``. + growth : GrowthData + The companion growth data, used only for its genotype batch state + (``batch_idx``, ``batch_size``, ``scale_vector``). + priors : BaseGrowthPriors + Prior (loc, scale) for the ``k_ref`` scalar. + """ + + k_ref = pyro.sample(f"{name}_k_ref", + dist.Normal(priors.k_ref_loc, priors.k_ref_scale)) + + bi = growth.batch_idx + rate_obs = data.rate_obs[bi] + rate_std = data.rate_std[bi] + mask = data.good_mask[bi] + + # dk_geno shape: (1,1,1,1,1,1,batch_size) -> flatten to (batch_size,). + dk_geno_flat = dk_geno[0, 0, 0, 0, 0, 0, :] + + with pyro.plate("shared_genotype_plate", + size=growth.batch_size, dim=-1): + + # Scale data for sub-sampling + with pyro.handlers.scale(scale=growth.scale_vector): + + # Apply mask for good observations + with pyro.handlers.mask(mask=mask): + + # Define the observation site + pyro.sample(f"{name}_obs", + dist.Normal(k_ref + dk_geno_flat, rate_std), + obs=rate_obs) + + +def guide(name: str, + data: BaseGrowthData, + dk_geno: jnp.ndarray, + *, + growth: GrowthData, + priors: BaseGrowthPriors): + """ + Guide corresponding to the observation function. + + Registers the ``k_ref`` variational site. The location and scale are + ``pyro.param``s initialized from the prior; the scale is constrained + ``> 1e-4`` to avoid variational scale collapse (see + ``feedback_svi_nan_scale_collapse``). This mirrors the growth observer's + treatment of its ``nu`` latent. + + ``dk_geno`` and ``growth`` are accepted for signature parallelism with + ``observe`` but are not used here (no likelihood is evaluated in the guide). + """ + + k_ref_loc = pyro.param(f"{name}_k_ref_loc", + jnp.array(priors.k_ref_loc)) + k_ref_scale = pyro.param(f"{name}_k_ref_scale", + jnp.array(priors.k_ref_scale), + constraint=dist.constraints.greater_than(1e-4)) + pyro.sample(f"{name}_k_ref", dist.Normal(k_ref_loc, k_ref_scale)) + + return diff --git a/src/tfscreen/tfmodel/generative/observe/presplit.py b/src/tfscreen/tfmodel/generative/observe/presplit.py new file mode 100644 index 00000000..68129e3c --- /dev/null +++ b/src/tfscreen/tfmodel/generative/observe/presplit.py @@ -0,0 +1,90 @@ +import numpyro as pyro +import numpyro.distributions as dist + +from jax import numpy as jnp + +from tfscreen.tfmodel.data_class import PreSplitData, GrowthData + + +def observe(name: str, + data: PreSplitData, + ln_cfu0: jnp.ndarray, + *, + growth: GrowthData): + """ + Defines the observation site for the pre-split (t = -t_pre) data. + + These observations come from a single pooled aliquot taken just before + the culture is split into titrant-concentration conditions, so the + prediction for each observation is simply the initial-population + parameter ``ln_cfu0[replicate, condition_pre, genotype]``. This makes + the site a direct side-channel constraint on ``ln_cfu0``. + + The pre-split data has no latent parameters of its own -- it reuses the + ``ln_cfu0`` latent sampled in the main growth model, and it borrows the + genotype batch state (``batch_idx``/``batch_size``/``scale_vector``) from + the companion GrowthData so that its genotype axis stays aligned with the + growth mini-batch. The innermost plate is therefore the *shared* + ``"shared_genotype_plate"`` (not a prefixed one), matching the growth + observer and the activity/dk_geno components so Numpyro shares the + genotype subsample across all sites. + + A mask (``data.good_mask``) excludes bad-quality or missing observations + from the log-likelihood. + + Parameters + ---------- + name : str + Prefix for the pre-split plate and sample sites. + data : PreSplitData + Pre-split observations, shaped + ``(num_replicate, num_condition_pre, num_genotype)``. + ln_cfu0 : jnp.ndarray + The initial-population latent from the growth model, shaped + ``(num_rep, 1, num_cp, 1, 1, 1, batch_size)``. Squeezed here to + ``(num_rep, num_cp, batch_size)`` before being used as the prediction. + growth : GrowthData + The companion growth data, used only for its genotype batch state + (``batch_idx``, ``batch_size``, ``scale_vector``). + """ + + # ln_cfu0 shape: (num_rep, 1, num_cp, 1, 1, 1, batch_size) + # Squeeze broadcast dims to get (num_rep, num_cp, batch_size). + ln_cfu0_3d = ln_cfu0[:, 0, :, 0, 0, 0, :] + + bi = growth.batch_idx + obs_t0 = data.ln_cfu_t0[:, :, bi] + std_t0 = data.ln_cfu_t0_std[:, :, bi] + mask_t0 = data.good_mask[:, :, bi] + + with pyro.plate(f"{name}_replicate", size=data.num_replicate, dim=-3): + with pyro.plate(f"{name}_condition_pre", size=data.num_condition_pre, dim=-2): + with pyro.plate("shared_genotype_plate", + size=growth.batch_size, dim=-1): + + # Scale data for sub-sampling + with pyro.handlers.scale(scale=growth.scale_vector): + + # Apply mask for good observations + with pyro.handlers.mask(mask=mask_t0): + + # Define the observation site + pyro.sample(f"{name}_obs", + dist.Normal(ln_cfu0_3d, std_t0), + obs=obs_t0) + + +def guide(name: str, + data: PreSplitData, + ln_cfu0: jnp.ndarray, + *, + growth: GrowthData): + """ + Guide corresponding to the observation function. + + This function does nothing, as the pre-split observations introduce no + latent variables of their own (they constrain the ``ln_cfu0`` latent + that is already sampled and guided by the growth model). + """ + + return diff --git a/src/tfscreen/tfmodel/generative/registry.py b/src/tfscreen/tfmodel/generative/registry.py index 14c30560..991cc951 100644 --- a/src/tfscreen/tfmodel/generative/registry.py +++ b/src/tfscreen/tfmodel/generative/registry.py @@ -55,8 +55,10 @@ from .components.sample_offset import zero as sample_offset_zero from .components.sample_offset import normal as sample_offset_normal -from .observe import binding -from .observe import growth +from .observe import binding +from .observe import growth +from .observe import presplit +from .observe import base_growth model_registry = { "condition_growth":{ @@ -134,4 +136,6 @@ }, "observe_binding":binding, "observe_growth":growth, + "observe_presplit":presplit, + "observe_base_growth":base_growth, } diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index e6554459..59fabc43 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -540,6 +540,21 @@ def _read_base_growth_df(base_growth_df, growth_df): required_columns=["genotype", "rate", "rate_std"], ) + non_positive = base_growth_df["rate_std"].to_numpy(dtype=float) <= 0 + if non_positive.any(): + bad_genotypes = sorted( + base_growth_df.loc[non_positive, "genotype"].astype(str).unique() + ) + raise ValueError( + f"base_growth_df has non-positive rate_std for genotype(s) " + f"{bad_genotypes}. rate_std is used as a Normal likelihood's " + f"scale (both for combining multiple rows per genotype via " + f"inverse-variance weighting, and for the base_growth_obs " + f"likelihood itself) and must be strictly positive. If this " + f"file came from tfs-simulate's base_growth_data block, set " + f"'noise' to a positive value there." + ) + growth_genotypes = set(growth_df["genotype"]) mask = base_growth_df["genotype"].isin(growth_genotypes) n_dropped = int((~mask).sum()) @@ -1620,6 +1635,24 @@ def _initialize_classes(self): main_control_kwargs["observe_growth"] = model_registry["observe_growth"].observe guide_control_kwargs["observe_growth"] = model_registry["observe_growth"].guide + # Optional side-channel observers -- wired only when their data was + # supplied. Both borrow growth's genotype batch state and a latent + # from the growth model (ln_cfu0 for presplit, dk_geno for + # base_growth); base_growth additionally owns the k_ref latent. + # Gate on the raw source flags (mirroring the base_growth priors + # block below), not on self._data, which the corresponding + # DataClass fields also reflect. + if self._presplit_df is not None: + main_control_kwargs["observe_presplit"] = \ + model_registry["observe_presplit"].observe + guide_control_kwargs["observe_presplit"] = \ + model_registry["observe_presplit"].guide + if self._base_growth_df is not None: + main_control_kwargs["observe_base_growth"] = \ + model_registry["observe_base_growth"].observe + guide_control_kwargs["observe_base_growth"] = \ + model_registry["observe_base_growth"].guide + if self._binding_only: main_control_kwargs["binding_only"] = True guide_control_kwargs["binding_only"] = True diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py new file mode 100644 index 00000000..02165cc1 --- /dev/null +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py @@ -0,0 +1,194 @@ +import pytest +import jax +import jax.numpy as jnp +import numpyro.distributions as dist +from numpyro.handlers import trace, seed, substitute +from collections import namedtuple + +# --- Import Module Under Test (MUT) --- +from tfscreen.tfmodel.generative.observe.base_growth import observe, guide + +# --- Mock Data Fixtures --- + +MockBaseGrowth = namedtuple("MockBaseGrowth", [ + "rate_obs", + "rate_std", + "good_mask", + "num_genotype", +]) + +MockGrowth = namedtuple("MockGrowth", [ + "batch_idx", + "batch_size", + "scale_vector", +]) + +MockPriors = namedtuple("MockPriors", ["k_ref_loc", "k_ref_scale"]) + + +@pytest.fixture +def mock_data(): + """ + Base-growth data shaped (num_genotype,) = (4,). rate_obs[g] == g so + genotype slicing is detectable. One entry masked bad. + """ + num_genotype = 4 + rate_obs = jnp.arange(num_genotype, dtype=float) + rate_std = jnp.ones(num_genotype) * 0.1 + + good_mask = jnp.ones(num_genotype, dtype=bool) + good_mask = good_mask.at[0].set(False) + + return MockBaseGrowth( + rate_obs=rate_obs, + rate_std=rate_std, + good_mask=good_mask, + num_genotype=num_genotype, + ) + + +@pytest.fixture +def full_growth(): + """Full (no-subsample) genotype batch: idx 0..3, unit scale.""" + batch_size = 4 + return MockGrowth( + batch_idx=jnp.arange(batch_size), + batch_size=batch_size, + scale_vector=jnp.ones(batch_size), + ) + + +@pytest.fixture +def priors(): + return MockPriors(k_ref_loc=0.5, k_ref_scale=0.2) + + +def _dk_geno(batch_size, value=0.1): + """Growth-model dk_geno tensor (1,1,1,1,1,1,batch_size).""" + return jnp.ones((1, 1, 1, 1, 1, 1, batch_size)) * value + + +def test_observe_k_ref_site(mock_data, full_growth, priors): + """observe samples k_ref from a Normal(prior loc, prior scale).""" + name = "base_growth" + dk_geno = _dk_geno(full_growth.batch_size) + + tr = trace(seed(observe, jax.random.PRNGKey(0))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=full_growth, priors=priors, + ) + + k_ref_name = f"{name}_k_ref" + assert k_ref_name in tr + assert not tr[k_ref_name]["is_observed"] + fn = tr[k_ref_name]["fn"] + assert isinstance(fn, dist.Normal) + assert jnp.allclose(fn.loc, priors.k_ref_loc) + assert jnp.allclose(fn.scale, priors.k_ref_scale) + + +def test_observe_obs_site_structure(mock_data, full_growth, priors): + """observe creates a masked Normal at '{name}_obs' with + loc == k_ref + dk_geno_flat and scale/obs sliced by batch_idx.""" + name = "base_growth" + fixed_k_ref = 0.7 + dk_geno = _dk_geno(full_growth.batch_size, value=0.1) + + conditioned = substitute(observe, data={f"{name}_k_ref": fixed_k_ref}) + tr = trace(seed(conditioned, jax.random.PRNGKey(1))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=full_growth, priors=priors, + ) + + obs_name = f"{name}_obs" + assert obs_name in tr + site = tr[obs_name] + assert site["is_observed"] + assert isinstance(site["fn"], dist.MaskedDistribution) + + base = site["fn"].base_dist + assert isinstance(base, dist.Normal) + + dk_flat = dk_geno[0, 0, 0, 0, 0, 0, :] + assert jnp.allclose(base.loc, fixed_k_ref + dk_flat) + + bi = full_growth.batch_idx + assert jnp.allclose(base.scale, mock_data.rate_std[bi]) + assert jnp.allclose(site["value"], mock_data.rate_obs[bi]) + + +def test_observe_uses_shared_genotype_plate(mock_data, full_growth, priors): + """The likelihood plate must be the shared, unprefixed + 'shared_genotype_plate', not a name-prefixed one.""" + name = "base_growth" + dk_geno = _dk_geno(full_growth.batch_size) + + tr = trace(seed(observe, jax.random.PRNGKey(2))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=full_growth, priors=priors, + ) + plate_sites = [k for k, v in tr.items() if v["type"] == "plate"] + assert "shared_genotype_plate" in plate_sites + assert f"{name}_genotype_plate" not in plate_sites + + +def test_observe_batch_idx_slices_genotypes(mock_data, priors): + """A subsampled batch_idx selects the corresponding genotype entries.""" + name = "base_growth" + growth = MockGrowth( + batch_idx=jnp.array([1, 3]), + batch_size=2, + scale_vector=jnp.ones(2) * 2.0, + ) + dk_geno = _dk_geno(growth.batch_size, value=0.0) + + conditioned = substitute(observe, data={f"{name}_k_ref": 0.0}) + tr = trace(seed(conditioned, jax.random.PRNGKey(3))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=growth, priors=priors, + ) + site = tr[f"{name}_obs"] + # rate_obs[g] == g, so batch [1, 3] -> observed values [1, 3]. + assert jnp.allclose(site["value"], jnp.array([1.0, 3.0])) + assert jnp.all(site["scale"] == 2.0) + + +def test_observe_masking(mock_data, full_growth, priors): + """Masked genotype (idx 0) contributes zero log-prob even with wrong pred.""" + name = "base_growth" + # Huge k_ref makes every prediction wildly wrong; only masking saves idx 0. + dk_geno = _dk_geno(full_growth.batch_size, value=0.0) + conditioned = substitute(observe, data={f"{name}_k_ref": 1000.0}) + tr = trace(seed(conditioned, jax.random.PRNGKey(4))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=full_growth, priors=priors, + ) + log_probs = tr[f"{name}_obs"]["fn"].log_prob(tr[f"{name}_obs"]["value"]) + assert log_probs[0] == 0.0 # masked + assert log_probs[1] != 0.0 # unmasked + + +def test_guide_registers_k_ref(mock_data, full_growth, priors): + """The guide registers the k_ref variational site backed by pyro.params, + with the scale constrained > 1e-4 (guards against scale collapse).""" + name = "base_growth" + dk_geno = _dk_geno(full_growth.batch_size) + + tr = trace(seed(guide, jax.random.PRNGKey(5))).get_trace( + name=name, data=mock_data, dk_geno=dk_geno, + growth=full_growth, priors=priors, + ) + + assert f"{name}_k_ref_loc" in tr + assert f"{name}_k_ref_scale" in tr + assert f"{name}_k_ref" in tr + assert isinstance(tr[f"{name}_k_ref"]["fn"], dist.Normal) + + # loc param initialized from the prior loc. + assert jnp.allclose(tr[f"{name}_k_ref_loc"]["value"], priors.k_ref_loc) + + # scale param carries the greater_than(1e-4) constraint. + scale_site = tr[f"{name}_k_ref_scale"] + constraint = scale_site["kwargs"]["constraint"] + assert isinstance(constraint, dist.constraints._GreaterThan) + assert constraint.lower_bound == pytest.approx(1e-4) diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_presplit.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_presplit.py new file mode 100644 index 00000000..fd7459bd --- /dev/null +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_presplit.py @@ -0,0 +1,181 @@ +import pytest +import jax +import jax.numpy as jnp +import numpyro.distributions as dist +from numpyro.handlers import trace, seed +from collections import namedtuple + +# --- Import Module Under Test (MUT) --- +from tfscreen.tfmodel.generative.observe.presplit import observe, guide + +# --- Mock Data Fixtures --- + +MockPreSplit = namedtuple("MockPreSplit", [ + "ln_cfu_t0", + "ln_cfu_t0_std", + "good_mask", + "num_replicate", + "num_condition_pre", + "num_genotype", +]) + +MockGrowth = namedtuple("MockGrowth", [ + "batch_idx", + "batch_size", + "scale_vector", +]) + + +@pytest.fixture +def mock_data(): + """ + Pre-split data shaped (num_replicate, num_condition_pre, num_genotype) + = (2, 1, 4). ln_cfu_t0[r, c, g] == g so genotype slicing is detectable. + One entry masked bad. + """ + num_replicate = 2 + num_condition_pre = 1 + num_genotype = 4 + shape = (num_replicate, num_condition_pre, num_genotype) + + ln_cfu_t0 = jnp.broadcast_to(jnp.arange(num_genotype, dtype=float), shape) + ln_cfu_t0_std = jnp.ones(shape) * 0.2 + + good_mask = jnp.ones(shape, dtype=bool) + good_mask = good_mask.at[0, 0, 0].set(False) + + return MockPreSplit( + ln_cfu_t0=ln_cfu_t0, + ln_cfu_t0_std=ln_cfu_t0_std, + good_mask=good_mask, + num_replicate=num_replicate, + num_condition_pre=num_condition_pre, + num_genotype=num_genotype, + ) + + +@pytest.fixture +def full_growth(): + """Full (no-subsample) genotype batch: idx 0..3, unit scale.""" + batch_size = 4 + return MockGrowth( + batch_idx=jnp.arange(batch_size), + batch_size=batch_size, + scale_vector=jnp.ones(batch_size), + ) + + +def _ln_cfu0(batch_size, value=5.0): + """Growth-model ln_cfu0 tensor (num_rep, 1, num_cp, 1, 1, 1, batch_size).""" + return jnp.ones((2, 1, 1, 1, 1, 1, batch_size)) * value + + +def test_observe_site_structure(mock_data, full_growth): + """observe creates a masked Normal at '{name}_obs' with the right loc, + scale, and observed value (ln_cfu0 squeezed, std/obs sliced by batch).""" + name = "test" + ln_cfu0 = _ln_cfu0(full_growth.batch_size, value=5.0) + + tr = trace(observe).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=full_growth, + ) + + obs_name = f"{name}_obs" + assert obs_name in tr + site = tr[obs_name] + assert site["is_observed"] + assert isinstance(site["fn"], dist.MaskedDistribution) + + base = site["fn"].base_dist + assert isinstance(base, dist.Normal) + + # ln_cfu0 squeezed to (num_rep, num_cp, batch_size) + expected_loc = ln_cfu0[:, 0, :, 0, 0, 0, :] + assert jnp.allclose(base.loc, expected_loc) + + bi = full_growth.batch_idx + assert jnp.allclose(base.scale, mock_data.ln_cfu_t0_std[:, :, bi]) + assert jnp.allclose(site["value"], mock_data.ln_cfu_t0[:, :, bi]) + + +def test_observe_uses_shared_genotype_plate(mock_data, full_growth): + """The innermost plate must be the shared, unprefixed 'shared_genotype_plate' + (so Numpyro shares the genotype subsample with the growth model), never a + name-prefixed plate.""" + name = "test" + ln_cfu0 = _ln_cfu0(full_growth.batch_size) + + tr = trace(observe).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=full_growth, + ) + + plate_sites = [k for k, v in tr.items() if v["type"] == "plate"] + assert "shared_genotype_plate" in plate_sites + assert f"{name}_genotype_plate" not in plate_sites + # The two outer plates ARE name-prefixed. + assert f"{name}_replicate" in plate_sites + assert f"{name}_condition_pre" in plate_sites + + +def test_observe_batch_idx_slices_genotypes(mock_data): + """A subsampled batch_idx must select the corresponding genotype columns of + the pre-split tensors.""" + name = "test" + batch_idx = jnp.array([1, 3]) + growth = MockGrowth( + batch_idx=batch_idx, + batch_size=2, + scale_vector=jnp.ones(2) * 2.0, + ) + ln_cfu0 = _ln_cfu0(growth.batch_size) + + tr = trace(observe).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=growth, + ) + site = tr[f"{name}_obs"] + + # ln_cfu_t0[r, c, g] == g, so the observed values should be [1, 3]. + assert jnp.allclose(site["value"][:, :, 0], 1.0) + assert jnp.allclose(site["value"][:, :, 1], 3.0) + + +def test_observe_scaling(mock_data): + """The sub-sampling scale vector from growth is applied to the site.""" + name = "test" + growth = MockGrowth( + batch_idx=jnp.array([1, 3]), + batch_size=2, + scale_vector=jnp.ones(2) * 2.0, + ) + ln_cfu0 = _ln_cfu0(growth.batch_size) + + tr = trace(observe).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=growth, + ) + assert jnp.all(tr[f"{name}_obs"]["scale"] == 2.0) + + +def test_observe_masking(mock_data, full_growth): + """Masked entries contribute zero log-prob even with a wildly wrong pred.""" + name = "test" + # ln_cfu0 way off everywhere; masked entry is (rep=0, cp=0, geno=0). + ln_cfu0 = _ln_cfu0(full_growth.batch_size, value=1000.0) + + tr = trace(observe).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=full_growth, + ) + log_probs = tr[f"{name}_obs"]["fn"].log_prob(tr[f"{name}_obs"]["value"]) + + assert log_probs[0, 0, 0] == 0.0 # masked + assert log_probs[1, 0, 0] != 0.0 # unmasked + + +def test_guide_is_noop(mock_data, full_growth): + """The guide introduces no sample/param sites (presplit has no latents).""" + name = "test" + ln_cfu0 = _ln_cfu0(full_growth.batch_size) + + tr = trace(seed(guide, jax.random.PRNGKey(0))).get_trace( + name=name, data=mock_data, ln_cfu0=ln_cfu0, growth=full_growth, + ) + assert len(tr) == 0 diff --git a/tests/tfscreen/tfmodel/generative/test_registry.py b/tests/tfscreen/tfmodel/generative/test_registry.py index 012bb452..93d3846d 100644 --- a/tests/tfscreen/tfmodel/generative/test_registry.py +++ b/tests/tfscreen/tfmodel/generative/test_registry.py @@ -31,7 +31,8 @@ "growth_transition", } -OBSERVE_KEYS = {"observe_binding", "observe_growth"} +OBSERVE_KEYS = {"observe_binding", "observe_growth", + "observe_presplit", "observe_base_growth"} # Attributes that non-rescale component modules should expose STANDARD_COMPONENT_ATTRS = {"get_priors", "define_model", "guide", "get_guesses"} diff --git a/tests/tfscreen/tfmodel/test_base_growth.py b/tests/tfscreen/tfmodel/test_base_growth.py index a3051dab..724cc4ff 100644 --- a/tests/tfscreen/tfmodel/test_base_growth.py +++ b/tests/tfscreen/tfmodel/test_base_growth.py @@ -104,6 +104,20 @@ def test_model_orchestrator_with_base_growth(minimal_growth_df, assert base_growth_priors.k_ref_loc == pytest.approx(0.021) +def test_model_orchestrator_rejects_zero_rate_std(minimal_growth_df, + minimal_binding_df): + """A base_growth_df with rate_std == 0.0 (e.g. an un-noised tfs-simulate + base_growth_data output) must be rejected at construction time with a + clear error, not silently produce a NaN k_ref prior that only surfaces + much later as a numpyro 'invalid loc parameter' crash during tracing.""" + bad_base_growth_df = pd.DataFrame({ + "genotype": ["wt"], "rate": [0.021], "rate_std": [0.0], + }) + with pytest.raises(ValueError, match="non-positive rate_std"): + ModelOrchestrator(minimal_growth_df, minimal_binding_df, + base_growth_df=bad_base_growth_df) + + # --------------------------------------------------------------------------- # jax_model: base_growth_obs / base_growth_k_ref sites fire # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 8478ea9a..dbcaf261 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -1942,6 +1942,37 @@ def test_basic_construction(self): assert set(result["genotype"]) == {"wt", "A2G"} assert len(result) == 2 + def test_zero_rate_std_raises(self): + """rate_std == 0.0 (e.g. from tfs-simulate's base_growth_data with + noise omitted/0.0) must be rejected here -- otherwise 1/rate_std**2 + divides by zero, producing a NaN combined rate that only surfaces + much later as an inscrutable numpyro 'invalid loc parameter' crash + when the model is first traced.""" + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt"], + "rate": [0.02], + "rate_std": [0.0], + }) + + with pytest.raises(ValueError, match="non-positive rate_std"): + _read_base_growth_df(base_growth_df_raw, growth_df) + + def test_negative_rate_std_raises(self): + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + growth_df = _read_growth_df(self._growth_df()) + base_growth_df_raw = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.02, 0.015], + "rate_std": [0.001, -0.002], + }) + + with pytest.raises(ValueError, match=r"non-positive rate_std for genotype\(s\) \['A2G'\]"): + _read_base_growth_df(base_growth_df_raw, growth_df) + def test_missing_required_column_raises(self): from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df @@ -2143,6 +2174,7 @@ def _populate_side_effect(target_dataclass, sources): "sample_offset": {"zero": MagicMock()}, "observe_binding": MagicMock(), "observe_growth": MagicMock(), + "observe_base_growth": MagicMock(), } with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", registry, clear=True): for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", From cfd309db1ba76d1787eb5283d631b2557116feaa Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 18:14:11 -0700 Subject: [PATCH 13/30] standardized observe variable naming and prior treatment --- docs/badges/tests-badge.svg | 2 +- examples/simulate/.simulate_config.yaml.swp | Bin 16384 -> 0 bytes reports/flake.txt | 678 +++++++++--------- reports/junit/junit.xml | 2 +- src/tfscreen/tfmodel/data_class.py | 15 + src/tfscreen/tfmodel/generative/model.py | 14 +- .../tfmodel/generative/observe/binding.py | 12 +- .../tfmodel/generative/observe/growth.py | 29 +- src/tfscreen/tfmodel/model_orchestrator.py | 11 + .../tfmodel/analysis/test_prior_predictive.py | 4 +- .../observe/test_observe_binding.py | 2 +- .../generative/observe/test_observe_growth.py | 70 +- .../tfmodel/generative/test_loglikelihood.py | 30 +- .../tfscreen/tfmodel/generative/test_model.py | 15 +- .../tfmodel/generative/test_model_math.py | 4 +- tests/tfscreen/tfmodel/test_data_class.py | 9 + 16 files changed, 479 insertions(+), 418 deletions(-) delete mode 100644 examples/simulate/.simulate_config.yaml.swp diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 0d03591a..0d27efde 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3819tests3819 \ No newline at end of file +tests: 3820tests3820 \ No newline at end of file diff --git a/examples/simulate/.simulate_config.yaml.swp b/examples/simulate/.simulate_config.yaml.swp deleted file mode 100644 index e31a9141cc4c223d4c482253499fde00040f3a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3O^h5z6~{XS<3I=?ath*5StIRkyfgcen1nSX_#=VHiESmebBLm$rn_dQvOV4H zuIil~4v-kcfq?kFAP#TD`Sw&0lMYC zr@O1_)vNz|_4TT^zjo>IC)J0#>k-#`qUg#OAAkPWcmMPQS3Y-JG}7hRjV0mwS6^pa z?)q6m>ZfXftCPIkS}n?aSnBcEX2aE?^_@7)GvikMz{RC8*{a#m<09pav*Rk&-pp@$ zah?tAushY`^ag5ev$PDf4AczV72UtFz9#oa7VcGdzxQHGOv^yaK+8bOK+8bOK+8bO zK+8bO!2b~gzBm+pn)be>Y4gL)?``{j-)yck&HG38rT?Qz|3vft^ZU}@Xwqjpjz8{8 zzrA_BulaqXQDCM=^Sb?M8E6@38E6@38E6@38E6@38E6@38E6@38E6^!4;au%6upCT z?~{!-=l`?)|C{fQqF2Dzz@y+aI0XLkt|a0t9gfFS{QgI^Ks_y%|kyg|EP1_lTR_kj93 zqOQG?yy~Y$jVrG+@48AoW7EV>3!{c6%fpRMCwl5sX<}oyjZ=PPqJu=0X2@p^rTwHy z)F>~VaiiR*qO^IbCL@zcL6zEmsmrOdS)5jhaR*8oYhT(OluErVQX6Y;^9XA`oy5fXxX2y3KTalPE>}Ux(k(b`7L0*-rfYRDP@MDH~X^q=d8LiXligLb+ zw>tg2%951>g<%Y@dm}p>t*A3ADqB`bsV5nVB&IO@m-%$6bSV;)R?l3(0S2ZtS!`nm+fMeY6-IkLE75=+shOf0|E3z4NraD*J)7PG1YHf!_=*$UB+&~%Z$?K#o0oEGDaG%~ao)X8Z5jMnZ)=-saeC3&8Js`IMS8d|PE}5q52R~< z&x!M#I#GBVpVr=6aiL>MtjYI3%2{u)s_~5}7aASTZS+p9Z}iR_>s?&y>F)V6Gwu>Q zM$?J)BUKBg)95lDAt$C~MxEPOQR^EWa-rXa(4u6T>9LKkqN*58osC^X;!IR0kK?M) zSv;*9+c31PQ=2HW6Pv=Tg&yA}@qN;QT8ep3Hw~ViXX$iVEdEsB2MJjy_;N1)KSAY)`EEGy^sAc z9%`p1j|gsg9C{HSO7SB(c_3>{ zVM&yCJVk;og=cbT-_$~_A|%v~oKQmhp;AZG_<;?(y7kZl>A&Aj zsq)sfvu@H&YiDSpE9{m@dd^&S3=}Fg*^pkx3^DQYQhfbXp7}CQ867THGU71?neMQw zwz8Zda+^s`X3J$6-{}q%4Kii=e6n(0^-Y-Tn43%#d7BzO@EiAYhUaG&9K%CuI_nE7 zYIeUN_w_{FS?_EtJckDLBRVl6$jpThwIiyDB%1{vcU0sjd|DWio!U{Fv3iOYi;c9M z&d#Fx2py7nF4HN+o9gE?)T}MiX`4#+7N1IS%>-98Q!gT(8QDE!xr$SnIawCu$Ow~q zkhMG4i#|=YK^w%eI@u{0*f7KW#ikm1O)rrS73{s6c#K4G>)@{BzmXY!$ui4#+W0?bfMt22XTndjfN&Ay3m{tH#?)fU3`j~@pPPjQ~GxLjgnV&#Gb z=${*FinTzND;?X!u{?40N8oq6;PwMhq63 z<$T3Hx0Ceeeg3fsQQ|RY&t8b4dKjfwhuP+aC(K(rkz9Ymlo|AfCrqp~-z1$rdtyFG zsA~t9fi0cy%|;xSn9e4Z*;E@3BILx}Uf3ffsH__I=~_ZNey>7tM$^tf_A2vS*Ve;u zC(F)W$hWE1kp5Ktij9#JU1RaMqBgqfY>pVV8f>DLGQ;A41?)1;!p?|^EM+}z61v;X zUZXwHZ2P3wvsR`}vJJZ>D>d2w|B1czkJx+5{(pA<{wjO@&w?u;1J8l8;1u{EI126o zcYwp-XT$)$3QmJl;P1o%egL+B1((31;1u{9v4K~>%ivq!o8Sp>JNPj%g0hJhe3ak6 z5-a!#_zZXvd>Cwk*U?vW{-NmIUM&MH11$qB11$qB11$spqYTI~g6vaR(KewLRmNKw>XMH~2$NRFgl{ zBp%xd5zcyp)#()ECaU0j$pDQIb1q}Ko=+r5t(HntA7W4!<>f>m&w3PDnFqwfE^L2@ zIn8?Upz5vld|A;x*+jEO=YeRI><~iqHY}k-@pF|gDo+h*HO|;1|La;;AVI2_{q~%f z!vfStP1zDyHsy7ewOLGOWZAV#TpI4`D6g2n>n);CeS=yi1Pf?g$C;E6j~s)b`owe2 z5Do!qfucRFN-W1p95jdwj6(D_1iR&6NBE>xA>PXNgg>awaR~x*q0PHgO4#kBiLtU# zQbf*_E{sG(^LMtjL3bUDeU80c5$&keCg|YVyLNnSljrLQo-_qP5~(KQC3(pd_^)g2`qv52oWfBU?mN)DX7BBoh z7VA?B7qTMu=5K$`OLqtkEk>U?rgV*^nR(>c>4x0s#xhA8_8M?)J-pzM=79$<1zWE_ z6y8V-F2upb;GK}%3y(Zfhag0F_v2l!aIj-x~J$#Q#D`m>^sxXG \ No newline at end of file + \ No newline at end of file diff --git a/src/tfscreen/tfmodel/data_class.py b/src/tfscreen/tfmodel/data_class.py index b818c14e..6a3146be 100644 --- a/src/tfscreen/tfmodel/data_class.py +++ b/src/tfscreen/tfmodel/data_class.py @@ -256,11 +256,26 @@ class GrowthPriors: theta_growth_noise: Any growth_noise: Any sample_offset: Any + # Prior (concentration, rate) for the growth observer's StudentT degrees + # of freedom (see GrowthObsPriors). + growth_obs: Any # Prior (loc, scale) for the optional base_growth k_ref scalar; None when # base_growth_df was not supplied (see BaseGrowthPriors). base_growth: Any = field(default=None) +@dataclass(frozen=True) +class GrowthObsPriors: + """ + Prior (concentration, rate) for the growth observer's StudentT + degrees-of-freedom latent ``nu`` (see observe/growth.py). Gamma's mean is + concentration/rate; the default concentration=2.0, rate=0.1 gives a mean + of 20.0, matching the value previously hardcoded in observe/growth.py. + """ + nu_concentration: float + nu_rate: float + + @dataclass(frozen=True) class BaseGrowthPriors: """ diff --git a/src/tfscreen/tfmodel/generative/model.py b/src/tfscreen/tfmodel/generative/model.py index b895ff89..2585f25d 100644 --- a/src/tfscreen/tfmodel/generative/model.py +++ b/src/tfscreen/tfmodel/generative/model.py @@ -66,10 +66,10 @@ def jax_model(data: DataClass, theta_binding, priors.binding.theta_binding_noise) if is_guide: - binding_observer("final_growth_obs", data.binding, None) + binding_observer("binding", data.binding, None) else: pyro.deterministic("binding_pred", binding_pred) - binding_observer("final_growth_obs", data.binding, binding_pred) + binding_observer("binding", data.binding, binding_pred) return # ------------------------------------------------------------------------- @@ -224,8 +224,9 @@ def jax_model(data: DataClass, data.growth, priors.growth.sample_offset) - growth_observer("final_binding_obs", data.growth, None) - binding_observer("final_growth_obs", data.binding, None) + growth_observer("growth", data.growth, None, + priors=priors.growth.growth_obs) + binding_observer("binding", data.binding, None) # Register side-channel guide sites. presplit.guide is a no-op (it # introduces no latents); base_growth.guide registers the k_ref @@ -284,7 +285,8 @@ def jax_model(data: DataClass, pyro.deterministic(f"growth_pred", ln_cfu_pred) # Calculate likelihood - growth_observer("final_binding_obs", data.growth, ln_cfu_pred, sigma_k=sigma_k) - binding_observer("final_growth_obs", data.binding, binding_pred) + growth_observer("growth", data.growth, ln_cfu_pred, sigma_k=sigma_k, + priors=priors.growth.growth_obs) + binding_observer("binding", data.binding, binding_pred) diff --git a/src/tfscreen/tfmodel/generative/observe/binding.py b/src/tfscreen/tfmodel/generative/observe/binding.py index b7019f06..23024bc3 100644 --- a/src/tfscreen/tfmodel/generative/observe/binding.py +++ b/src/tfscreen/tfmodel/generative/observe/binding.py @@ -39,18 +39,18 @@ def observe(name: str, """ # Binding observation - with pyro.plate(f"{name}_binding_titrant_name", size=data.num_titrant_name,dim=-3): - with pyro.plate(f"{name}_binding_titrant_conc", size=data.num_titrant_conc,dim=-2): - with pyro.plate(f"{name}_binding_genotype_plate",size=data.batch_size,dim=-1): - + with pyro.plate(f"{name}_titrant_name", size=data.num_titrant_name,dim=-3): + with pyro.plate(f"{name}_titrant_conc", size=data.num_titrant_conc,dim=-2): + with pyro.plate(f"{name}_genotype_plate",size=data.batch_size,dim=-1): + # Scale data for sub-sampling with pyro.handlers.scale(scale=data.scale_vector): # Apply mask for good observations with pyro.handlers.mask(mask=data.good_mask): - + # Define the observation site - pyro.sample(f"{name}_binding_obs", + pyro.sample(f"{name}_obs", dist.Normal(binding_pred, data.theta_std), obs=data.theta_obs) diff --git a/src/tfscreen/tfmodel/generative/observe/growth.py b/src/tfscreen/tfmodel/generative/observe/growth.py index 8a1709cb..97457318 100644 --- a/src/tfscreen/tfmodel/generative/observe/growth.py +++ b/src/tfscreen/tfmodel/generative/observe/growth.py @@ -3,12 +3,14 @@ import numpyro.distributions as dist -from tfscreen.tfmodel.data_class import GrowthData +from tfscreen.tfmodel.data_class import GrowthData, GrowthObsPriors def observe(name: str, data: GrowthData, ln_cfu_pred: jnp.ndarray, - sigma_k: jnp.ndarray = 0.0): + sigma_k: jnp.ndarray = 0.0, + *, + priors: GrowthObsPriors): """ Defines the observation site for the growth (ln_CFU) data. @@ -45,9 +47,13 @@ def observe(name: str, with ``data.ln_cfu_std`` to give the effective observation scale: ``effective_scale = sqrt(ln_cfu_std² + sigma_k²)``. Defaults to 0.0 (no extra noise). + priors : GrowthObsPriors + Prior (concentration, rate) for the StudentT degrees-of-freedom + latent ``nu``. """ - nu = pyro.sample(f"{name}_nu", dist.Gamma(2.0, 0.1)) + nu = pyro.sample(f"{name}_nu", + dist.Gamma(priors.nu_concentration, priors.nu_rate)) effective_scale = jnp.sqrt(data.ln_cfu_std ** 2 + sigma_k ** 2) # Growth observation @@ -66,14 +72,16 @@ def observe(name: str, with pyro.handlers.mask(mask=data.good_mask): # Define the observation site - pyro.sample(f"{name}_growth_obs", + pyro.sample(f"{name}_obs", dist.StudentT(df=nu, loc=ln_cfu_pred, scale=effective_scale), obs=data.ln_cfu) def guide(name: str, data: GrowthData, ln_cfu_pred: jnp.ndarray, - sigma_k: jnp.ndarray = 0.0): + sigma_k: jnp.ndarray = 0.0, + *, + priors: GrowthObsPriors): """ Guide corresponding to the observation function. @@ -84,11 +92,12 @@ def guide(name: str, It deliberately excludes the `pyro.plate` context and the `growth_obs` sample site because those are observed data, not latent variables. """ - - # The prior is Gamma(2.0, 0.1), which has a mean of 20.0. - # We use a LogNormal guide to ensure positive support. - # Initialize loc at log(20) ≈ 3.0 to start the optimization near the prior mean. - nu_loc = pyro.param(f"{name}_nu_loc", jnp.array(3.0)) + + # We use a LogNormal guide to ensure positive support. Initialize loc at + # the log of the prior's mean (concentration/rate) so optimization starts + # near the prior mean. + nu_loc = pyro.param(f"{name}_nu_loc", + jnp.log(priors.nu_concentration / priors.nu_rate)) nu_scale = pyro.param(f"{name}_nu_scale", jnp.array(0.1), constraint=dist.constraints.positive) diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 59fabc43..0616bae3 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -16,6 +16,7 @@ BaseGrowthData, PriorsClass, GrowthPriors, + GrowthObsPriors, BaseGrowthPriors, BindingPriors ) @@ -493,6 +494,11 @@ def _build_presplit_tm(presplit_df, growth_tm): # base_growth_df measurements dominate it rather than the reverse. _K_REF_PRIOR_SCALE = 0.02 +# Default Gamma(concentration, rate) prior for the growth observer's StudentT +# degrees-of-freedom latent `nu` (see observe/growth.py). Mean = 2.0/0.1 = 20.0. +_NU_PRIOR_CONCENTRATION = 2.0 +_NU_PRIOR_RATE = 0.1 + def _read_base_growth_df(base_growth_df, growth_df): """ @@ -1676,8 +1682,13 @@ def _initialize_classes(self): theta_growth_noise=None, growth_noise=None, sample_offset=None, + growth_obs=None, ) else: + priors_class_kwargs["growth"]["growth_obs"] = GrowthObsPriors( + nu_concentration=_NU_PRIOR_CONCENTRATION, + nu_rate=_NU_PRIOR_RATE, + ) if self._base_growth_df is not None: priors_class_kwargs["growth"]["base_growth"] = BaseGrowthPriors( k_ref_loc=self._k_ref_guess, diff --git a/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py b/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py index aa93bb2e..0b901ef7 100644 --- a/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py +++ b/tests/tfscreen/tfmodel/analysis/test_prior_predictive.py @@ -61,9 +61,9 @@ def test_draw_prior_latent_params_shape(dummy_orchestrator): def test_draw_prior_no_observed_in_latent(dummy_orchestrator): # Observed sites (obs= in model) should not appear in latent_params. - # The growth observation site is named 'final_binding_obs_growth_obs'. + # The growth observation site is named 'growth_obs'. _, latent_params = draw_prior(dummy_orchestrator, rng_key=0, num_draws=1) - assert "final_binding_obs_growth_obs" not in latent_params + assert "growth_obs" not in latent_params def test_draw_prior_reproducible(dummy_orchestrator): diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py index 6d405305..3be88afe 100644 --- a/tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py @@ -68,7 +68,7 @@ def test_observe_binding_site(mock_data): ) # --- 1. Check for the Observation Site --- - obs_site_name = f"{name}_binding_obs" + obs_site_name = f"{name}_obs" assert obs_site_name in model_trace site = model_trace[obs_site_name] diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py index bb6e42cc..9c717dd4 100644 --- a/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py @@ -7,6 +7,7 @@ # --- Import Module Under Test (MUT) --- from tfscreen.tfmodel.generative.observe.growth import observe, guide +from tfscreen.tfmodel.data_class import GrowthObsPriors # --- Mock Data Fixture --- @@ -72,7 +73,12 @@ def mock_data(): good_mask=good_mask ) -def test_observe_structure_and_distribution(mock_data): +@pytest.fixture +def mock_priors(): + """Gamma(2.0, 0.1) prior on nu, matching the previous hardcoded default.""" + return GrowthObsPriors(nu_concentration=2.0, nu_rate=0.1) + +def test_observe_structure_and_distribution(mock_data, mock_priors): """ Verifies the site names, distribution types, and shapes. """ @@ -84,7 +90,8 @@ def test_observe_structure_and_distribution(mock_data): model_trace = trace(seed(observe, rng_key)).get_trace( name=name, data=mock_data, - ln_cfu_pred=ln_cfu_pred + ln_cfu_pred=ln_cfu_pred, + priors=mock_priors ) # 1. Check 'nu' parameter @@ -93,7 +100,7 @@ def test_observe_structure_and_distribution(mock_data): assert isinstance(model_trace[nu_name]["fn"], dist.Gamma) # 2. Check Observation Site - obs_name = f"{name}_growth_obs" + obs_name = f"{name}_obs" assert obs_name in model_trace site = model_trace[obs_name] @@ -104,26 +111,27 @@ def test_observe_structure_and_distribution(mock_data): # 3. Check shapes match input assert site["value"].shape == mock_data.ln_cfu.shape -def test_observe_subsampling_scaling(mock_data): +def test_observe_subsampling_scaling(mock_data, mock_priors): """ CRITICAL: Verifies that the log_prob is correctly scaled. """ name = "test" ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 # Pred = Obs - + # Fix 'nu' fixed_nu = 10.0 conditioned_model = substitute(observe, data={f"{name}_nu": fixed_nu}) rng_key = jax.random.PRNGKey(1) - + # Trace model_trace = trace(seed(conditioned_model, rng_key)).get_trace( name=name, data=mock_data, - ln_cfu_pred=ln_cfu_pred + ln_cfu_pred=ln_cfu_pred, + priors=mock_priors ) - site = model_trace[f"{name}_growth_obs"] + site = model_trace[f"{name}_obs"] # 1. Calculate Expected Unscaled Log Prob (manual) base_dist = dist.StudentT(df=fixed_nu, loc=ln_cfu_pred, scale=mock_data.ln_cfu_std) @@ -143,15 +151,15 @@ def test_observe_subsampling_scaling(mock_data): trace_log_prob = site["fn"].log_prob(site["value"]) assert jnp.allclose(jnp.sum(trace_log_prob), sum_log_prob_batch) -def test_observe_masking_logic(mock_data): +def test_observe_masking_logic(mock_data, mock_priors): """ Verifies that masked data points do not contribute to the likelihood. """ name = "test" - + # Create a prediction that is WAY OFF for the masked point. ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 - + # Masked point is at (0,0,0,0,0,0,0) ln_cfu_pred = ln_cfu_pred.at[0,0,0,0,0,0,0].set(1000.0) @@ -159,14 +167,15 @@ def test_observe_masking_logic(mock_data): fixed_nu = 30.0 conditioned_model = substitute(observe, data={f"{name}_nu": fixed_nu}) rng_key = jax.random.PRNGKey(2) - + model_trace = trace(seed(conditioned_model, rng_key)).get_trace( name=name, data=mock_data, - ln_cfu_pred=ln_cfu_pred + ln_cfu_pred=ln_cfu_pred, + priors=mock_priors ) - site = model_trace[f"{name}_growth_obs"] + site = model_trace[f"{name}_obs"] log_probs = site["fn"].log_prob(site["value"]) # Check the specific index (masked) -> 0.0 @@ -175,21 +184,25 @@ def test_observe_masking_logic(mock_data): # Check a valid index -> non-zero assert log_probs[0,0,0,0,0,0,1] != 0.0 -def test_guide_structure(mock_data): +def test_guide_structure(mock_data, mock_priors): """ Tests that the guide creates the correct parameter site for 'nu'. """ name = "test_guide" ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 - + # Trace the guide rng_key = jax.random.PRNGKey(3) guide_trace = trace(seed(guide, rng_key)).get_trace( name=name, data=mock_data, - ln_cfu_pred=ln_cfu_pred + ln_cfu_pred=ln_cfu_pred, + priors=mock_priors ) - + + # nu_loc should initialize at log(prior mean) = log(2.0/0.1) = log(20) + assert jnp.allclose(guide_trace[f"{name}_nu_loc"]["value"], jnp.log(20.0)) + # Check for 'nu' parameter and sample assert f"{name}_nu_loc" in guide_trace assert f"{name}_nu_scale" in guide_trace @@ -203,7 +216,7 @@ def test_guide_structure(mock_data): # Tests for sigma_k growth-rate noise integration # --------------------------------------------------------------------------- -def test_sigma_k_zero_preserves_original_scale(mock_data): +def test_sigma_k_zero_preserves_original_scale(mock_data, mock_priors): """sigma_k=0.0 (default) gives effective_scale == ln_cfu_std.""" name = "test_sigma_k_zero" ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 @@ -212,9 +225,10 @@ def test_sigma_k_zero_preserves_original_scale(mock_data): rng_key = jax.random.PRNGKey(10) tr_no_noise = trace(seed(conditioned, rng_key)).get_trace( - name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=0.0 + name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=0.0, + priors=mock_priors ) - site = tr_no_noise[f"{name}_growth_obs"] + site = tr_no_noise[f"{name}_obs"] # Effective scale should equal ln_cfu_std (sqrt(std^2 + 0^2)) base = site["fn"].base_dist @@ -222,7 +236,7 @@ def test_sigma_k_zero_preserves_original_scale(mock_data): assert jnp.allclose(base.scale, expected_scale) -def test_sigma_k_inflates_scale(mock_data): +def test_sigma_k_inflates_scale(mock_data, mock_priors): """sigma_k > 0 inflates effective_scale beyond ln_cfu_std.""" name = "test_sigma_k_pos" ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 @@ -232,16 +246,17 @@ def test_sigma_k_inflates_scale(mock_data): rng_key = jax.random.PRNGKey(11) tr_with_noise = trace(seed(conditioned, rng_key)).get_trace( - name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=sigma_k + name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=sigma_k, + priors=mock_priors ) - site = tr_with_noise[f"{name}_growth_obs"] + site = tr_with_noise[f"{name}_obs"] base = site["fn"].base_dist expected_scale = jnp.sqrt(mock_data.ln_cfu_std ** 2 + sigma_k ** 2) assert jnp.allclose(base.scale, expected_scale) -def test_sigma_k_quadrature_formula(mock_data): +def test_sigma_k_quadrature_formula(mock_data, mock_priors): """effective_scale = sqrt(ln_cfu_std^2 + sigma_k^2) exactly.""" name = "test_quad" ln_cfu_pred = jnp.ones_like(mock_data.ln_cfu) * 5.0 @@ -252,8 +267,9 @@ def test_sigma_k_quadrature_formula(mock_data): rng_key = jax.random.PRNGKey(12) tr = trace(seed(conditioned, rng_key)).get_trace( - name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=sigma_k + name=name, data=mock_data, ln_cfu_pred=ln_cfu_pred, sigma_k=sigma_k, + priors=mock_priors ) - base = tr[f"{name}_growth_obs"]["fn"].base_dist + base = tr[f"{name}_obs"]["fn"].base_dist expected = jnp.sqrt(ln_cfu_std ** 2 + sigma_k ** 2) assert jnp.allclose(base.scale, expected, rtol=1e-6) \ No newline at end of file diff --git a/tests/tfscreen/tfmodel/generative/test_loglikelihood.py b/tests/tfscreen/tfmodel/generative/test_loglikelihood.py index c4ec9403..82b0598c 100644 --- a/tests/tfscreen/tfmodel/generative/test_loglikelihood.py +++ b/tests/tfscreen/tfmodel/generative/test_loglikelihood.py @@ -21,6 +21,10 @@ from numpyro.handlers import trace, substitute, seed import numpyro.distributions as dist +from tfscreen.tfmodel.data_class import GrowthObsPriors + +_GROWTH_OBS_PRIORS = GrowthObsPriors(nu_concentration=2.0, nu_rate=0.1) + # ────────────────────────────────────────────────────────────────────────────── # Helper: sum unmasked log-probs from a trace @@ -107,9 +111,9 @@ def test_perfect_prediction_beats_imperfect(self): def run(pred): m = substitute(observe, data={ "growth_nu": jnp.array(nu_val), - "growth_growth_obs": data.ln_cfu, + "growth_obs": data.ln_cfu, }) - t = trace(m).get_trace("growth", data, pred) + t = trace(m).get_trace("growth", data, pred, priors=_GROWTH_OBS_PRIORS) return _sum_log_prob(t) assert run(data.ln_cfu) > run(data.ln_cfu + 1.0) @@ -131,9 +135,9 @@ def test_known_log_prob(self): m = substitute(observe, data={ "growth_nu": jnp.array(nu_val), - "growth_growth_obs": data.ln_cfu, + "growth_obs": data.ln_cfu, }) - t = trace(m).get_trace("growth", data, pred) + t = trace(m).get_trace("growth", data, pred, priors=_GROWTH_OBS_PRIORS) lp = _sum_log_prob(t) # Reference: StudentT(20, 10.0, 0.5).log_prob(10.0) @@ -154,9 +158,9 @@ def test_residual_reduces_log_prob(self): def run(delta): m = substitute(observe, data={ "growth_nu": jnp.array(nu_val), - "growth_growth_obs": data.ln_cfu, + "growth_obs": data.ln_cfu, }) - t = trace(m).get_trace("growth", data, data.ln_cfu + delta) + t = trace(m).get_trace("growth", data, data.ln_cfu + delta, priors=_GROWTH_OBS_PRIORS) return _sum_log_prob(t) lp0 = run(0.0) @@ -183,9 +187,9 @@ def test_mask_zeroes_log_prob(self): def run(data): m = substitute(observe, data={ "growth_nu": jnp.array(nu_val), - "growth_growth_obs": data.ln_cfu, + "growth_obs": data.ln_cfu, }) - return trace(m).get_trace("growth", data, pred) + return trace(m).get_trace("growth", data, pred, priors=_GROWTH_OBS_PRIORS) t_good = run(data_good) t_masked = run(data_masked) @@ -193,8 +197,8 @@ def run(data): # The site fn.log_prob is the same (same distribution, same value). # The difference in ELBO is due to masking, not the raw log_prob. # Verify that the observation site exists in both traces. - assert "growth_growth_obs" in t_good - assert "growth_growth_obs" in t_masked + assert "growth_obs" in t_good + assert "growth_obs" in t_masked # ══════════════════════════════════════════════════════════════════════════════ @@ -212,7 +216,7 @@ def test_perfect_prediction_beats_imperfect(self): data = _make_binding_data() def run(pred): - m = substitute(observe, data={"binding_binding_obs": data.theta_obs}) + m = substitute(observe, data={"binding_obs": data.theta_obs}) t = trace(m).get_trace("binding", data, pred) return _sum_log_prob(t) @@ -227,7 +231,7 @@ def test_known_log_prob(self): data = _make_binding_data(n_tname=1, n_tconc=3, n_geno=3) pred = data.theta_obs # perfect match - m = substitute(observe, data={"binding_binding_obs": data.theta_obs}) + m = substitute(observe, data={"binding_obs": data.theta_obs}) t = trace(m).get_trace("binding", data, pred) lp = _sum_log_prob(t) @@ -240,7 +244,7 @@ def test_residual_reduces_log_prob(self): data = _make_binding_data(n_tname=1, n_tconc=2, n_geno=2) def run(delta): - m = substitute(observe, data={"binding_binding_obs": data.theta_obs}) + m = substitute(observe, data={"binding_obs": data.theta_obs}) t = trace(m).get_trace("binding", data, data.theta_obs + delta) return _sum_log_prob(t) diff --git a/tests/tfscreen/tfmodel/generative/test_model.py b/tests/tfscreen/tfmodel/generative/test_model.py index 8025f09c..cd91b463 100644 --- a/tests/tfscreen/tfmodel/generative/test_model.py +++ b/tests/tfscreen/tfmodel/generative/test_model.py @@ -31,7 +31,7 @@ def replace(self, **kwargs): MockGrowthPriors = namedtuple("MockGrowthPriors", [ "theta_growth_noise", "condition_growth", "growth_transition", "ln_cfu0", "dk_geno", "activity", "transformation", - "growth_noise", "sample_offset" + "growth_noise", "sample_offset", "growth_obs" ]) MockBindingPriors = namedtuple("MockBindingPriors", ["theta_binding_noise"]) MockPriors = namedtuple("MockPriors", ["theta", "growth", "binding"]) @@ -70,6 +70,7 @@ def mock_priors(): transformation="prior_trans", growth_noise="prior_grn", sample_offset="prior_so", + growth_obs="prior_growth_obs", ) binding = MockBindingPriors(theta_binding_noise="prior_bn") return MockPriors(theta="prior_theta", growth=growth, binding=binding) @@ -206,10 +207,11 @@ def test_jax_model_execution_flow(mock_data, mock_priors, mock_control): expected_pred = 110.0 # Check that the observer received this prediction - args, _ = mock_control["observe_growth"].call_args - assert args[0] == "final_binding_obs" # Name check (note: code uses confusing name here?) + args, kwargs = mock_control["observe_growth"].call_args + assert args[0] == "growth" # Name check assert args[1] is mock_data.growth assert jnp.isclose(args[2], expected_pred) + assert kwargs["priors"] == "prior_growth_obs" # --- 3. Verify Deterministic Sites --- assert "theta_binding_pred" in model_trace @@ -239,10 +241,11 @@ def test_jax_model_guide_flow(mock_data, mock_priors, mock_control): mock_control["transformation"][0].assert_called_once() # --- Verify Observers called with None --- - # growth_observer("final_binding_obs", data.growth, None) - args_growth, _ = mock_control["observe_growth"].call_args + # growth_observer("growth", data.growth, None, priors=priors.growth.growth_obs) + args_growth, kwargs_growth = mock_control["observe_growth"].call_args assert args_growth[2] is None - + assert kwargs_growth["priors"] == "prior_growth_obs" + args_binding, _ = mock_control["observe_binding"].call_args assert args_binding[2] is None diff --git a/tests/tfscreen/tfmodel/generative/test_model_math.py b/tests/tfscreen/tfmodel/generative/test_model_math.py index 4e6ac533..7eaff61c 100644 --- a/tests/tfscreen/tfmodel/generative/test_model_math.py +++ b/tests/tfscreen/tfmodel/generative/test_model_math.py @@ -48,7 +48,8 @@ _MockGrowthPriors = namedtuple( "_MockGrowthPriors", ["condition_growth", "ln_cfu0", "dk_geno", "activity", "transformation", - "theta_growth_noise", "growth_transition", "growth_noise", "sample_offset"], + "theta_growth_noise", "growth_transition", "growth_noise", "sample_offset", + "growth_obs"], ) _MockBindingPriors = namedtuple("_MockBindingPriors", ["theta_binding_noise"]) _MockPriors = namedtuple("_MockPriors", ["theta", "growth", "binding"]) @@ -86,6 +87,7 @@ def real_priors(): growth_transition=growth_transition_instant.get_priors(), growth_noise=growth_noise_zero.get_priors(), sample_offset=sample_offset_zero.get_priors(), + growth_obs=MagicMock(), # passed to mocked observe_growth ) binding = _MockBindingPriors(theta_binding_noise=noise_zero.get_priors()) return _MockPriors(theta=MagicMock(), growth=growth, binding=binding) diff --git a/tests/tfscreen/tfmodel/test_data_class.py b/tests/tfscreen/tfmodel/test_data_class.py index ab86f426..9050ac3b 100644 --- a/tests/tfscreen/tfmodel/test_data_class.py +++ b/tests/tfscreen/tfmodel/test_data_class.py @@ -18,6 +18,7 @@ BaseGrowthData, DataClass, GrowthPriors, + GrowthObsPriors, BaseGrowthPriors, BindingPriors, PriorsClass, @@ -327,6 +328,7 @@ def test_construction(self): theta_growth_noise=mock_any, growth_noise=mock_any, sample_offset=mock_any, + growth_obs=mock_any, ) bp = BindingPriors(theta_binding_noise=mock_any) pc = PriorsClass(theta=bp, growth=gp, binding=bp) @@ -346,6 +348,7 @@ def test_growth_priors_base_growth_defaults_to_none(self): theta_growth_noise=mock_any, growth_noise=mock_any, sample_offset=mock_any, + growth_obs=mock_any, ) assert gp.base_growth is None @@ -354,6 +357,11 @@ def test_base_growth_priors_construction(self): assert bgp.k_ref_loc == pytest.approx(0.02) assert bgp.k_ref_scale == pytest.approx(0.02) + def test_growth_obs_priors_construction(self): + gop = GrowthObsPriors(nu_concentration=2.0, nu_rate=0.1) + assert gop.nu_concentration == pytest.approx(2.0) + assert gop.nu_rate == pytest.approx(0.1) + def test_growth_priors_with_base_growth_set(self): mock_any = MagicMock() bgp = BaseGrowthPriors(k_ref_loc=0.015, k_ref_scale=0.01) @@ -367,6 +375,7 @@ def test_growth_priors_with_base_growth_set(self): theta_growth_noise=mock_any, growth_noise=mock_any, sample_offset=mock_any, + growth_obs=mock_any, base_growth=bgp, ) assert gp.base_growth is bgp From 1c4723b537702b2ff8656c1560ce8fd279623952 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 19:06:13 -0700 Subject: [PATCH 14/30] updated claude --- CLAUDE.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 127a3d4a..e2140414 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -113,19 +113,20 @@ The hierarchical Bayesian inference engine. Key files: - **`generative/registry.py`** — `model_registry` dict mapping component names to module implementations. This is where all swappable components are registered. -- **`generative/components/`** — Pluggable model components selected via YAML config: +- **`generative/components/`** — Pluggable model components selected via the YAML config's `components:` section (registry key noted in parens where it differs from the directory name): - `activity/`: `fixed`, `hierarchical_geno`, `hierarchical_mut`, `horseshoe_geno`, `horseshoe_mut` - - `growth/`: `linear`, `power`, `saturation` + - `growth/` (registry key `condition_growth`): `linear`, `power`, `saturation` - `growth_transition/`: `instant`, `memory`, `baranyi`, `baranyi_k`, `baranyi_tau`, `two_pop` - `transformation/`: `empirical`, `logit_norm`, `single` - `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) + - `dk_geno/`: `fixed`, `hierarchical_geno`, `pinned` + - `noise/` (theta observation noise; registry keys `theta_growth_noise`: `zero`/`beta`/`logit_normal`, `theta_binding_noise`: `zero`/`beta`) - `growth_noise/`: `zero`, `normal_kt` - `ln_cfu0/`: `hierarchical`, `hierarchical_factored` - `sample_offset/`: `zero`, `normal` - - `observe/`: `binding`, `growth` (observation likelihood layers) + +- **`generative/observe/`** — *not* under `components/`, and not swappable via YAML. Holds the four observation-likelihood layers (`binding`, `growth`, `presplit`, `base_growth`), registered under flat `model_registry` keys `observe_binding`/`observe_growth`/`observe_presplit`/`observe_base_growth`. `ModelOrchestrator` wires in `observe_binding` and (unless `binding_only`) `observe_growth` unconditionally, plus `observe_presplit`/`observe_base_growth` only when the corresponding data (`presplit_df`/`base_growth_df`) was supplied — these are parallel, independently-gated observers, not alternative choices for one axis. ### Adding a New Model Component @@ -134,6 +135,8 @@ The hierarchical Bayesian inference engine. Key files: 3. Register it in `tfmodel/generative/registry.py` under the appropriate category key 4. Add a test in `tests/tfscreen/tfmodel/components//` +(This applies to `components/` categories. `generative/observe/` is not a `/` registry entry — see above.) + ### Key Abstractions **`TensorManager`** (`tfmodel/tensors/tensor_manager.py`): Handles ragged tensors. Genotypes have different numbers of observations; this class pads and indexes into JAX-compatible arrays. From f038394153a33b494d56e9cbfe9791930ed8813a Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 20:00:18 -0700 Subject: [PATCH 15/30] cleaned up simulate code organization --- CLAUDE.md | 4 +- src/tfscreen/simulate/binding_data.py | 80 ++++++ src/tfscreen/simulate/library_prediction.py | 5 +- src/tfscreen/simulate/presplit_data.py | 143 ++++++++++ src/tfscreen/simulate/scripts/simulate_cli.py | 218 +--------------- tests/tfscreen/simulate/test_binding_data.py | 49 ++++ .../simulate/test_generate_presplit_data.py | 246 ------------------ tests/tfscreen/simulate/test_presplit_data.py | 159 +++++++++++ tests/tfscreen/simulate/test_simulate_cli.py | 108 +++++--- 9 files changed, 518 insertions(+), 494 deletions(-) create mode 100644 src/tfscreen/simulate/binding_data.py create mode 100644 src/tfscreen/simulate/presplit_data.py create mode 100644 tests/tfscreen/simulate/test_binding_data.py delete mode 100644 tests/tfscreen/simulate/test_generate_presplit_data.py create mode 100644 tests/tfscreen/simulate/test_presplit_data.py diff --git a/CLAUDE.md b/CLAUDE.md index e2140414..3e93950b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -217,12 +217,14 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/library_prediction.py` | Top-level orchestrator; assembles override dicts and calls `thermo_to_growth` | | `simulate/thermo_to_growth.py` | Prior-predictive sampling, theta injection, growth calculation, parameters_df assembly | | `simulate/binding_params.py` | CSV reading (with theta clipping), per-component override builders, binding theta assemblers | +| `simulate/binding_data.py` | Generates simulated observed binding curve data (`binding_data.genotypes` path; `generate_binding_df`) | | `simulate/base_growth_data.py` | Generates simulated direct growth-rate calibration data (`base_growth_data` YAML block) | +| `simulate/presplit_data.py` | Generates simulated pre-split (t = -t_pre) data (`presplit_data` YAML block; `generate_presplit_df`) | | `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/scripts/simulate_cli.py` | `tfs-simulate` CLI entry point; runs `library_prediction` + `selection_experiment` across replicates and writes all output CSVs, including the optional `binding_data`/`presplit_data`/`base_growth_data` blocks | +| `simulate/scripts/simulate_cli.py` | `tfs-simulate` CLI entry point; runs `library_prediction` + `selection_experiment` across replicates and writes all output CSVs, delegating the optional `binding_data`/`presplit_data`/`base_growth_data` blocks to their respective generator modules above | | `simulate/run_simulation.py` | Simpler, non-CLI orchestrator (`run_simulation`); does not support `binding_data`/`presplit_data`/`base_growth_data` | ## YAML Standards diff --git a/src/tfscreen/simulate/binding_data.py b/src/tfscreen/simulate/binding_data.py new file mode 100644 index 00000000..14d57478 --- /dev/null +++ b/src/tfscreen/simulate/binding_data.py @@ -0,0 +1,80 @@ +""" +Generate simulated observed binding curve data (binding_data.genotypes path). + +Uses pre-computed (stratified) theta values from library_prediction and adds +Gaussian noise to produce observed theta values for a "measured" binding +curve CSV -- the mirror image of generate_base_growth_df, which does the same +noise-injection for direct growth-rate calibration data. +""" + +import numpy as np +import pandas as pd + +from tfscreen.genetics import standardize_genotypes + + +def generate_binding_df(binding_cfg, rng, binding_theta_df): + """ + Generate simulated binding curve data for specific genotypes. + + Uses pre-computed (stratified) theta values from library_prediction and + adds Gaussian noise to produce observed theta values. + + Parameters + ---------- + binding_cfg : dict + The 'binding_data' sub-dict from the config. Must contain: + genotypes : list of genotype strings + titrant_name: str, name of the titrant (e.g. 'iptg') + titrant_conc: list of concentrations (mM) + noise : float, sigma for Gaussian noise on theta_obs + rng : numpy.random.Generator + binding_theta_df : pandas.DataFrame + Pre-computed binding theta from library_prediction. Must contain + columns ``genotype``, ``titrant_conc``, ``theta_true``. + + Returns + ------- + pandas.DataFrame + Columns: genotype, titrant_name, titrant_conc, theta_obs, theta_std + """ + titrant_name = binding_cfg["titrant_name"] + titrant_conc = list(binding_cfg["titrant_conc"]) + noise = float(binding_cfg.get("noise", 0.0)) + + # Build lookup: (genotype, conc) → theta_true + theta_lookup = { + (row["genotype"], float(row["titrant_conc"])): row["theta_true"] + for _, row in binding_theta_df.iterrows() + } + + # Genotypes to output: explicit list from config, or every genotype in binding_theta_df. + raw_genotypes = binding_cfg.get("genotypes") + if raw_genotypes: + genotypes = list(standardize_genotypes(raw_genotypes)) + else: + genotypes = list(binding_theta_df["genotype"].unique()) + + rows = [] + for g in genotypes: + for conc in titrant_conc: + key = (g, float(conc)) + if key not in theta_lookup: + raise ValueError( + f"No pre-computed theta for genotype '{g}' at conc {conc}. " + f"Ensure binding_data genotypes and titrant_conc match the config." + ) + theta_true = float(theta_lookup[key]) + if noise > 0: + theta_obs = float(np.clip(theta_true + rng.normal(0, noise), 0, 1)) + else: + theta_obs = theta_true + rows.append({ + "genotype": g, + "titrant_name": titrant_name, + "titrant_conc": conc, + "theta_obs": theta_obs, + "theta_std": noise, + }) + + return pd.DataFrame(rows) diff --git a/src/tfscreen/simulate/library_prediction.py b/src/tfscreen/simulate/library_prediction.py index df3911d1..1197bc90 100644 --- a/src/tfscreen/simulate/library_prediction.py +++ b/src/tfscreen/simulate/library_prediction.py @@ -237,8 +237,9 @@ def library_prediction(cf: Union[Dict[str, Any], str, Path], theta_params_override.update(measured_params) # Accumulate binding rows for measured genotypes (overrides simulated rows) - # Store noise-free theta_true; noise is applied later by simulate_cli - # _generate_binding_data, consistent with the simulated-genotypes path. + # Store noise-free theta_true; noise is applied later by + # binding_data.generate_binding_df, consistent with the + # simulated-genotypes path. measured_binding_df = build_binding_theta_from_params( params_dict=params_dict, binding_concs=binding_concs, diff --git a/src/tfscreen/simulate/presplit_data.py b/src/tfscreen/simulate/presplit_data.py new file mode 100644 index 00000000..17e5f390 --- /dev/null +++ b/src/tfscreen/simulate/presplit_data.py @@ -0,0 +1,143 @@ +""" +Generate simulated pre-split (t = -t_pre) data (presplit_data config block). + +Mirrors the inference-side presplit_df input by drawing a synthetic +sequencing sample from the initial library-frequency distribution (encoded +as ln_cfu_0 in the selection-experiment counts output) for each unique +(replicate, condition_pre) pair, then converting counts to ln_cfu / +ln_cfu_std using the same variance-propagation formula as counts_to_lncfu. +""" + +import numpy as np +import pandas as pd + +from tfscreen.simulate.selection_experiment import _sim_index_hop + + +def generate_presplit_df(combined_sample_df, combined_counts_df, cf, rng): + """ + Generate simulated pre-split (t = -t_pre) data from selection-experiment + outputs. + + For each unique ``(replicate, condition_pre)`` pair, this function draws a + synthetic sequencing sample from the initial library-frequency distribution + (encoded as ``ln_cfu_0`` in ``combined_counts_df``). The resulting counts + are converted to ``ln_cfu`` and ``ln_cfu_std`` using the same + variance-propagation formula as ``counts_to_lncfu``, yielding a DataFrame + that can be passed directly to ``tfs-configure-model --presplit_df``. + + Parameters + ---------- + combined_sample_df : pandas.DataFrame + Concatenated sample metadata across all replicates (index = sample ID). + Must contain columns ``replicate`` and ``condition_pre``. + combined_counts_df : pandas.DataFrame + Concatenated genotype counts across all replicates. Must contain + columns ``sample``, ``genotype``, and ``ln_cfu_0`` (the ground-truth + initial log-CFU per genotype computed by the simulation). + cf : dict + Full run configuration (already read from YAML). Used keys: + ``cfu0``, ``total_num_reads``, ``prob_index_hop``. The optional ``presplit_data`` sub-dict may + contain a scalar ``noise`` key (default 0) to add extra Gaussian noise + to ``ln_cfu`` on the log scale. + rng : numpy.random.Generator + Seeded random-number generator shared with the rest of the simulation. + + Returns + ------- + pandas.DataFrame + 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 + transformation pool) receive ``ln_cfu = NaN``. + """ + total_cfu0 = float(cf["cfu0"]) + presplit_cfg = cf.get("presplit_data", {}) + extra_noise = float(presplit_cfg.get("noise", 0.0)) if presplit_cfg else 0.0 + pseudocount = 1 + + # Reads per presplit sample: use the same budget as the main experiment + # (total reads / total selection samples). + total_num_reads = int(cf["total_num_reads"]) + total_num_samples = len(combined_sample_df) + reads_per_sample = max(1, int(round(total_num_reads / total_num_samples))) + + # 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", "library", "condition_pre"]] + .drop_duplicates("sample")) + counts_meta = pd.merge(combined_counts_df, sample_meta, on="sample", how="left") + + # 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", "library", "condition_pre", "genotype"], observed=True) + .first() + .reset_index()[["replicate", "library", "condition_pre", "genotype", "ln_cfu_0"]]) + + rows = [] + 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 + + # Convert ground-truth ln_cfu_0 to initial frequencies. + # Genotypes with ln_cfu_0 = -inf (absent from transformation pool) + # get frequency 0. + cfu0_raw = np.where(np.isfinite(ln_cfu0), np.exp(ln_cfu0), 0.0) + total_cfu_group = cfu0_raw.sum() + if total_cfu_group == 0: + continue + freqs = cfu0_raw / total_cfu_group + + # Simulate multinomial sequencing draw from the initial distribution. + counts = rng.multinomial(reads_per_sample, freqs) + + # Optionally apply index hopping (same as the selection samples). + counts = _sim_index_hop(counts, cf.get("prob_index_hop"), rng) + + # ---------- counts → ln_cfu (mirrors counts_to_lncfu logic) ---------- + sample_cfu = total_cfu0 + + total_adjusted = counts.sum() + len(counts) * pseudocount + adj_counts = counts + pseudocount + freq_est = adj_counts / total_adjusted + cfu_est = freq_est * sample_cfu + + # Variance from binomial frequency uncertainty only + var_freq = freq_est * (1.0 - freq_est) / total_adjusted + with np.errstate(divide="ignore", invalid="ignore"): + rel_var_freq = np.where(freq_est > 0, + var_freq / (freq_est ** 2), 0.0) + ln_cfu_var = rel_var_freq + + # Optional additional noise on the log scale + if extra_noise > 0.0: + ln_cfu_var = ln_cfu_var + extra_noise ** 2 + ln_cfu_shift = rng.normal(0.0, extra_noise, size=len(genos)) + else: + ln_cfu_shift = np.zeros(len(genos)) + + with np.errstate(divide="ignore"): + ln_cfu_vals = np.log(cfu_est) + ln_cfu_shift + + # Zero-count entries become NaN + ln_cfu_vals = np.where(cfu_est > 0, ln_cfu_vals, np.nan) + ln_cfu_var = np.where(cfu_est > 0, ln_cfu_var, np.nan) + ln_cfu_std_vals = np.sqrt(ln_cfu_var) + + for i, geno in enumerate(genos): + rows.append({ + "library": lib, + "replicate": rep, + "condition_pre": cp, + "genotype": geno, + "ln_cfu": float(ln_cfu_vals[i]), + "ln_cfu_std": float(ln_cfu_std_vals[i]), + "ln_cfu_0_true": float(ln_cfu0[i]), + }) + + return pd.DataFrame(rows) diff --git a/src/tfscreen/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index ba72f5be..34c8cb7d 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -5,209 +5,13 @@ import tfscreen from tfscreen.simulate import library_prediction, selection_experiment -from tfscreen.simulate.selection_experiment import _sim_index_hop +from tfscreen.simulate.binding_data import generate_binding_df +from tfscreen.simulate.presplit_data import generate_presplit_df from tfscreen.simulate.base_growth_data import generate_base_growth_df -from tfscreen.genetics import standardize_genotypes from tfscreen.process_raw import counts_to_lncfu from tfscreen.util.cli.generalized_main import generalized_main -def _generate_binding_data(binding_cfg, rng, binding_theta_df): - """ - Generate simulated binding curve data for specific genotypes. - - Uses pre-computed (stratified) theta values from library_prediction and - adds Gaussian noise to produce observed theta values. - - Parameters - ---------- - binding_cfg : dict - The 'binding_data' sub-dict from the config. Must contain: - genotypes : list of genotype strings - titrant_name: str, name of the titrant (e.g. 'iptg') - titrant_conc: list of concentrations (mM) - noise : float, sigma for Gaussian noise on theta_obs - rng : numpy.random.Generator - binding_theta_df : pandas.DataFrame - Pre-computed binding theta from library_prediction. Must contain - columns ``genotype``, ``titrant_conc``, ``theta_true``. - - Returns - ------- - pandas.DataFrame - Columns: genotype, titrant_name, titrant_conc, theta_obs, theta_std - """ - titrant_name = binding_cfg["titrant_name"] - titrant_conc = list(binding_cfg["titrant_conc"]) - noise = float(binding_cfg.get("noise", 0.0)) - - # Build lookup: (genotype, conc) → theta_true - theta_lookup = { - (row["genotype"], float(row["titrant_conc"])): row["theta_true"] - for _, row in binding_theta_df.iterrows() - } - - # Genotypes to output: explicit list from config, or every genotype in binding_theta_df. - raw_genotypes = binding_cfg.get("genotypes") - if raw_genotypes: - genotypes = list(standardize_genotypes(raw_genotypes)) - else: - genotypes = list(binding_theta_df["genotype"].unique()) - - rows = [] - for g in genotypes: - for conc in titrant_conc: - key = (g, float(conc)) - if key not in theta_lookup: - raise ValueError( - f"No pre-computed theta for genotype '{g}' at conc {conc}. " - f"Ensure binding_data genotypes and titrant_conc match the config." - ) - theta_true = float(theta_lookup[key]) - if noise > 0: - theta_obs = float(np.clip(theta_true + rng.normal(0, noise), 0, 1)) - else: - theta_obs = theta_true - rows.append({ - "genotype": g, - "titrant_name": titrant_name, - "titrant_conc": conc, - "theta_obs": theta_obs, - "theta_std": noise, - }) - - return pd.DataFrame(rows) - - -def _generate_presplit_data(combined_sample_df, combined_counts_df, cf, rng): - """ - Generate simulated pre-split (t = -t_pre) data from selection-experiment - outputs. - - For each unique ``(replicate, condition_pre)`` pair, this function draws a - synthetic sequencing sample from the initial library-frequency distribution - (encoded as ``ln_cfu_0`` in ``combined_counts_df``). The resulting counts - are converted to ``ln_cfu`` and ``ln_cfu_std`` using the same - variance-propagation formula as ``counts_to_lncfu``, yielding a DataFrame - that can be passed directly to ``tfs-configure-model --presplit_df``. - - Parameters - ---------- - combined_sample_df : pandas.DataFrame - Concatenated sample metadata across all replicates (index = sample ID). - Must contain columns ``replicate`` and ``condition_pre``. - combined_counts_df : pandas.DataFrame - Concatenated genotype counts across all replicates. Must contain - columns ``sample``, ``genotype``, and ``ln_cfu_0`` (the ground-truth - initial log-CFU per genotype computed by the simulation). - cf : dict - Full run configuration (already read from YAML). Used keys: - ``cfu0``, ``total_num_reads``, ``prob_index_hop``. The optional ``presplit_data`` sub-dict may - contain a scalar ``noise`` key (default 0) to add extra Gaussian noise - to ``ln_cfu`` on the log scale. - rng : numpy.random.Generator - Seeded random-number generator shared with the rest of the simulation. - - Returns - ------- - pandas.DataFrame - 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 - transformation pool) receive ``ln_cfu = NaN``. - """ - total_cfu0 = float(cf["cfu0"]) - presplit_cfg = cf.get("presplit_data", {}) - extra_noise = float(presplit_cfg.get("noise", 0.0)) if presplit_cfg else 0.0 - pseudocount = 1 - - # Reads per presplit sample: use the same budget as the main experiment - # (total reads / total selection samples). - total_num_reads = int(cf["total_num_reads"]) - total_num_samples = len(combined_sample_df) - reads_per_sample = max(1, int(round(total_num_reads / total_num_samples))) - - # 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", "library", "condition_pre"]] - .drop_duplicates("sample")) - counts_meta = pd.merge(combined_counts_df, sample_meta, on="sample", how="left") - - # 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", "library", "condition_pre", "genotype"], observed=True) - .first() - .reset_index()[["replicate", "library", "condition_pre", "genotype", "ln_cfu_0"]]) - - rows = [] - 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 - - # Convert ground-truth ln_cfu_0 to initial frequencies. - # Genotypes with ln_cfu_0 = -inf (absent from transformation pool) - # get frequency 0. - cfu0_raw = np.where(np.isfinite(ln_cfu0), np.exp(ln_cfu0), 0.0) - total_cfu_group = cfu0_raw.sum() - if total_cfu_group == 0: - continue - freqs = cfu0_raw / total_cfu_group - - # Simulate multinomial sequencing draw from the initial distribution. - counts = rng.multinomial(reads_per_sample, freqs) - - # Optionally apply index hopping (same as the selection samples). - counts = _sim_index_hop(counts, cf.get("prob_index_hop"), rng) - - # ---------- counts → ln_cfu (mirrors counts_to_lncfu logic) ---------- - sample_cfu = total_cfu0 - - total_adjusted = counts.sum() + len(counts) * pseudocount - adj_counts = counts + pseudocount - freq_est = adj_counts / total_adjusted - cfu_est = freq_est * sample_cfu - - # Variance from binomial frequency uncertainty only - var_freq = freq_est * (1.0 - freq_est) / total_adjusted - with np.errstate(divide="ignore", invalid="ignore"): - rel_var_freq = np.where(freq_est > 0, - var_freq / (freq_est ** 2), 0.0) - ln_cfu_var = rel_var_freq - - # Optional additional noise on the log scale - if extra_noise > 0.0: - ln_cfu_var = ln_cfu_var + extra_noise ** 2 - ln_cfu_shift = rng.normal(0.0, extra_noise, size=len(genos)) - else: - ln_cfu_shift = np.zeros(len(genos)) - - with np.errstate(divide="ignore"): - ln_cfu_vals = np.log(cfu_est) + ln_cfu_shift - - # Zero-count entries become NaN - ln_cfu_vals = np.where(cfu_est > 0, ln_cfu_vals, np.nan) - ln_cfu_var = np.where(cfu_est > 0, ln_cfu_var, np.nan) - ln_cfu_std_vals = np.sqrt(ln_cfu_var) - - for i, geno in enumerate(genos): - rows.append({ - "library": lib, - "replicate": rep, - "condition_pre": cp, - "genotype": geno, - "ln_cfu": float(ln_cfu_vals[i]), - "ln_cfu_std": float(ln_cfu_std_vals[i]), - "ln_cfu_0_true": float(ln_cfu0[i]), - }) - - return pd.DataFrame(rows) - - def run_simulation_from_config( config_file, output_dir, @@ -223,9 +27,13 @@ def run_simulation_from_config( selection_experiment. Writes library, parameters, genotype_theta (long-form: genotype/titrant_name/titrant_conc/theta), and analysis-ready growth CSV files. If the config contains a 'binding_data' block, also writes a - simulated binding curve CSV. If it contains a 'base_growth_data' block, - also writes a simulated direct growth-rate calibration CSV (see - tfscreen.simulate.base_growth_data.generate_base_growth_df). + simulated binding curve CSV (see + tfscreen.simulate.binding_data.generate_binding_df). If it contains a + 'base_growth_data' block, also writes a simulated direct growth-rate + calibration CSV (see + tfscreen.simulate.base_growth_data.generate_base_growth_df). If it + contains a 'presplit_data' block, also writes a simulated presplit CSV + (see tfscreen.simulate.presplit_data.generate_presplit_df). Parameters ---------- @@ -329,7 +137,7 @@ def out_path(name): print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth'])}") if "binding_data" in cf: - binding_df = _generate_binding_data(cf["binding_data"], rng, binding_theta_df) + binding_df = generate_binding_df(cf["binding_data"], rng, binding_theta_df) binding_df.to_csv(out_path("binding"), index=False) print(f"Wrote: {out_path('binding')}") @@ -340,9 +148,9 @@ def out_path(name): if "presplit_data" in cf: print("\nGenerating presplit data...", flush=True) - presplit_df = _generate_presplit_data(combined_sample_df, - combined_counts_df, - cf, rng) + presplit_df = generate_presplit_df(combined_sample_df, + combined_counts_df, + cf, rng) presplit_df.to_csv(out_path("presplit"), index=False) print(f"Wrote: {out_path('presplit')}") diff --git a/tests/tfscreen/simulate/test_binding_data.py b/tests/tfscreen/simulate/test_binding_data.py new file mode 100644 index 00000000..6896dc5b --- /dev/null +++ b/tests/tfscreen/simulate/test_binding_data.py @@ -0,0 +1,49 @@ +"""Tests for tfscreen.simulate.binding_data.generate_binding_df.""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.binding_data import generate_binding_df + + +def test_generate_binding_data_uses_precomputed_theta(): + """generate_binding_df must use theta_true from binding_theta_df, + not re-sample from the prior.""" + binding_cfg = { + "genotypes": ["wt", "M1A"], + "titrant_name": "iptg", + "titrant_conc": [0.0, 1.0], + "noise": 0.0, + } + rng = np.random.default_rng(0) + binding_theta_df = pd.DataFrame([ + {"genotype": "wt", "titrant_conc": 0.0, "theta_true": 0.1}, + {"genotype": "wt", "titrant_conc": 1.0, "theta_true": 0.9}, + {"genotype": "M1A", "titrant_conc": 0.0, "theta_true": 0.2}, + {"genotype": "M1A", "titrant_conc": 1.0, "theta_true": 0.8}, + ]) + + result = generate_binding_df(binding_cfg, rng, binding_theta_df) + + assert set(result.columns) >= {"genotype", "titrant_name", "titrant_conc", + "theta_obs", "theta_std"} + wt_row = result[(result["genotype"] == "wt") & (result["titrant_conc"] == 1.0)] + assert float(wt_row["theta_obs"].iloc[0]) == pytest.approx(0.9) + + +def test_generate_binding_data_missing_genotype_raises(): + """Raises ValueError when a genotype/conc pair is absent from binding_theta_df.""" + binding_cfg = { + "genotypes": ["wt", "A2V"], # A2V is valid but not in binding_theta_df + "titrant_name": "iptg", + "titrant_conc": [1.0], + "noise": 0.0, + } + rng = np.random.default_rng(0) + binding_theta_df = pd.DataFrame([ + {"genotype": "wt", "titrant_conc": 1.0, "theta_true": 0.5}, + ]) + + with pytest.raises(ValueError, match="No pre-computed theta"): + generate_binding_df(binding_cfg, rng, binding_theta_df) diff --git a/tests/tfscreen/simulate/test_generate_presplit_data.py b/tests/tfscreen/simulate/test_generate_presplit_data.py deleted file mode 100644 index f1ae7639..00000000 --- a/tests/tfscreen/simulate/test_generate_presplit_data.py +++ /dev/null @@ -1,246 +0,0 @@ -""" -Tests for _generate_presplit_data in simulate_cli. - -Coverage: - - Output columns and shape for a simple two-genotype, two-condition case - - Genotypes absent from the transformation pool (ln_cfu_0 = -inf) → NaN ln_cfu - - extra_noise parameter inflates ln_cfu_std - - Output is deterministic given the same rng seed - - run_simulation_from_config writes a presplit CSV when presplit_data is in cf -""" -import pytest -import numpy as np -import pandas as pd -from unittest.mock import patch, MagicMock - -from tfscreen.simulate.scripts.simulate_cli import _generate_presplit_data - - -# --------------------------------------------------------------------------- -# Minimal fixtures -# --------------------------------------------------------------------------- - -def _make_inputs( - replicates=(1, 2), - condition_pres=("kanR", "pheS"), - genotypes=("wt", "A1V", "A2V"), - ln_cfu_0_val=10.0, -): - """Build minimal combined_sample_df and combined_counts_df.""" - sample_rows = [] - counts_rows = [] - sample_id = 0 - - for rep in replicates: - for cp in condition_pres: - # 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, "library": "lib", - "condition_pre": cp, "t_sel": t_sel, - "sample_cfu": 1e8, "sample_cfu_std": 5e6} - ) - for geno in genotypes: - counts_rows.append( - {"sample": sample_id, "genotype": geno, - "ln_cfu_0": ln_cfu_0_val, "counts": 100} - ) - sample_id += 1 - - sample_df = pd.DataFrame(sample_rows).set_index("sample") - counts_df = pd.DataFrame(counts_rows) - return sample_df, counts_df - - -def _minimal_cf(noise=0.0, extra_keys=None): - cf = { - "cfu0": 1e8, - "total_num_reads": 30_000_000, - "prob_index_hop": None, - "presplit_data": {"noise": noise}, - } - if extra_keys: - cf.update(extra_keys) - return cf - - -# --------------------------------------------------------------------------- -# Basic output structure -# --------------------------------------------------------------------------- - -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 ["library", "replicate", "condition_pre", "genotype", - "ln_cfu", "ln_cfu_std", "ln_cfu_0_true"]: - assert col in result.columns, f"missing column: {col}" - - -def test_output_row_count(): - """One row per (replicate, condition_pre, genotype).""" - replicates = (1, 2) - cps = ("kanR", "pheS") - genos = ("wt", "A1V", "A2V") - sample_df, counts_df = _make_inputs(replicates=replicates, - condition_pres=cps, - genotypes=genos) - result = _generate_presplit_data(sample_df, counts_df, _minimal_cf(), - np.random.default_rng(0)) - expected = len(replicates) * len(cps) * len(genos) - assert len(result) == expected - - -def test_ln_cfu_is_finite_for_present_genotypes(): - sample_df, counts_df = _make_inputs() - result = _generate_presplit_data(sample_df, counts_df, _minimal_cf(), - np.random.default_rng(0)) - # All genotypes have finite ln_cfu_0 so ln_cfu should be finite - assert result["ln_cfu"].notna().all() - - -def test_ln_cfu_std_is_positive(): - sample_df, counts_df = _make_inputs() - result = _generate_presplit_data(sample_df, counts_df, _minimal_cf(), - np.random.default_rng(0)) - assert (result["ln_cfu_std"] > 0).all() - - -# --------------------------------------------------------------------------- -# Absent genotypes (ln_cfu_0 = -inf) -# --------------------------------------------------------------------------- - -def test_absent_genotype_lower_lncfu(): - """A genotype with ln_cfu_0 = -inf (never transformed) gets zero counts - from the multinomial draw. After applying the pseudocount it still gets a - finite (but very low) ln_cfu estimate — the same behaviour as - counts_to_lncfu — and its ln_cfu is substantially lower than a present - genotype.""" - sample_df, counts_df = _make_inputs() - # Set one genotype's ln_cfu_0 to -inf across all samples - counts_df.loc[counts_df["genotype"] == "A2V", "ln_cfu_0"] = -np.inf - result = _generate_presplit_data(sample_df, counts_df, _minimal_cf(), - np.random.default_rng(0)) - absent_ln = result.loc[result["genotype"] == "A2V", "ln_cfu"].mean() - present_ln = result.loc[result["genotype"] == "wt", "ln_cfu"].mean() - # Absent genotype should be much lower than a normally-present genotype - assert absent_ln < present_ln - 5.0 - - -# --------------------------------------------------------------------------- -# extra_noise parameter -# --------------------------------------------------------------------------- - -def test_extra_noise_inflates_ln_cfu_std(): - """Adding extra noise should increase the mean ln_cfu_std.""" - sample_df, counts_df = _make_inputs() - rng0 = np.random.default_rng(42) - rng1 = np.random.default_rng(42) - - result_no_noise = _generate_presplit_data(sample_df, counts_df, - _minimal_cf(noise=0.0), rng0) - result_with_noise = _generate_presplit_data(sample_df, counts_df, - _minimal_cf(noise=0.5), rng1) - - mean_std_no_noise = result_no_noise["ln_cfu_std"].mean() - mean_std_with_noise = result_with_noise["ln_cfu_std"].mean() - assert mean_std_with_noise > mean_std_no_noise - - -# --------------------------------------------------------------------------- -# Reproducibility -# --------------------------------------------------------------------------- - -def test_reproducibility(): - """Same rng seed → identical output.""" - sample_df, counts_df = _make_inputs() - r1 = _generate_presplit_data(sample_df.copy(), counts_df.copy(), _minimal_cf(), - np.random.default_rng(7)) - r2 = _generate_presplit_data(sample_df.copy(), counts_df.copy(), _minimal_cf(), - np.random.default_rng(7)) - pd.testing.assert_frame_equal(r1.reset_index(drop=True), - r2.reset_index(drop=True)) - - -# --------------------------------------------------------------------------- -# Integration: run_simulation_from_config writes presplit CSV -# --------------------------------------------------------------------------- - -def test_run_simulation_writes_presplit_csv(tmp_path): - """presplit CSV is written when presplit_data block is in the config.""" - from tfscreen.simulate.scripts.simulate_cli import run_simulation_from_config - - lib_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) - pheno_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) - theta_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) - params_df = pd.DataFrame({"genotype": ["wt", "A1V"], - "dk_geno": [0.0, 0.0], "activity": [1.0, 1.0]}) - - # Sample/counts for one (replicate, condition_pre, t_sel) combo - # 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, "library": "lib", "condition_pre": "kanR", - "t_sel": 60.0, "sample_cfu": 1e8, "sample_cfu_std": 5e6, - }], index=[0]) - counts_df = pd.DataFrame([ - {"sample": 0, "genotype": "wt", "counts": 500, "ln_cfu_0": 10.0}, - {"sample": 0, "genotype": "A1V", "counts": 500, "ln_cfu_0": 10.0}, - ]) - growth_df = pd.DataFrame({"genotype": ["wt", "A1V"], "ln_cfu": [10.0, 9.9]}) - - cf = { - "seed": 1, - "cfu0": 1e8, - "total_num_reads": 10_000_000, - "prob_index_hop": None, - "presplit_data": {"noise": 0.0}, - } - - with patch("tfscreen.util.read_yaml", return_value=cf), \ - patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", - return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ - patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", - return_value=(sample_df, counts_df)), \ - patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", - return_value=growth_df): - run_simulation_from_config("fake_config.yaml", str(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 ["library", "replicate", "condition_pre", "genotype", - "ln_cfu", "ln_cfu_std"]: - assert col in presplit_df.columns - - -def test_run_simulation_no_presplit_without_config(tmp_path): - """presplit CSV is NOT written when presplit_data is absent from config.""" - from tfscreen.simulate.scripts.simulate_cli import run_simulation_from_config - - lib_df = pd.DataFrame({"genotype": ["wt"]}) - 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, "library": "lib", - "condition_pre": "kanR", "t_sel": 60.0, - "sample_cfu": 1e8, "sample_cfu_std": 5e6}], - index=[0]) - counts_df = pd.DataFrame([{"sample": 0, "genotype": "wt", - "counts": 1000, "ln_cfu_0": 10.0}]) - growth_df = pd.DataFrame({"genotype": ["wt"], "ln_cfu": [10.0]}) - - cf = {"seed": 1, "cfu0": 1e8, "total_num_reads": 1_000_000, - "prob_index_hop": None} - - with patch("tfscreen.util.read_yaml", return_value=cf), \ - patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", - return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ - patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", - return_value=(sample_df, counts_df)), \ - patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", - return_value=growth_df): - run_simulation_from_config("fake_config.yaml", str(tmp_path)) - - presplit_path = tmp_path / "tfs_sim_presplit.csv" - assert not presplit_path.exists(), "presplit CSV should not be written without config block" diff --git a/tests/tfscreen/simulate/test_presplit_data.py b/tests/tfscreen/simulate/test_presplit_data.py new file mode 100644 index 00000000..c5ae5404 --- /dev/null +++ b/tests/tfscreen/simulate/test_presplit_data.py @@ -0,0 +1,159 @@ +""" +Tests for tfscreen.simulate.presplit_data.generate_presplit_df. + +Coverage: + - Output columns and shape for a simple two-genotype, two-condition case + - Genotypes absent from the transformation pool (ln_cfu_0 = -inf) → NaN ln_cfu + - extra_noise parameter inflates ln_cfu_std + - Output is deterministic given the same rng seed +""" +import numpy as np +import pandas as pd + +from tfscreen.simulate.presplit_data import generate_presplit_df + + +# --------------------------------------------------------------------------- +# Minimal fixtures +# --------------------------------------------------------------------------- + +def _make_inputs( + replicates=(1, 2), + condition_pres=("kanR", "pheS"), + genotypes=("wt", "A1V", "A2V"), + ln_cfu_0_val=10.0, +): + """Build minimal combined_sample_df and combined_counts_df.""" + sample_rows = [] + counts_rows = [] + sample_id = 0 + + for rep in replicates: + for cp in condition_pres: + # 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, "library": "lib", + "condition_pre": cp, "t_sel": t_sel, + "sample_cfu": 1e8, "sample_cfu_std": 5e6} + ) + for geno in genotypes: + counts_rows.append( + {"sample": sample_id, "genotype": geno, + "ln_cfu_0": ln_cfu_0_val, "counts": 100} + ) + sample_id += 1 + + sample_df = pd.DataFrame(sample_rows).set_index("sample") + counts_df = pd.DataFrame(counts_rows) + return sample_df, counts_df + + +def _minimal_cf(noise=0.0, extra_keys=None): + cf = { + "cfu0": 1e8, + "total_num_reads": 30_000_000, + "prob_index_hop": None, + "presplit_data": {"noise": noise}, + } + if extra_keys: + cf.update(extra_keys) + return cf + + +# --------------------------------------------------------------------------- +# Basic output structure +# --------------------------------------------------------------------------- + +def test_output_columns(): + sample_df, counts_df = _make_inputs() + result = generate_presplit_df(sample_df, counts_df, _minimal_cf(), + np.random.default_rng(0)) + 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}" + + +def test_output_row_count(): + """One row per (replicate, condition_pre, genotype).""" + replicates = (1, 2) + cps = ("kanR", "pheS") + genos = ("wt", "A1V", "A2V") + sample_df, counts_df = _make_inputs(replicates=replicates, + condition_pres=cps, + genotypes=genos) + result = generate_presplit_df(sample_df, counts_df, _minimal_cf(), + np.random.default_rng(0)) + expected = len(replicates) * len(cps) * len(genos) + assert len(result) == expected + + +def test_ln_cfu_is_finite_for_present_genotypes(): + sample_df, counts_df = _make_inputs() + result = generate_presplit_df(sample_df, counts_df, _minimal_cf(), + np.random.default_rng(0)) + # All genotypes have finite ln_cfu_0 so ln_cfu should be finite + assert result["ln_cfu"].notna().all() + + +def test_ln_cfu_std_is_positive(): + sample_df, counts_df = _make_inputs() + result = generate_presplit_df(sample_df, counts_df, _minimal_cf(), + np.random.default_rng(0)) + assert (result["ln_cfu_std"] > 0).all() + + +# --------------------------------------------------------------------------- +# Absent genotypes (ln_cfu_0 = -inf) +# --------------------------------------------------------------------------- + +def test_absent_genotype_lower_lncfu(): + """A genotype with ln_cfu_0 = -inf (never transformed) gets zero counts + from the multinomial draw. After applying the pseudocount it still gets a + finite (but very low) ln_cfu estimate — the same behaviour as + counts_to_lncfu — and its ln_cfu is substantially lower than a present + genotype.""" + sample_df, counts_df = _make_inputs() + # Set one genotype's ln_cfu_0 to -inf across all samples + counts_df.loc[counts_df["genotype"] == "A2V", "ln_cfu_0"] = -np.inf + result = generate_presplit_df(sample_df, counts_df, _minimal_cf(), + np.random.default_rng(0)) + absent_ln = result.loc[result["genotype"] == "A2V", "ln_cfu"].mean() + present_ln = result.loc[result["genotype"] == "wt", "ln_cfu"].mean() + # Absent genotype should be much lower than a normally-present genotype + assert absent_ln < present_ln - 5.0 + + +# --------------------------------------------------------------------------- +# extra_noise parameter +# --------------------------------------------------------------------------- + +def test_extra_noise_inflates_ln_cfu_std(): + """Adding extra noise should increase the mean ln_cfu_std.""" + sample_df, counts_df = _make_inputs() + rng0 = np.random.default_rng(42) + rng1 = np.random.default_rng(42) + + result_no_noise = generate_presplit_df(sample_df, counts_df, + _minimal_cf(noise=0.0), rng0) + result_with_noise = generate_presplit_df(sample_df, counts_df, + _minimal_cf(noise=0.5), rng1) + + mean_std_no_noise = result_no_noise["ln_cfu_std"].mean() + mean_std_with_noise = result_with_noise["ln_cfu_std"].mean() + assert mean_std_with_noise > mean_std_no_noise + + +# --------------------------------------------------------------------------- +# Reproducibility +# --------------------------------------------------------------------------- + +def test_reproducibility(): + """Same rng seed → identical output.""" + sample_df, counts_df = _make_inputs() + r1 = generate_presplit_df(sample_df.copy(), counts_df.copy(), _minimal_cf(), + np.random.default_rng(7)) + r2 = generate_presplit_df(sample_df.copy(), counts_df.copy(), _minimal_cf(), + np.random.default_rng(7)) + pd.testing.assert_frame_equal(r1.reset_index(drop=True), + r2.reset_index(drop=True)) diff --git a/tests/tfscreen/simulate/test_simulate_cli.py b/tests/tfscreen/simulate/test_simulate_cli.py index 06915886..f812d4f3 100644 --- a/tests/tfscreen/simulate/test_simulate_cli.py +++ b/tests/tfscreen/simulate/test_simulate_cli.py @@ -212,55 +212,83 @@ def capture_csv(self_df, path, **kwargs): # --------------------------------------------------------------------------- -# _generate_binding_data: uses pre-computed theta from library_prediction +# presplit_data: written only when configured # --------------------------------------------------------------------------- -def test_generate_binding_data_uses_precomputed_theta(): - """_generate_binding_data must use theta_true from binding_theta_df, - not re-sample from the prior.""" - import numpy as np - from tfscreen.simulate.scripts.simulate_cli import _generate_binding_data - - binding_cfg = { - "genotypes": ["wt", "M1A"], - "titrant_name": "iptg", - "titrant_conc": [0.0, 1.0], - "noise": 0.0, - } - rng = np.random.default_rng(0) - binding_theta_df = pd.DataFrame([ - {"genotype": "wt", "titrant_conc": 0.0, "theta_true": 0.1}, - {"genotype": "wt", "titrant_conc": 1.0, "theta_true": 0.9}, - {"genotype": "M1A", "titrant_conc": 0.0, "theta_true": 0.2}, - {"genotype": "M1A", "titrant_conc": 1.0, "theta_true": 0.8}, +def test_run_simulation_writes_presplit_csv(tmp_path): + """presplit CSV is written when presplit_data block is in the config.""" + lib_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) + pheno_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) + theta_df = pd.DataFrame({"genotype": ["wt", "A1V"]}) + params_df = pd.DataFrame({"genotype": ["wt", "A1V"], + "dk_geno": [0.0, 0.0], "activity": [1.0, 1.0]}) + + # Sample/counts for one (replicate, condition_pre, t_sel) combo + # 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, "library": "lib", "condition_pre": "kanR", + "t_sel": 60.0, "sample_cfu": 1e8, "sample_cfu_std": 5e6, + }], index=[0]) + counts_df = pd.DataFrame([ + {"sample": 0, "genotype": "wt", "counts": 500, "ln_cfu_0": 10.0}, + {"sample": 0, "genotype": "A1V", "counts": 500, "ln_cfu_0": 10.0}, ]) + growth_df = pd.DataFrame({"genotype": ["wt", "A1V"], "ln_cfu": [10.0, 9.9]}) - result = _generate_binding_data(binding_cfg, rng, binding_theta_df) + cf = { + "seed": 1, + "cfu0": 1e8, + "total_num_reads": 10_000_000, + "prob_index_hop": None, + "presplit_data": {"noise": 0.0}, + } - assert set(result.columns) >= {"genotype", "titrant_name", "titrant_conc", - "theta_obs", "theta_std"} - wt_row = result[(result["genotype"] == "wt") & (result["titrant_conc"] == 1.0)] - assert float(wt_row["theta_obs"].iloc[0]) == pytest.approx(0.9) + with patch("tfscreen.util.read_yaml", return_value=cf), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df): + run_simulation_from_config("fake_config.yaml", str(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 ["library", "replicate", "condition_pre", "genotype", + "ln_cfu", "ln_cfu_std"]: + assert col in presplit_df.columns -def test_generate_binding_data_missing_genotype_raises(): - """Raises ValueError when a genotype/conc pair is absent from binding_theta_df.""" - import numpy as np - from tfscreen.simulate.scripts.simulate_cli import _generate_binding_data - binding_cfg = { - "genotypes": ["wt", "A2V"], # A2V is valid but not in binding_theta_df - "titrant_name": "iptg", - "titrant_conc": [1.0], - "noise": 0.0, - } - rng = np.random.default_rng(0) - binding_theta_df = pd.DataFrame([ - {"genotype": "wt", "titrant_conc": 1.0, "theta_true": 0.5}, - ]) +def test_run_simulation_no_presplit_without_config(tmp_path): + """presplit CSV is NOT written when presplit_data is absent from config.""" + lib_df = pd.DataFrame({"genotype": ["wt"]}) + 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, "library": "lib", + "condition_pre": "kanR", "t_sel": 60.0, + "sample_cfu": 1e8, "sample_cfu_std": 5e6}], + index=[0]) + counts_df = pd.DataFrame([{"sample": 0, "genotype": "wt", + "counts": 1000, "ln_cfu_0": 10.0}]) + growth_df = pd.DataFrame({"genotype": ["wt"], "ln_cfu": [10.0]}) + + cf = {"seed": 1, "cfu0": 1e8, "total_num_reads": 1_000_000, + "prob_index_hop": None} + + with patch("tfscreen.util.read_yaml", return_value=cf), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df): + run_simulation_from_config("fake_config.yaml", str(tmp_path)) - with pytest.raises(ValueError, match="No pre-computed theta"): - _generate_binding_data(binding_cfg, rng, binding_theta_df) + presplit_path = tmp_path / "tfs_sim_presplit.csv" + assert not presplit_path.exists(), "presplit CSV should not be written without config block" # --------------------------------------------------------------------------- From 2d162ca241a27b52fb8e3205e53dca6f8b89570f Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sat, 4 Jul 2026 21:23:11 -0700 Subject: [PATCH 16/30] user now must specify lambda estimate for trans models --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- examples/tfmodel/grid.yaml | 5 + reports/flake.txt | 4701 ++--------------- reports/junit/junit.xml | 2 +- .../components/transformation/_congression.py | 90 +- .../components/transformation/empirical.py | 20 +- .../components/transformation/logit_norm.py | 20 +- src/tfscreen/tfmodel/model_orchestrator.py | 39 +- .../tfmodel/scripts/configure_model_cli.py | 29 +- .../tfmodel/analysis/test_prediction.py | 10 +- .../transformation/test__congression.py | 72 +- .../transformation/test_empirical.py | 16 + .../transformation/test_logit_norm.py | 16 + .../tfmodel/scripts/test_configure_and_run.py | 34 + .../tfmodel/test_model_orchestrator.py | 133 + 16 files changed, 854 insertions(+), 4337 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 321067b6..0d114e2c 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.48%coverage96.48% \ No newline at end of file +coverage: 96.49%coverage96.49% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 0d27efde..21e7d556 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3820tests3820 \ No newline at end of file +tests: 3841tests3841 \ No newline at end of file diff --git a/examples/tfmodel/grid.yaml b/examples/tfmodel/grid.yaml index ee23dc98..e2789b64 100644 --- a/examples/tfmodel/grid.yaml +++ b/examples/tfmodel/grid.yaml @@ -41,6 +41,11 @@ configure_model: - activity: horseshoe_geno dk_geno: hierarchical_geno transformation: empirical + # (mean, std) of the experimentally measured congression lambda, in + # linear space -- required whenever transformation is 'empirical' + # or 'logit_norm' (transformation and transform_lam always travel + # together, hence the joint variant here). + transform_lam: [0.3572, 0.13] theta_rescale: passthrough # --- Auto: enumerate every registered component for an axis -------------- diff --git a/reports/flake.txt b/reports/flake.txt index 9399ad3f..0a47f677 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1,3878 +1,3 @@ -./build/lib/tfscreen/__init__.py:19:1: W391 blank line at end of file -./build/lib/tfscreen/__version__.py:5:16: W291 trailing whitespace -./build/lib/tfscreen/analysis/__init__.py:13:1: W391 blank line at end of file -./build/lib/tfscreen/analysis/cat_response/__init__.py:2:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/__init__.py:3:55: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: C901 'cat_fit' is too complex (19) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:25:80: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:26:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:42:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:51:51: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:87:49: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:88:40: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:89:51: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:90:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:91:40: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:92:48: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:94:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:108:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:110:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:115:48: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:117:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:124:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:125:47: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:72: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:127:74: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:130:13: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:148:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:150:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:155:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:172:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:174:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:55: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:189:62: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:57: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:190:65: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:191:9: E701 multiple statements on one line (colon) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:192:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:204:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:205:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:206:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:207:36: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:209:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:5: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/cat_response/cat_fit.py:211:32: W292 no newline at end of file -./build/lib/tfscreen/analysis/cat_response/cat_response.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/cat_response.py:23:73: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:26:78: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:44:74: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:45:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:46:26: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:51:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:57:43: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:97:43: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:98:26: W291 trailing whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:130:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/cat_response/cat_response.py:134:34: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:138:42: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/cat_response/cat_response.py:141:56: W292 no newline at end of file -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:21:1: C901 'cat_response' is too complex (11) -./build/lib/tfscreen/analysis/cat_response/scripts/cat_response_cli.py:91:56: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: C901 'mutant_cycle_pivot' is too complex (11) -./build/lib/tfscreen/analysis/extract_epistasis.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/extract_epistasis.py:33:77: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:34:25: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:78:25: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:96:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:113:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:125:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:129:1: C901 'extract_epistasis' is too complex (12) -./build/lib/tfscreen/analysis/extract_epistasis.py:133:47: E252 missing whitespace around parameter equals -./build/lib/tfscreen/analysis/extract_epistasis.py:133:48: E252 missing whitespace around parameter equals -./build/lib/tfscreen/analysis/extract_epistasis.py:159:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:183:36: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:184:27: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:187:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:192:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:201:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:208:55: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:208:60: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:208:65: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/extract_epistasis.py:210:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:216:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:223:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:229:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:231:10: W291 trailing whitespace -./build/lib/tfscreen/analysis/extract_epistasis.py:233:30: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/analysis/stats_test_suite.py:8:31: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:8:42: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:55:75: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:66:52: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:104:33: W291 trailing whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:134:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:143:26: E231 missing whitespace after ',' -./build/lib/tfscreen/analysis/stats_test_suite.py:144:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:148:5: E303 too many blank lines (2) -./build/lib/tfscreen/analysis/stats_test_suite.py:149:22: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:150:15: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:151:26: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:155:21: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:156:24: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:157:24: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:158:32: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:159:21: E231 missing whitespace after ':' -./build/lib/tfscreen/analysis/stats_test_suite.py:161:1: W293 blank line contains whitespace -./build/lib/tfscreen/analysis/stats_test_suite.py:163:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/build_cycles.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/build_cycles.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/build_cycles.py:69:26: W291 trailing whitespace -./build/lib/tfscreen/genetics/build_cycles.py:78:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/build_mut_geno_matrix.py:5:1: C901 'build_mut_geno_matrix' is too complex (17) -./build/lib/tfscreen/genetics/combine_mutation_effects.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/combine_mutation_effects.py:11:50: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:32:73: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:34:71: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:35:21: W291 trailing whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:65:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:73:27: E261 at least two spaces before inline comment -./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/genetics/combine_mutation_effects.py:74:10: E117 over-indented -./build/lib/tfscreen/genetics/combine_mutation_effects.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:89:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/combine_mutation_effects.py:104:25: W292 no newline at end of file -./build/lib/tfscreen/genetics/count_mutation_backgrounds.py:8:1: C901 'count_mutation_backgrounds' is too complex (12) -./build/lib/tfscreen/genetics/data.py:25:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:26:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:27:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:28:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:29:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:30:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:31:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:32:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:33:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:34:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:35:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:36:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:37:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:38:8: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:41:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:42:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:43:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:44:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:45:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:46:23: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/data.py:46:28: W292 no newline at end of file -./build/lib/tfscreen/genetics/expand_genotype_columns.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/expand_genotype_columns.py:16:51: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:47:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:64:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:77:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:79:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/expand_genotype_columns.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:95:41: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:96:31: W291 trailing whitespace -./build/lib/tfscreen/genetics/expand_genotype_columns.py:105:14: W292 no newline at end of file -./build/lib/tfscreen/genetics/genotype_sorting.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/genotype_sorting.py:9:58: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:11:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:16:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:17:74: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:18:81: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:19:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:20:35: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:29:11: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:37:41: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:43:79: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:51:74: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:53:30: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:53:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:57:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:70:39: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:86:37: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:86:46: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:89:55: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:92:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:100:67: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:140:8: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:141:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/genetics/genotype_sorting.py:183:14: E117 over-indented -./build/lib/tfscreen/genetics/genotype_sorting.py:218:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:221:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/genotype_sorting.py:221:32: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:221:50: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/genotype_sorting.py:240:40: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:273:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:274:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:292:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/genotype_sorting.py:298:1: W391 blank line at end of file -./build/lib/tfscreen/genetics/get_single_with_wt.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/get_single_with_wt.py:46:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:55:59: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:58:38: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:59:38: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:60:39: E231 missing whitespace after ':' -./build/lib/tfscreen/genetics/get_single_with_wt.py:63:11: E124 closing bracket does not match visual indentation -./build/lib/tfscreen/genetics/get_single_with_wt.py:65:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:66:52: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:78:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/get_single_with_wt.py:80:49: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/get_single_with_wt.py:87:77: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:90:69: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:93:37: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:94:61: W291 trailing whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:97:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/get_single_with_wt.py:107:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:57:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/library_manager.py:76:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:91:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:94:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:158:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:159:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/genetics/library_manager.py:169:22: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:181:5: C901 'LibraryManager._parse_and_validate' is too complex (12) -./build/lib/tfscreen/genetics/library_manager.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:226:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:235:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:244:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:250:9: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:251:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:254:27: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:254:36: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:258:32: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:258:46: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:51: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:58: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:288:70: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:300:48: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:300:94: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:307:35: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:309:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:310:49: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:311:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:313:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:316:37: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:316:49: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:318:30: E701 multiple statements on one line (colon) -./build/lib/tfscreen/genetics/library_manager.py:321:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:324:18: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/genetics/library_manager.py:373:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:378:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:380:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:386:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:415:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:421:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:427:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:466:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:467:78: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:471:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:476:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:478:25: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:478:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:479:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:482:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:488:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:493:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:526:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:527:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:528:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:555:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:560:73: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:560:82: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:561:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:562:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:562:55: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:562:63: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:563:39: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:563:43: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:564:34: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:564:38: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:566:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:568:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:605:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:611:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:613:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:616:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:617:5: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:648:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:650:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:656:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:657:31: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:661:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:663:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:665:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:695:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:698:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:703:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:708:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:710:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:712:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:713:30: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:721:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:740:28: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:740:41: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:748:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:776:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:781:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:787:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:790:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:791:39: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:794:72: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:795:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:798:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:806:9: E303 too many blank lines (2) -./build/lib/tfscreen/genetics/library_manager.py:807:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:810:76: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:811:15: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:825:1: W293 blank line contains whitespace -./build/lib/tfscreen/genetics/library_manager.py:838:79: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:839:75: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:840:34: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:841:58: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:845:64: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:853:37: W291 trailing whitespace -./build/lib/tfscreen/genetics/library_manager.py:854:27: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:856:40: E231 missing whitespace after ',' -./build/lib/tfscreen/genetics/library_manager.py:859:1: W391 blank line at end of file -./build/lib/tfscreen/mle/__init__.py:16:1: W391 blank line at end of file -./build/lib/tfscreen/mle/curve_models/__init__.py:4:77: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:5:42: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:11:77: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:16:76: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:18:29: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:52:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:53:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:54:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:55:22: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:58:28: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:59:28: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:60:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:61:24: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:62:27: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:65:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:66:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:67:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:68:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:69:30: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:72:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:73:29: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:74:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:75:25: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:76:28: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:79:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:80:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:81:37: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:82:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:83:35: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:86:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:87:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:88:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:89:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:90:33: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:93:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:94:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:95:32: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:96:27: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:97:30: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:100:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:101:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:102:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:103:26: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:104:29: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:104:55: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/__init__.py:107:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:108:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:109:36: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:110:31: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:111:34: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/__init__.py:114:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:115:34: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:116:35: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:117:30: E231 missing whitespace after ':' -./build/lib/tfscreen/mle/curve_models/__init__.py:117:33: E201 whitespace after '[' -./build/lib/tfscreen/mle/curve_models/guesses.py:3:69: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:25:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:25:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:42:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:42:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:45:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:65:23: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:69:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:89:23: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:109:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:110:24: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:114:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:129:35: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:130:24: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:134:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:150:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:155:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:165:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:181:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:196:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:212:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:215:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:217:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:222:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:225:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:243:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:247:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:250:26: E225 missing whitespace around operator -./build/lib/tfscreen/mle/curve_models/guesses.py:252:10: E261 at least two spaces before inline comment -./build/lib/tfscreen/mle/curve_models/guesses.py:257:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:257:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:260:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:271:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:271:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:274:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:274:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:277:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:288:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:288:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:291:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:291:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:294:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:305:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:305:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:308:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/guesses.py:308:21: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:311:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/guesses.py:322:20: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:322:25: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/guesses.py:324:1: W391 blank line at end of file -./build/lib/tfscreen/mle/curve_models/models.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:38:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:39:26: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:40:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:41:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:68:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:70:51: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:75:25: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:88:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:91:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:130:27: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:42: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:130:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:132:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:203:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:206:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:206:41: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:207:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:207:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:210:38: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:211:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:213:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:213:47: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:214:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:251:30: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:251:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:252:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:254:30: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:254:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:255:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/curve_models/models.py:259:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:262:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:301:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:304:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/curve_models/models.py:316:28: W291 trailing whitespace -./build/lib/tfscreen/mle/curve_models/models.py:326:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/curve_models/models.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:26:72: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:29:56: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:34:72: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:36:69: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:41:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:71:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:77:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:123:5: E301 expected 1 blank line, found 0 -./build/lib/tfscreen/mle/fit_manager.py:186:62: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:223:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:225:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:227:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:247:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:250:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:269:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:272:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:291:24: W291 trailing whitespace -./build/lib/tfscreen/mle/fit_manager.py:294:41: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:320:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:337:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:340:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:344:5: E303 too many blank lines (2) -./build/lib/tfscreen/mle/fit_manager.py:344:40: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fit_manager.py:425:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:456:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fit_manager.py:473:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/__init__.py:7:1: W391 blank line at end of file -./build/lib/tfscreen/mle/fitters/_util.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/_util.py:5:14: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:5:24: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:5:31: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/_util.py:6:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/_util.py:19:18: E225 missing whitespace around operator -./build/lib/tfscreen/mle/fitters/_util.py:21:44: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/_util.py:27:34: W292 no newline at end of file -./build/lib/tfscreen/mle/fitters/least_squares.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/least_squares.py:42:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:43:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:44:5: E303 too many blank lines (2) -./build/lib/tfscreen/mle/fitters/least_squares.py:44:76: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:47:38: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/least_squares.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:119:18: F541 f-string is missing placeholders -./build/lib/tfscreen/mle/fitters/least_squares.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:126:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/least_squares.py:128:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/matrix_nls.py:13:76: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:35: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:37: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:43:39: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:56:52: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/fitters/matrix_nls.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_nls.py:67:54: W292 no newline at end of file -./build/lib/tfscreen/mle/fitters/matrix_wls.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/fitters/matrix_wls.py:27:81: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:30:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:42:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:52:40: W291 trailing whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:54:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/fitters/matrix_wls.py:55:52: W292 no newline at end of file -./build/lib/tfscreen/mle/predict_with_error.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/mle/predict_with_error.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/predict_with_error.py:42:36: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:54:1: W293 blank line contains whitespace -./build/lib/tfscreen/mle/predict_with_error.py:57:43: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:61:45: E231 missing whitespace after ',' -./build/lib/tfscreen/mle/predict_with_error.py:74:32: W292 no newline at end of file -./build/lib/tfscreen/plot/__init__.py:36:63: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:13:1: C901 'cat_fits' is too complex (11) -./build/lib/tfscreen/plot/cat_fits.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/cat_fits.py:13:15: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:13:17: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:99:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:99:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:113:80: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:119:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:120:74: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:121:14: W291 trailing whitespace -./build/lib/tfscreen/plot/cat_fits.py:123:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:123:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:128:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:128:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:131:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:137:53: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:147:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:147:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:163:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:163:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/cat_fits.py:171:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:172:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:173:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:174:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:175:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:176:12: E701 multiple statements on one line (colon) -./build/lib/tfscreen/plot/cat_fits.py:187:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/cat_fits.py:187:5: W292 no newline at end of file -./build/lib/tfscreen/plot/corner.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/corner.py:11:76: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:12:23: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:17:66: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:19:80: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:38:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/corner.py:39:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:47:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:63: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:51:73: W291 trailing whitespace -./build/lib/tfscreen/plot/corner.py:54:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/corner.py:55:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/corner.py:64:15: W292 no newline at end of file -./build/lib/tfscreen/plot/default_styles.py:17:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:17:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:17:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:18:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:19:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:27:8: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:28:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:29:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:33:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:34:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:38:8: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:39:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:40:16: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:44:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:45:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:46:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:47:14: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:54:9: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:55:12: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:56:13: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:56:16: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/default_styles.py:58:41: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:59:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:59:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:59:48: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/default_styles.py:62:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:63:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:63:32: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/default_styles.py:64:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:65:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:66:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:70:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:71:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:72:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:73:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:74:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:79:18: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:79:21: W291 trailing whitespace -./build/lib/tfscreen/plot/default_styles.py:80:17: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:81:22: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:82:20: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:83:33: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/default_styles.py:84:2: W292 no newline at end of file -./build/lib/tfscreen/plot/err_vs_mag.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/err_vs_mag.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/err_vs_mag.py:20:34: W291 trailing whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:33:55: W291 trailing whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:43:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:44:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:49:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:49:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:55:5: E303 too many blank lines (3) -./build/lib/tfscreen/plot/err_vs_mag.py:57:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:62:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:37: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:62:50: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:63:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:64:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_vs_mag.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_vs_mag.py:70:14: W292 no newline at end of file -./build/lib/tfscreen/plot/err_zscore.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/err_zscore.py:21:77: W291 trailing whitespace -./build/lib/tfscreen/plot/err_zscore.py:22:37: W291 trailing whitespace -./build/lib/tfscreen/plot/err_zscore.py:52:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:52:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:53:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:54:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:54:51: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:57:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:58:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:72:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:73:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:73:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:73:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:74:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:78:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/err_zscore.py:79:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/err_zscore.py:79:41: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:16:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/est_v_real_summary.py:24:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/est_v_real_summary.py:54:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/est_v_real_summary.py:57:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:70:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:72:5: E303 too many blank lines (2) -./build/lib/tfscreen/plot/est_v_real_summary.py:72:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:72:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:72:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/est_v_real_summary.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:102:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/est_v_real_summary.py:106:1: W391 blank line at end of file -./build/lib/tfscreen/plot/geno_trajectory.py:29:1: C901 'plot_geno_trajectory' is too complex (14) -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:15:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:17:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:19:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:23:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:26:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:32:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:33:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:42:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_res_heatmap.py:44:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:17:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:18:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:20:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:24:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:26:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:27:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:39:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/aa_v_titrant_heatmap.py:41:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:6:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:15:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:16:53: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:19:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:20:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:21:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:23:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:25:17: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:33:25: E211 whitespace before '(' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:73: E261 at least two spaces before inline comment -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:39:74: E262 inline comment should start with '# ' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:50:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/epistasis_heatmap.py:52:19: W292 no newline at end of file -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:6:18: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: C901 '_build_heatmap_collection' is too complex (11) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:88:38: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:90:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:93:32: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:107:55: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:110:55: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:125:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:126:48: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:129:68: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:142:33: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:143:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:13: E221 multiple spaces before operator -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:149:28: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:151:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:154:33: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:155:16: E221 multiple spaces before operator -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:156:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:34: E203 whitespace before ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:157:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:34: E203 whitespace before ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:158:41: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:159:41: E202 whitespace before ']' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:160:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:162:66: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: C901 '_build_color_mapper' is too complex (13) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:172:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:217:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:39: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:241:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:243:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:276:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:280:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:281:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:338:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:373:40: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:375:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:382:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:385:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:388:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:443:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:448:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:456:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:457:1: C901 'heatmap' is too complex (13) -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:509:76: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:528:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:531:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:561:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:569:53: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:570:5: F841 local variable 'e' is assigned to but never used -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:580:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:589:75: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:590:39: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:37: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:592:57: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:593:33: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:596:29: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:612:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:615:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:620:20: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:621:69: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:622:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:625:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:629:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:636:35: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:637:34: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:638:32: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:639:37: E231 missing whitespace after ':' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:643:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:644:57: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:645:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:647:72: W291 trailing whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:34: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:661:56: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:662:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:666:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:671:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:672:43: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:679:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/heatmap/heatmap_core.py:680:19: W292 no newline at end of file -./build/lib/tfscreen/plot/helper.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:28:78: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:29:40: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:31:55: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:51:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:60:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:62:71: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:64:61: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:69:47: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:70:26: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:74:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/helper.py:84:76: W291 trailing whitespace -./build/lib/tfscreen/plot/helper.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:93:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/helper.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/helper.py:100:17: W292 no newline at end of file -./build/lib/tfscreen/plot/hill_fit.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/plot_theta_fits.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/plot_theta_fits.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:84:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:84:50: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:86:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:88:73: E225 missing whitespace around operator -./build/lib/tfscreen/plot/plot_theta_fits.py:89:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:92:52: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:95:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:98:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:98:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:99:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:102:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:102:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:103:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:105:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:108:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:108:46: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:115:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:121:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:124:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:130:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:133:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:139:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:141:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/plot_theta_fits.py:144:22: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/plot_theta_fits.py:153:1: W391 blank line at end of file -./build/lib/tfscreen/plot/uncertainty_calibration.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/uncertainty_calibration.py:21:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/uncertainty_calibration.py:24:63: W291 trailing whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:65:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:71:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:71:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:84:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:84:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:15: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:18: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:87:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:89:21: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:19: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:27: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:30: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:40: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:45: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:90:58: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:25: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:38: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:41: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:46: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:91:59: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/plot/uncertainty_calibration.py:93:24: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:94:18: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/uncertainty_calibration.py:97:14: W292 no newline at end of file -./build/lib/tfscreen/plot/xy_corr.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/plot/xy_corr.py:24:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/plot/xy_corr.py:63:47: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:64:35: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:69:31: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:69:42: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:88:17: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/plot/xy_corr.py:89:17: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/plot/xy_corr.py:91:20: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:28: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:36: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:44: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:49: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:62: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:91:67: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:93:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:94:23: E231 missing whitespace after ',' -./build/lib/tfscreen/plot/xy_corr.py:97:14: W292 no newline at end of file -./build/lib/tfscreen/process_raw/_counts_io.py:110:16: F541 f-string is missing placeholders -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:30:69: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:77:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:110:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:114:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:147:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:191:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:193:41: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:194:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:197:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:200:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:203:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:212:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:213:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:214:64: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:229:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:49: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:237:66: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:238:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/counts_to_lncfu.py:241:52: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:21:14: E401 multiple imports on one line -./build/lib/tfscreen/process_raw/fastq_to_counts.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/fastq_to_counts.py:26:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:69:44: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:104:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:113:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:136:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:137:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:138:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:139:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:144:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:149:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:156:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:188:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:194:15: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:204:42: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/fastq_to_counts.py:207:42: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/fastq_to_counts.py:208:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:216:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:219:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:220:40: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:223:54: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:226:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:233:66: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:247:18: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:249:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:260:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:262:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:263:45: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:266:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:267:5: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:290:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:296:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:297:46: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:302:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:303:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:304:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:305:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:306:28: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:318:50: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:319:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:322:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:324:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:326:58: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:32: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:328:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:332:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:334:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:32: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:335:55: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:336:57: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:338:35: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:347:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:348:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:9: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:349:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:5: E303 too many blank lines (2) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:30: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:357:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:361:15: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:364:79: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:365:79: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:367:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:368:21: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:371:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:377:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:380:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:381:20: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:403:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:405:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:406:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:410:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:411:43: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:435:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:440:65: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:451:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:458:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:459:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:460:78: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:464:40: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:34: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:467:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:471:77: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:476:34: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:481:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:482:45: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:487:75: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:35: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:492:44: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:496:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:497:40: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:506:68: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:511:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:512:43: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:516:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:526:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:529:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:34: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:44: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:537:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:546:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:553:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:554:47: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:558:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:565:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:567:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:30: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:568:39: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:571:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:574:22: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:576:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:579:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:580:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:581:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:584:78: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:586:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:594:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:595:66: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:596:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:600:49: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:602:67: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:603:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:604:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:605:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:610:27: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:612:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:613:26: E701 multiple statements on one line (colon) -./build/lib/tfscreen/process_raw/fastq_to_counts.py:614:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:618:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:621:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:623:62: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:624:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:625:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:652:50: W291 trailing whitespace -./build/lib/tfscreen/process_raw/fastq_to_counts.py:653:50: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/fastq_to_counts.py:664:1: W391 blank line at end of file -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:28: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:15:29: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:26: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:16:27: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:21: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:17:22: E252 missing whitespace around parameter equals -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:18:5: E125 continuation line with same indent as next logical line -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:75:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_counts_cli.py:79:44: W292 no newline at end of file -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:22:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:25:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:26:39: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:46:87: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:47:87: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:56:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:64:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:66:71: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:82:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:83:70: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:85:51: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:88:76: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:96:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:105:74: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:142:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:165:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:168:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:173:45: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:181:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:182:43: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:25: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:202:40: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:207:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:237:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:257:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:258:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:259:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:260:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:286:10: E117 over-indented -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:291:27: E231 missing whitespace after ':' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:292:25: E231 missing whitespace after ':' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:296:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:297:69: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:298:73: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:299:72: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:300:54: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:314:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:37: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:319:54: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:337:67: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:348:71: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:354:71: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:357:80: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:361:70: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:374:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:389:29: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:396:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:397:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:398:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:399:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:400:23: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:401:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:403:57: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:406:59: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:407:1: W293 blank line contains whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:410:38: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:411:31: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:413:37: W291 trailing whitespace -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:417:39: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:418:33: E231 missing whitespace after ',' -./build/lib/tfscreen/process_raw/scripts/process_fastq_cli.py:420:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:77:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:78:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:79:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/process_raw/scripts/process_presplit_cli.py:86:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/__init__.py:29:2: W292 no newline at end of file -./build/lib/tfscreen/simulate/binding_params.py:225:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) -./build/lib/tfscreen/simulate/binding_params.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:290:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:292:13: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:293:13: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:296:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:298:12: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:299:12: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:318:21: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:321:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:321:43: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:323:23: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:324:23: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:330:32: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:332:28: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:333:28: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:336:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:350:14: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:350:31: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:352:10: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:352:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:353:10: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:353:27: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:383:22: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:385:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:386:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:389:18: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/binding_params.py:391:15: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/build_sample_dataframes.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/build_sample_dataframes.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file -./build/lib/tfscreen/simulate/library_prediction.py:28:1: C901 'library_prediction' is too complex (14) -./build/lib/tfscreen/simulate/library_prediction.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used -./build/lib/tfscreen/simulate/run_simulation.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/run_simulation.py:17:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:18:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:21:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:22:23: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:22:62: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:24:47: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:25:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:34:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:38:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:50:38: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:50:39: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:51:39: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:51:40: E252 missing whitespace around parameter equals -./build/lib/tfscreen/simulate/run_simulation.py:53:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:56:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:71:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:72:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/run_simulation.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:82:46: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:83:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:88:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:88:62: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:91:26: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:92:29: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:93:33: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:94:25: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:95:25: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/run_simulation.py:96:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:100:50: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/run_simulation.py:101:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:106:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/run_simulation.py:107:1: W391 blank line at end of file -./build/lib/tfscreen/simulate/sample_theta.py:170:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:171:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:172:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:173:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:174:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:175:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:176:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:120:15: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:121:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:123:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:127:20: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:128:22: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:129:21: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:148:48: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:149:14: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:150:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:155:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:168:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:171:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:172:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:173:16: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:176:17: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:178:25: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:180:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:194:19: E221 multiple spaces before operator -./build/lib/tfscreen/simulate/scripts/simulate_cli.py:211:1: C901 'run_simulation_from_config' is too complex (12) -./build/lib/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:45:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:46:36: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:71:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:72:1: C901 '_check_dict_number' is too complex (13) -./build/lib/tfscreen/simulate/selection_experiment.py:72:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:115:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:158:1: C901 '_check_cf' is too complex (25) -./build/lib/tfscreen/simulate/selection_experiment.py:180:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:199:57: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:223:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:224:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:290:1: C901 '_check_lib_spec' is too complex (12) -./build/lib/tfscreen/simulate/selection_experiment.py:290:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:342:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:347:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:369:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:422:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:438:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:446:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:446:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:456:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:466:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:509:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:513:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:514:75: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:524:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:527:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:573:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:584:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:585:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:588:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:592:55: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:598:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:603:30: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:604:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:608:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:678:50: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:678:52: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:680:75: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:682:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:683:46: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:684:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:685:67: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:735:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:752:79: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:758:29: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:800:43: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:806:74: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:807:18: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:813:79: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:815:33: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:820:80: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:825:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:831:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:842:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:885:73: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:890:76: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:907:25: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1015:26: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:44: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:52: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1015:60: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1023:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1024:32: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1032:42: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1041:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1042:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1044:63: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1052:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1059:28: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1061:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1062:24: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1069:79: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1074:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1075:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1077:36: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1079:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1089:128: E501 line too long (145 > 127 characters) -./build/lib/tfscreen/simulate/selection_experiment.py:1090:128: E501 line too long (145 > 127 characters) -./build/lib/tfscreen/simulate/selection_experiment.py:1094:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1095:72: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1099:34: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1106:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1108:20: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1108:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1109:20: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1111:32: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1112:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1124:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1132:41: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1139:49: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1141:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1146:36: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:37: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:45: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1147:61: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1152:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/simulate/selection_experiment.py:1187:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1208:57: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1209:53: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1212:28: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1212:39: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1217:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1223:78: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1226:19: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1234:33: E261 at least two spaces before inline comment -./build/lib/tfscreen/simulate/selection_experiment.py:1235:49: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1236:37: E231 missing whitespace after ':' -./build/lib/tfscreen/simulate/selection_experiment.py:1238:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1239:76: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1241:19: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1243:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1251:77: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1252:43: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1256:41: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/selection_experiment.py:1259:49: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1283:71: W291 trailing whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1291:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1292:76: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1297:11: F541 f-string is missing placeholders -./build/lib/tfscreen/simulate/selection_experiment.py:1302:38: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1319:6: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/simulate/selection_experiment.py:1326:51: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1327:48: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1328:1: W293 blank line contains whitespace -./build/lib/tfscreen/simulate/selection_experiment.py:1329:33: E231 missing whitespace after ',' -./build/lib/tfscreen/simulate/selection_experiment.py:1332:1: W391 blank line at end of file -./build/lib/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) -./build/lib/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (18) -./build/lib/tfscreen/simulate/thermo_to_growth.py:626:41: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/__init__.py:2:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:3:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:18:65: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:22:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:23:19: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:26:66: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:30:72: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:33:26: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:37:37: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:40:9: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:41:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:43:56: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/__init__.py:46:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:33:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:34:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:35:34: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:119:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:120:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:121:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/batch_sizing.py:122:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:474:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/error_calibration.py:511:1: C901 'summarize_sbc' is too complex (16) -./build/lib/tfscreen/tfmodel/analysis/extraction.py:81:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/extraction.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/extraction.py:103:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:196:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:274:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/extraction.py:275:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:276:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:331:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:383:1: C901 'extract_growth_predictions' is too complex (11) -./build/lib/tfscreen/tfmodel/analysis/extraction.py:482:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/extraction.py:501:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:503:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/extraction.py:504:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:41:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:45:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:99:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/predict_unmeasured.py:120:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/analysis/prediction.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:165:1: C901 'copy_orchestrator' is too complex (11) -./build/lib/tfscreen/tfmodel/analysis/prediction.py:292:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:399:1: C901 'predict' is too complex (29) -./build/lib/tfscreen/tfmodel/analysis/prediction.py:542:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:545:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:550:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prediction.py:570:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/prediction.py:572:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/analysis/prediction.py:604:58: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/analysis/prediction.py:607:26: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/tfmodel/analysis/prediction.py:607:26: E117 over-indented -./build/lib/tfscreen/tfmodel/analysis/prediction.py:610:25: E122 continuation line missing indentation or outdented -./build/lib/tfscreen/tfmodel/analysis/prediction.py:616:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/analysis/prior_predictive.py:104:33: E203 whitespace before ':' -./build/lib/tfscreen/tfmodel/configuration_io.py:19:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (32) -./build/lib/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:198:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:201:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:203:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:204:40: E713 test for membership should be 'not in' -./build/lib/tfscreen/tfmodel/configuration_io.py:210:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:211:31: E713 test for membership should be 'not in' -./build/lib/tfscreen/tfmodel/configuration_io.py:217:18: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:233:33: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/configuration_io.py:245:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:259:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:259:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/configuration_io.py:261:1: C901 'read_configuration' is too complex (20) -./build/lib/tfscreen/tfmodel/configuration_io.py:261:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/configuration_io.py:298:128: E501 line too long (139 > 127 characters) -./build/lib/tfscreen/tfmodel/configuration_io.py:309:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:310:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:311:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:312:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:313:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/configuration_io.py:319:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:331:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:346:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/configuration_io.py:351:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/data_class.py:42:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:116:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/data_class.py:133:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:135:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/data_class.py:275:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/data_class.py:282:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/data_class.py:283:5: E266 too many leading '#' for block comment -./build/lib/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:16:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:17:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:48:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:51:45: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:54:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:59:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:60:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:71:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:74:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:78:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/fixed.py:108:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:46:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:47:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:100:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:104:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:108:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:118:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:121:57: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:125:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:126:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:164:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:166:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:170:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:178:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:182:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:192:57: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:210:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:246:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:250:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_geno.py:269:7: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:54:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/hierarchical_mut.py:112:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:23:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:24:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:63:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:64:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:65:38: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:66:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:71:45: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:76:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:88:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:96:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:99:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:104:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:105:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:117:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:120:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:121:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:37: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:123:64: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:39: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:125:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:126:39: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:127:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:129:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:131:67: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:134:38: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:135:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:137:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:146:45: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:151:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:163:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:171:54: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:175:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:185:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:219:64: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:220:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:224:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_geno.py:243:7: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:72:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/activity/horseshoe_mut.py:141:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:19:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:33:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:42:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:45:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:48:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:52:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:53:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:63:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:66:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:70:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:82:21: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:84:47: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:93:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/fixed.py:98:14: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:38:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:39:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:42:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:43:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:44:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:49:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:96:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:100:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:104:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:105:106: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:108:33: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:111:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:113:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:116:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:120:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:121:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:169:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:170:80: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:83: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:171:97: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:175:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:177:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:178:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:179:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:183:83: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:189:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:197:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:50: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:199:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:203:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:221:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:267:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:269:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:277:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:284:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:287:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:292:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:307:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:309:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:311:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:312:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:313:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:314:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:316:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:317:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:319:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:320:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:323:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:334:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:335:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:336:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:343:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:344:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:345:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:348:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:351:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:352:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:355:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:358:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:362:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:92:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:237:40: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:260:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:274:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:280:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:282:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:283:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:284:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:285:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:286:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:287:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:288:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:289:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:290:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/linear.py:313:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:135:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:23:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:52:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:53:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:73:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/growth_transition/instant.py:79:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:40:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:41:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:42:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:95:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:101:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:213:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:230:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:295:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:333:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:370:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:420:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:421:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:422:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:423:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:424:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:425:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:426:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:427:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:428:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:433:1: C901 '_empirical_group_estimates' is too complex (15) -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:462:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:463:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:465:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:490:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:493:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:510:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:519:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:529:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:532:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:535:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:549:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:550:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:553:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:554:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:566:46: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:580:16: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:624:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:629:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:630:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:631:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:646:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:650:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:654:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:655:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:657:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:661:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:671:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:678:15: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical.py:716:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:134:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:239:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:275:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:317:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:318:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:319:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:320:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:321:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:322:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:323:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:324:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:325:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:326:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:331:15: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:348:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:349:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:356:16: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:393:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:398:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:399:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:400:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:411:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:415:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:417:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:418:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:420:21: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:438:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/ln_cfu0/hierarchical_factored.py:450:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:10:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:27:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:28:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:67:6: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:68:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:82:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:88:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:89:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:93:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:94:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:95:65: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:96:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:97:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:102:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:107:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:118:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:120:41: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:129:68: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:133:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:136:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:158:26: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:175:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:185:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/beta.py:194:48: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:18:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:19:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:46:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:47:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:95:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/noise/zero.py:104:48: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:126:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:225:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:282:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:285:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:415:41: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:454:27: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:507:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:545:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:549:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:550:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:552:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:553:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:567:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/categorical_geno.py:573:18: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:160:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:166:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:167:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:170:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:176:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:178:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:179:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:182:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:186:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:259:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:261:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:262:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:267:74: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:269:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:270:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:271:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:274:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:312:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:321:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:326:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:330:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:335:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:339:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:344:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:349:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:353:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:357:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:361:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:369:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:372:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:375:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:378:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:384:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:388:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:390:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:397:74: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:399:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:400:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:401:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:403:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:405:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:464:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:466:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:469:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:482:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:484:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:485:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:490:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:492:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:493:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:498:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:500:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:501:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:506:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:508:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:509:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:514:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:516:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:517:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:520:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:521:70: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:522:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:526:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:529:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:530:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:531:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:532:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:533:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:14: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:534:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:565:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:568:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:571:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:572:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:598:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:599:50: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:600:46: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:602:50: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:603:52: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:604:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:606:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:607:51: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:608:47: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:610:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:611:51: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:612:47: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:632:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:666:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:674:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:675:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:676:45: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:678:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:680:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:683:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:685:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:686:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:771:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:773:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:774:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:777:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:779:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:780:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:792:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:820:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:882:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_geno.py:885:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:193:76: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:300:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:301:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:302:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:340:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:342:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:343:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:354:38: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:356:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:357:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:367:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:370:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:373:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:375:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:376:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:608:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:610:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:611:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:44: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:617:73: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:619:71: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:620:71: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:700:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:702:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:705:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:712:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:714:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:715:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:748:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:750:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:751:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:755:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:756:70: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:757:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:761:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:764:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:765:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:19: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:766:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:767:21: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:768:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:14: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:769:16: E251 unexpected spaces around keyword / parameter equals -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:846:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1013:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1015:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1016:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1017:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1018:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1019:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1020:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1023:43: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1025:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1026:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1029:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1031:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1032:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1033:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1035:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1036:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1040:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1042:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1043:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1086:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1141:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1154:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/hill_mut.py:1157:14: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:180:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:188:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:189:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:190:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:377:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:385:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:386:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:387:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:392:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:394:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:396:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:399:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:401:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:403:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:409:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:411:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:414:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:415:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:416:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:417:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:422:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:424:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:426:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:429:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:430:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:431:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:432:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:444:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:446:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:447:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:473:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:474:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:490:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:496:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:497:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:498:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:499:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:501:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:505:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:506:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:507:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:508:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:510:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:514:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:515:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:516:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:517:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:519:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:523:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:524:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:525:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:526:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:529:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:530:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:533:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:534:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:535:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:536:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:539:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:540:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:600:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:603:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:607:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:610:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:614:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:633:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:634:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:635:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:643:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:644:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:645:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:646:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:647:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:648:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:649:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:650:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:651:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:652:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:653:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:654:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:655:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:656:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:657:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:660:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:661:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:662:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:663:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:664:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:665:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:666:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:667:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:668:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:669:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:670:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:671:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:797:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:798:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:799:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:801:12: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PK.py:880:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:81:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:82:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:83:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:84:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:85:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:222:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:223:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:228:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:229:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:233:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:234:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:260:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:270:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:332:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:337:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:338:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:339:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:342:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:343:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:347:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:349:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:351:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:353:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:355:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:364:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:402:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:406:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:408:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:409:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:410:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:411:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:412:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:414:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:418:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:431:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:434:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:435:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:471:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:473:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:475:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:477:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:479:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:481:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:482:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:483:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:484:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:485:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:486:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:487:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:496:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:497:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:498:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:499:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:500:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:501:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:504:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:505:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:516:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:518:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:556:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PddG.py:698:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:102:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:103:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:104:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:105:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:259:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:264:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:267:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:270:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:271:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:305:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:320:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:363:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:383:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:388:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:389:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:392:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:395:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:396:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:400:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:402:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:404:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:406:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:408:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:423:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:461:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:465:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:467:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:468:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:469:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:470:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:471:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:473:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:477:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:490:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:493:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:494:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:515:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:536:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:539:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:542:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:546:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:550:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:563:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:565:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:566:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:567:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:568:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:577:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:578:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:579:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:580:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:582:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:585:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:586:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:717:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:757:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/PnnC.py:781:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:181:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:269:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:299:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U0_a/thermo.py:367:17: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:175:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:183:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:184:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:185:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:240:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:291:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:384:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:392:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:393:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:394:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:399:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:401:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:403:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:405:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:406:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:408:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:410:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:412:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:414:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:415:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:420:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:422:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:425:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:426:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:427:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:428:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:433:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:435:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:437:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:439:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:440:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:442:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:443:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:444:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:445:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:457:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:459:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:460:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:481:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:485:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:488:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:489:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:497:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:506:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:512:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:513:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:514:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:515:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:517:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:521:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:522:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:523:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:524:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:526:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:530:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:531:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:532:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:533:128: E501 line too long (138 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:535:128: E501 line too long (128 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:539:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:540:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:541:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:542:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:545:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:546:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:549:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:550:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:551:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:552:128: E501 line too long (142 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:555:128: E501 line too long (132 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:556:128: E501 line too long (129 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:618:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:621:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:625:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:628:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:632:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:635:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:636:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:653:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:655:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:656:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:657:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:665:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:666:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:667:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:668:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:669:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:670:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:671:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:672:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:673:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:674:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:675:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:676:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:677:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:678:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:679:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:680:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:681:35: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:682:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:685:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:686:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:687:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:688:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:689:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:690:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:691:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:692:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:693:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:694:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:695:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:696:41: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:770:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:778:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:786:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:806:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:826:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:827:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:828:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:830:12: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PK.py:910:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:98:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:99:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:100:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:242:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:243:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:248:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:249:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:253:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:254:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:287:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:297:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:359:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:365:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:368:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:369:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:371:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:374:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:376:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:378:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:380:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:382:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:386:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:395:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:437:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:441:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:443:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:444:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:445:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:446:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:447:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:449:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:453:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:466:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:469:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:470:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:507:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:509:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:511:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:513:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:515:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:519:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:520:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:521:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:522:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:523:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:524:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:525:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:526:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:527:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:536:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:537:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:538:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:539:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:540:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:541:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:542:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:545:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:546:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:557:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:559:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:597:25: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:690:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:707:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:708:38: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:727:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PddG.py:746:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:100:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:101:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:102:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:103:38: E202 whitespace before ']' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:104:6: E201 whitespace after '[' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:258:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:263:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:266:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:269:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:270:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:309:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:324:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:368:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:388:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:393:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:394:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:397:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:400:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:401:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:405:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:407:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:409:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:411:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:413:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:417:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:432:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:474:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:478:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:480:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:481:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:482:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:483:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:484:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:486:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:490:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:503:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:506:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:507:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:529:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:544:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:546:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:548:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:550:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:552:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:556:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:557:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:564:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:566:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:567:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:568:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:569:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:578:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:579:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:580:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:582:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:583:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:584:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:587:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:588:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:666:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:701:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:722:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:762:25: E127 continuation line over-indented for visual indent -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/PnnC.py:786:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:104:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:155:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:230:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:246:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:276:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:336:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:353:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C12_K5_U1_a/thermo.py:360:15: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:236:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:237:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:238:31: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:276:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:288:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:299:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:304:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:535:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:543:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:565:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:568:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:571:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:572:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:574:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:575:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:577:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:578:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:579:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:581:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:582:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:583:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:591:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:592:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:593:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:594:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:595:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:596:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:597:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:598:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:599:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:602:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:603:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:604:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:605:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:606:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:607:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:608:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:609:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:679:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:684:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:696:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:699:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:704:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PK.py:808:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:164:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:168:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:173:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:200:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:201:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:206:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:207:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:239:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:272:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:290:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:296:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:301:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:304:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:306:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:308:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:317:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:353:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:357:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:359:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:360:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:361:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:362:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:363:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:365:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:382:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:385:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:386:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:403:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:416:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:418:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:420:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:421:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:422:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:423:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:424:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:426:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:427:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:436:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:437:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:438:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:439:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:442:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:443:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:514:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:518:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:530:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:533:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:537:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:555:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:557:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PddG.py:613:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:182:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:190:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:222:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:231:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:241:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:250:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:251:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:252:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:260:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:269:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:286:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:292:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:295:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:302:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:304:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:306:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:321:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:330:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:332:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:333:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:334:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:335:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:336:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:337:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:358:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:363:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:380:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:384:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:395:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:396:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:397:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:401:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:405:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:418:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:420:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:422:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:423:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:428:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:430:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:431:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:432:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:433:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:438:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:439:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:440:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:442:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:443:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:444:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:445:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:448:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:449:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:450:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:451:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:521:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:525:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:537:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:540:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:544:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:562:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/PnnC.py:622:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:133:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:137:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:142:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:143:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:165:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:234:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:237:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:238:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:243:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:249:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:250:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:275:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:342:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:356:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U0_a/thermo.py:361:15: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:160:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:198:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:199:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:212:34: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:221:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:222:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:227:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:264:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:266:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:268:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:269:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:271:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:273:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:275:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:276:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:278:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:280:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:281:23: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:284:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:286:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:288:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:290:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:291:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:301:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:303:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:304:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:306:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:307:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:308:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:309:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:310:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:311:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:312:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:24: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:313:128: E501 line too long (135 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:314:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:315:128: E501 line too long (140 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:316:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:317:128: E501 line too long (140 > 127 characters) -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:324:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:327:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:330:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:336:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:344:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:360:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:361:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:369:53: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:385:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:387:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:389:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:390:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:392:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:393:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:394:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:395:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:396:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:397:37: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:398:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:399:36: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:400:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:401:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:402:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:410:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:411:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:412:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:413:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:414:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:415:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:416:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:417:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:420:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:421:33: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:424:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:425:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:426:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:427:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:428:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:429:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:430:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:431:39: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:479:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:480:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:484:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:485:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:489:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:490:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:495:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:498:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:502:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:503:16: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PK.py:608:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:108:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:111:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:115:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:135:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:136:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:141:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:142:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:171:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:205:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:223:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:229:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:234:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:236:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:238:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:240:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:241:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:242:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:247:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:264:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:276:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:277:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:281:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:283:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:284:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:285:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:286:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:287:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:289:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:293:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:306:24: E741 ambiguous variable name 'l' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:309:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:310:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:327:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:339:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:341:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:343:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:344:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:345:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:346:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:347:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:348:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:349:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:351:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:352:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:361:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:362:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:363:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:364:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:365:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:368:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:369:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:423:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:424:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:428:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:432:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:434:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:439:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:442:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:446:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:465:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PddG.py:519:1: E402 module level import not at top of file -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:124:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:132:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:165:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:174:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:176:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:195:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:196:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:197:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:205:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:214:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:231:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:237:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:240:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:246:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:248:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:250:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:251:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:252:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:262:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:272:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:274:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:278:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:291:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:294:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:296:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:297:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:298:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:299:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:300:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:19: E225 missing whitespace around operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:301:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:304:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:314:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:318:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:319:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:330:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:331:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:336:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:340:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:352:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:354:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:356:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:357:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:358:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:359:31: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:362:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:363:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:364:30: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:365:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:366:22: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:375:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:376:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:377:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:378:27: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:379:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:382:29: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:383:28: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:384:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:385:32: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:437:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:438:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:442:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:446:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:449:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:454:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:457:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:461:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:480:13: E221 multiple spaces before operator -./build/lib/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 -./build/lib/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 -./build/lib/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 -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/PnnC.py:533:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:115:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:116:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:121:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:126:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:127:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:144:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:211:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:212:8: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:215:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:216:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:221:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:227:9: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:228:6: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:249:40: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:309:17: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:323:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:324:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:328:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/O2_C4_K3_U1_a/thermo.py:329:15: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:99:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:110:40: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:111:48: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/features.py:112:49: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:76:7: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:91:16: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/horseshoe.py:102:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:86:14: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:115:21: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:171:13: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/io.py:181:18: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/theta/thermo/nn.py:62:10: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:11:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:15:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:33:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:36:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:48:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:131:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:156:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:162:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:167:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:175:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:181:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:185:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:189:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:192:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:194:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:197:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:204:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:207:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:211:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:232:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:241:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:249:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:270:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:279:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:305:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:307:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:331:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:352:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:364:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:368:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:391:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:414:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:441:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:446:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:450:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:453:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:455:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:457:21: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:480:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:482:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:483:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:484:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:486:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:490:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/_congression.py:493:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:46:36: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:14:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:15:35: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:21:25: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:23:21: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:24:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:32:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:45:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:51:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/components/transformation/single.py:57:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/model.py:12:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/model.py:44:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/model.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/model.py:105:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:106:24: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:106:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:161:36: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:162:24: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:162:44: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/model.py:258:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/model.py:259:19: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/generative/model.py:323:28: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:324:28: F541 f-string is missing placeholders -./build/lib/tfscreen/tfmodel/generative/model.py:330:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:9:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:42:79: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:43:83: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:44:82: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:51:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:57:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/binding.py:67:11: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:8:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:68: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:60:89: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:73:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:87:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:95:5: F841 local variable 'nu' is assigned to but never used -./build/lib/tfscreen/tfmodel/generative/observe/growth.py:97:11: W292 no newline at end of file -./build/lib/tfscreen/tfmodel/generative/registry.py:58:29: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/registry.py:59:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/generative/registry.py:62:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:63:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:64:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:65:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:67:14: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:68:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:69:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:71:14: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:72:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:73:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:74:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:76:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:77:16: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:78:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:79:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:80:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:81:24: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:83:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:88:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:92:12: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:93:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:94:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:95:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:96:19: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:97:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:98:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:99:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:100:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:101:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:102:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:103:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:104:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:105:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:106:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:107:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:108:37: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:110:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:111:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:112:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:113:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:115:26: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:116:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:117:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:119:19: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:120:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:121:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:123:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:124:15: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:125:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:127:24: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:128:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:129:17: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:130:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:131:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:132:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:133:18: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:135:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/generative/registry.py:136:21: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: C901 'load_posteriors' is too complex (12) -./build/lib/tfscreen/tfmodel/inference/posteriors.py:72:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/inference/posteriors.py:117:17: F841 local variable 'e' is assigned to but never used -./build/lib/tfscreen/tfmodel/inference/run_inference.py:21:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:28:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:29:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:30:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:31:1: E402 module level import not at top of file -./build/lib/tfscreen/tfmodel/inference/run_inference.py:32:1: E302 expected 2 blank lines, found 0 -./build/lib/tfscreen/tfmodel/inference/run_inference.py:35:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:36:69: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:22: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:42:28: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:57:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:63:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:65:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:79:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:87:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:93:20: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:98:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:105:34: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:107:87: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:123:58: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:124:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:129:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:132:5: C901 'RunInference.run_optimization' is too complex (18) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:223:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:224:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:238:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:241:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:242:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:251:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:253:53: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:261:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:288:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:299:48: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:304:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:308:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:318:128: E501 line too long (177 > 127 characters) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:324:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:325:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:332:60: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:346:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:347:50: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:348:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:370:5: C901 'RunInference._get_genotype_dim_map' is too complex (14) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:396:26: E261 at least two spaces before inline comment -./build/lib/tfscreen/tfmodel/inference/run_inference.py:703:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:705:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:738:31: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:750:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:751:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:31: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:758:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:772:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:773:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:774:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:775:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:776:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:783:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:784:31: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:866:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:880:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:883:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:884:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:893:36: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:900:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:900:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:902:61: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:951:5: E303 too many blank lines (4) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:992:26: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:992:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:995:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1007:41: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1009:32: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1009:42: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1060:5: C901 'RunInference.get_map_posteriors' is too complex (13) -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1298:50: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1339:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1342:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1347:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1355:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1359:30: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1366:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/inference/run_inference.py:1372:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:39:1: E303 too many blank lines (3) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:76:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:25: E222 multiple spaces after operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:80:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:81:42: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:85:65: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:85:88: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:30: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:105:63: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:106:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:120:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:124:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:125:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:127:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/model_orchestrator.py:210:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:213:73: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:215:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:216:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:217:61: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:218:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:219:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:221:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:222:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:223:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:224:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:227:63: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:228:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:229:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:239:63: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:42: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:244:68: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:245:29: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:246:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:247:72: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:288:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:297:33: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:297:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:298:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:301:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:307:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:336:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/model_orchestrator.py:368:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:369:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:370:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:372:23: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:373:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:374:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:378:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:457:12: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:537:66: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:673:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:676:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:681:52: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:682:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:689:30: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:693:38: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:789:82: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:794:87: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:797:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:802:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:905:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:905:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:930:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:931:28: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:933:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:48: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:934:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:935:46: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:935:66: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:936:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:940:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:941:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:946:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:953:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:955:10: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:955:10: E116 unexpected indentation (comment) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:957:76: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:960:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:962:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:964:49: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:976:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:984:57: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1006:38: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1007:41: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1007:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1008:44: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1008:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1009:40: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1009:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1010:46: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1010:71: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1012:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1019:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1039:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1046:40: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1092:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1093:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1094:26: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1095:32: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1135:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1138:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1139:32: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1140:60: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1144:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1145:36: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1146:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1147:38: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1149:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1160:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1160:62: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1163:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1164:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1169:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1170:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1171:58: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1173:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1178:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1182:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1186:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1189:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1195:86: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1197:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1204:77: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1265:57: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1274:25: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1284:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1285:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1286:35: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1287:38: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1288:39: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1295:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1296:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1297:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1373:25: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1374:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1376:31: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1449:5: C901 'ModelOrchestrator._initialize_classes' is too complex (21) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1469:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1471:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1472:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1474:68: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1475:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1476:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1477:40: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1494:42: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1495:43: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:40: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:53: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:56: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1496:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1577:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1580:69: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1601:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1603:9: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1662:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1667:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1681:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1691:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1701:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1715:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1718:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1747:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1759:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1771:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1777:25: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1778:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1779:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1780:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1781:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1782:22: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1783:32: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1784:23: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1785:20: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1786:29: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1787:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1788:33: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1789:34: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1790:27: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1791:28: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/model_orchestrator.py:1792:31: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:212:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:213:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:214:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:215:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:216:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:217:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:218:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:219:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:220:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:221:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:225:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:226:22: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:240:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:242:59: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:243:58: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:244:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:245:63: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:246:55: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:247:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:248:59: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:249:63: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:250:55: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/configure_model_cli.py:252:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:124:35: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:126:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:130:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:245:39: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:247:51: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:251:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:514:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:516:60: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:517:53: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:518:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:519:66: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:520:66: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:521:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:522:65: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:523:64: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:524:72: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:525:74: E231 missing whitespace after ':' -./build/lib/tfscreen/tfmodel/scripts/fit_model_cli.py:527:1: E305 expected 2 blank lines after class or function definition, found 1 -./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used -./build/lib/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:115:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:116:23: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:207:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:208:11: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:213:20: E221 multiple spaces before operator -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:290:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:291:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:24: E128 continuation line under-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:295:1: C901 '_inject_calibration_priors' is too complex (21) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:554:1: C901 '_build_csv_updates' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:612:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:613:35: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:752:1: C901 '_apply_guesses_updates' is too complex (12) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:904:1: E303 too many blank lines (3) -./build/lib/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:908:1: E302 expected 2 blank lines, found 3 -./build/lib/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) -./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) -./build/lib/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) -./build/lib/tfscreen/tfmodel/scripts/summarize_fit_cli.py:521:1: C901 'summarize_fit' is too complex (59) -./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) -./build/lib/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/batch.py:44:59: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:46:47: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:47:55: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:48:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:49:45: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:50:69: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:51:69: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:52:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/batch.py:53:67: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:6:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:86:63: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:95:28: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/populate_dataclass.py:101:1: W391 blank line at end of file -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:22: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:52:27: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:80:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:107:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:111:54: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:113:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:118:49: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:119:50: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:122:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:148:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:161:79: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:179:39: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:183:71: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:184:67: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:186:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:200:51: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:204:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:236:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:238:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:244:43: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:29: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:256:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:282:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:295:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:302:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:308:58: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:314:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:315:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:320:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:321:55: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:322:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:330:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:331:34: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:334:37: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:339:74: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:357:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:361:70: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:365:84: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:366:55: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:367:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:377:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:379:34: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:395:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:398:53: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:405:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:409:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:410:82: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:422:36: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:429:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:435:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:451:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:452:43: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:458:66: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:460:51: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:466:78: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:467:75: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:469:77: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:476:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:477:73: W291 trailing whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:487:40: E231 missing whitespace after ',' -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:493:5: E303 too many blank lines (2) -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:502:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:512:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:517:1: W293 blank line contains whitespace -./build/lib/tfscreen/tfmodel/tensors/tensor_manager.py:528:1: W391 blank line at end of file -./build/lib/tfscreen/util/__init__.py:71:2: W292 no newline at end of file -./build/lib/tfscreen/util/cli/__init__.py:16:1: W391 blank line at end of file -./build/lib/tfscreen/util/cli/generalized_main.py:1:11: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:5:1: C901 'generalized_main' is too complex (15) -./build/lib/tfscreen/util/cli/generalized_main.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/cli/generalized_main.py:13:78: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:14:46: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:24:69: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:27:51: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:30:51: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:57:77: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:58:36: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:69:30: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:74:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:75:74: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:85:58: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:87:34: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:87:48: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:92:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:94:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:97:39: W291 trailing whitespace -./build/lib/tfscreen/util/cli/generalized_main.py:104:45: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:104:59: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:104:75: E231 missing whitespace after ',' -./build/lib/tfscreen/util/cli/generalized_main.py:105:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/__init__.py:28:2: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/add_group_columns.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/add_group_columns.py:8:79: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:9:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:10:82: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:12:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:13:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:25:75: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:42:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:43:12: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:47:36: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:52:29: E211 whitespace before '(' -./build/lib/tfscreen/util/dataframe/add_group_columns.py:65:77: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:70:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:73:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:80:51: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:81:51: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/add_group_columns.py:90:21: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/check_columns.py:4:1: E303 too many blank lines (3) -./build/lib/tfscreen/util/dataframe/check_columns.py:4:21: E231 missing whitespace after ',' -./build/lib/tfscreen/util/dataframe/check_columns.py:35:30: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:3:1: F811 redefinition of unused 'np' from line 1 -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/chunk_by_group.py:74:44: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:63:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:65:49: E231 missing whitespace after ',' -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:68:5: E303 too many blank lines (2) -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:84:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:89:74: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:90:76: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:91:22: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:100:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:105:36: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:111:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/df_to_arrays.py:112:24: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/expand_on_conditions.py:62:1: W391 blank line at end of file -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:56:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:61:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:80:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_group_mean_std.py:95:37: W292 no newline at end of file -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:9:14: W291 trailing whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: C901 'get_scaled_cfu' is too complex (17) -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:13:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:62:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:67:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:76:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:130:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/dataframe/get_scaled_cfu.py:131:14: W292 no newline at end of file -./build/lib/tfscreen/util/io/read_dataframe.py:7:1: C901 'read_dataframe' is too complex (16) -./build/lib/tfscreen/util/io/read_dataframe.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/io/read_dataframe.py:79:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/io/read_dataframe.py:84:27: E127 continuation line over-indented for visual indent -./build/lib/tfscreen/util/io/read_dataframe.py:85:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/io/read_dataframe.py:102:14: W292 no newline at end of file -./build/lib/tfscreen/util/io/read_yaml.py:31:1: C901 'read_yaml' is too complex (12) -./build/lib/tfscreen/util/numerical/array_search.py:7:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/array_search.py:48:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/array_search.py:80:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:82:31: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/numerical/array_search.py:90:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:97:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/array_search.py:98:37: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/broadcast_args.py:4:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/broadcast_args.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/broadcast_args.py:90:1: W391 blank line at end of file -./build/lib/tfscreen/util/numerical/padding.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/padding.py:29:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:34:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:37:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:41:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:43:48: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/padding.py:44:36: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/padding.py:46:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:50:30: E203 whitespace before ':' -./build/lib/tfscreen/util/numerical/padding.py:52:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/padding.py:53:21: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/transform.py:10:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/transform.py:189:36: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/xfill.py:3:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/xfill.py:14:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:26:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:32:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/xfill.py:58:14: E111 indentation is not a multiple of 4 -./build/lib/tfscreen/util/numerical/xfill.py:58:14: E117 over-indented -./build/lib/tfscreen/util/numerical/xfill.py:58:29: E261 at least two spaces before inline comment -./build/lib/tfscreen/util/numerical/xfill.py:79:20: W292 no newline at end of file -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:5:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:45:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:50:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:57:22: E231 missing whitespace after ',' -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:66:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:69:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:70:71: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:71:34: W291 trailing whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:73:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/numerical/zero_truncated_poisson.py:74:23: W292 no newline at end of file -./build/lib/tfscreen/util/validation/check.py:37:1: C901 'check_number' is too complex (12) -./build/lib/tfscreen/util/validation/check.py:37:1: E302 expected 2 blank lines, found 1 -./build/lib/tfscreen/util/validation/check.py:92:1: W293 blank line contains whitespace -./build/lib/tfscreen/util/validation/check.py:118:18: W292 no newline at end of file ./scripts/generate_struct_ensemble.py:266:11: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:272:24: E221 multiple spaces before operator ./scripts/generate_struct_ensemble.py:433:18: E221 multiple spaces before operator @@ -5117,6 +1242,25 @@ ./src/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals ./src/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals ./src/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used +./src/tfscreen/simulate/presplit_data.py:55:15: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:56:17: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:57:16: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:58:16: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:62:20: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:63:22: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:64:21: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:83:48: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/presplit_data.py:84:14: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:85:16: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:90:17: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:103:19: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:106:19: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:107:17: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:108:16: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:111:17: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:113:25: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:115:19: E221 multiple spaces before operator +./src/tfscreen/simulate/presplit_data.py:129:19: E221 multiple spaces before operator ./src/tfscreen/simulate/run_simulation.py:12:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/simulate/run_simulation.py:17:1: W293 blank line contains whitespace ./src/tfscreen/simulate/run_simulation.py:18:36: E231 missing whitespace after ',' @@ -5165,26 +1309,7 @@ ./src/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./src/tfscreen/simulate/scripts/simulate_cli.py:120:15: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:121:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:122:16: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:123:16: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:127:20: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:128:22: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:129:21: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:148:48: E127 continuation line over-indented for visual indent -./src/tfscreen/simulate/scripts/simulate_cli.py:149:14: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:150:16: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:155:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:168:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:171:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:172:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:173:16: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:176:17: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:178:25: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:180:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:194:19: E221 multiple spaces before operator -./src/tfscreen/simulate/scripts/simulate_cli.py:211:1: C901 'run_simulation_from_config' is too complex (12) +./src/tfscreen/simulate/scripts/simulate_cli.py:15:1: C901 'run_simulation_from_config' is too complex (12) ./src/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' @@ -7007,68 +3132,57 @@ ./src/tfscreen/tfmodel/generative/components/theta/thermo/io.py:171:13: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/io.py:181:18: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/theta/thermo/nn.py:62:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:11:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:15:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:33:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:36:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:48:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:52:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:56:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:59:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:129:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:13:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:17:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:35:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:38:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:50:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:54:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:58:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:61:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:131:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:156:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:162:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:167:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:175:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:133:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:158:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:164:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:169:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:177:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:181:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:185:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:189:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:192:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:179:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:183:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:187:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:191:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:194:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:197:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:204:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:207:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:211:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:232:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:241:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:249:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:270:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:279:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:305:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:306:28: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:307:35: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:331:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:352:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:364:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:367:21: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:368:28: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:391:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:414:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:421:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:441:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:446:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:450:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:453:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:455:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:457:21: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:480:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:482:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:483:54: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:484:79: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:486:74: W291 trailing whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:490:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:493:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:196:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:199:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:206:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:209:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:213:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:234:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:243:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:251:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:272:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:281:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:307:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:308:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:308:28: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:309:35: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:333:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:354:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:366:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:369:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:369:21: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:370:28: W291 trailing whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:393:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:416:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:423:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:523:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/generative/components/transformation/_congression.py:536:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:5:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:13:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:20:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:19:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/empirical.py:32:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:6:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:14:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:21:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:46:36: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:20:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:33:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py:58:36: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/generative/components/transformation/single.py:5:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/transformation/single.py:9:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/transformation/single.py:14:1: E302 expected 2 blank lines, found 1 @@ -7326,163 +3440,166 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:810:82: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:815:87: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:818:84: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:823:79: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:926:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) -./src/tfscreen/tfmodel/model_orchestrator.py:926:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:951:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:952:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:954:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:955:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:955:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:955:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:956:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:956:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:957:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:961:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:962:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:967:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:974:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:976:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:976:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:978:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:981:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:983:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:985:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:997:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1005:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1027:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1028:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1028:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1029:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1029:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1030:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1030:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1031:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1031:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1033:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1040:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1060:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1060:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1060:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1067:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1113:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1114:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1115:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1116:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1156:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1159:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1160:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1161:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1165:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1166:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1167:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1168:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1170:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1181:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1181:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1184:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1185:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1190:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1191:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1192:58: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1194:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1199:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1203:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1207:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1210:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1216:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:950:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) +./src/tfscreen/tfmodel/model_orchestrator.py:950:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:975:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:976:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:978:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:979:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:979:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:979:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:980:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:980:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:981:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:985:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:986:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:991:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:998:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1000:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:1000:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:1002:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1005:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1007:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1009:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1021:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1029:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1051:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1052:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1052:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1053:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1053:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1054:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1054:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1055:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1055:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1057:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1064:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1084:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1084:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1084:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1091:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1137:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1138:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1139:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1140:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1180:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1183:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1184:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1185:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1189:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1190:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1191:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1192:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1194:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1205:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1205:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1208:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1209:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1214:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1215:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1216:58: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:1218:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1225:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1286:57: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1295:25: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1305:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1306:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1307:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1308:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1309:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1316:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1317:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1318:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1394:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1395:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1397:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1470:5: C901 'ModelOrchestrator._initialize_classes' is too complex (23) -./src/tfscreen/tfmodel/model_orchestrator.py:1490:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1492:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1493:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1495:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1496:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1497:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1498:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1515:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1516:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1517:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1517:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1517:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1517:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1517:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1598:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1601:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1622:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1624:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1706:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1711:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1725:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1735:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1745:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1759:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1762:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1223:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1227:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1231:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1234:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1240:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1242:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1249:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1310:57: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1319:25: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1329:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1330:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1331:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1332:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1333:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1340:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1341:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1342:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1418:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1419:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1421:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1494:5: C901 'ModelOrchestrator._initialize_classes' is too complex (25) +./src/tfscreen/tfmodel/model_orchestrator.py:1514:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1516:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1517:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1519:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1520:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1521:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1522:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1539:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1540:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1541:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1541:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1541:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1541:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1541:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1630:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1633:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1654:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1656:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1738:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1743:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1757:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1767:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1777:75: W291 trailing whitespace ./src/tfscreen/tfmodel/model_orchestrator.py:1791:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1803:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1815:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1821:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1822:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1823:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1824:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1825:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1826:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1827:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1828:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1829:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1830:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1831:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1832:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1833:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1834:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1835:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1836:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:206:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:207:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:208:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:209:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:210:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:211:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:212:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:213:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:214:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:215:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:216:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:217:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:218:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:219:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:220:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:221:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1794:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1823:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1835:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1847:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1853:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1854:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1855:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1856:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1857:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1858:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1859:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1860:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1861:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1862:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1863:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1864:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1865:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1866:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1867:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1868:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1869:31: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:225:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:226:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:240:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:242:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:243:58: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:244:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:245:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:246:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:247:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:248:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:249:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:250:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:252:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:227:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:228:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:229:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:230:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:231:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:232:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:233:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:234:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:235:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:236:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:237:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:238:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:239:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:240:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:241:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:242:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:243:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:257:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:259:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:260:58: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:261:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:262:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:263:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:264:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:265:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:266:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:267:62: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:268:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:269:62: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:271:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' @@ -9020,33 +5137,25 @@ ./tests/tfscreen/simulate/test_build_sample_dataframes.py:104:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:115:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:128:55: W292 no newline at end of file -./tests/tfscreen/simulate/test_generate_presplit_data.py:11:1: F401 'pytest' imported but unused -./tests/tfscreen/simulate/test_generate_presplit_data.py:14:1: F401 'unittest.mock.MagicMock' imported but unused -./tests/tfscreen/simulate/test_generate_presplit_data.py:74:39: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:86:42: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:87:42: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:89:39: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:97:39: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:105:39: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:123:39: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:124:14: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_generate_presplit_data.py:140:20: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_generate_presplit_data.py:141:51: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:142:22: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_generate_presplit_data.py:143:51: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:145:22: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_generate_presplit_data.py:158:35: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_generate_presplit_data.py:160:35: E127 continuation line over-indented for visual indent -./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: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 +./tests/tfscreen/simulate/test_presplit_data.py:71:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:83:42: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:84:42: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:86:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:94:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:102:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:120:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:121:14: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_presplit_data.py:137:20: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_presplit_data.py:138:48: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:139:22: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_presplit_data.py:140:48: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:142:22: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_presplit_data.py:155:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:157:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_presplit_data.py:159:36: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_run_simulation.py:3:1: F401 'os' imported but unused ./tests/tfscreen/simulate/test_run_simulation.py:5:1: F401 'unittest.mock.MagicMock' imported but unused ./tests/tfscreen/simulate/test_run_simulation.py:7:1: F401 'tfscreen.util' imported but unused @@ -9223,7 +5332,13 @@ ./tests/tfscreen/simulate/test_selection_experiment.py:1269:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1272:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1322:18: W292 no newline at end of file -./tests/tfscreen/simulate/test_simulate_cli.py:303:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused +./tests/tfscreen/simulate/test_simulate_cli.py:220:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:224:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:266:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:271:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:273:31: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:275:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:331:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused ./tests/tfscreen/simulate/test_thermo_to_growth.py:28:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:32:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:41:1: E302 expected 2 blank lines, found 1 @@ -9360,14 +5475,14 @@ ./tests/tfscreen/tfmodel/analysis/test_prediction.py:7:1: F401 'unittest.mock.MagicMock' imported but unused ./tests/tfscreen/tfmodel/analysis/test_prediction.py:7:1: F401 'unittest.mock.patch' imported but unused ./tests/tfscreen/tfmodel/analysis/test_prediction.py:18:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:45:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:54:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:66:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:76:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:80:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/analysis/test_prediction.py:83:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/analysis/test_prediction.py:87:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/analysis/test_prediction.py:97:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:51:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:60:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:72:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:82:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:86:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:89:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/analysis/test_prediction.py:93:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/analysis/test_prediction.py:103: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 @@ -10351,8 +6466,6 @@ ./tests/tfscreen/tfmodel/generative/components/theta/thermo/test_prior.py:84:16: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta/thermo/test_prior.py:91:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/theta_rescale/test_logit.py:2:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:1:1: F401 'pytest' imported but unused -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:3:1: F401 'numpy as np' imported but unused ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:5:1: F401 'numpyro.distributions as dist' imported but unused ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:6:1: F401 'unittest.mock.patch' imported but unused ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:16:1: E302 expected 2 blank lines, found 1 @@ -10385,15 +6498,13 @@ ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:103:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:104:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:109:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:202:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:207:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:211:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:217:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:224:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:237:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:242:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:245:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:261:1: W391 blank line at end of file +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:279:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:285:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:292:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:305:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:310:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:313:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py:329: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 @@ -10882,65 +6993,65 @@ ./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:134:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:143:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:151:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:155:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:157:71: E203 whitespace before ',' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:158:1: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:159:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:192:17: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:205:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:208:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:213:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:216:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:219:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:225:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:225:49: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:227:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:233:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:233:54: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:235:128: E501 line too long (142 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:236:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:239:76: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:245:128: E501 line too long (150 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:257:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:312:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:317:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:445:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:460:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:468:124: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:468:128: E501 line too long (130 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:471:9: F841 local variable 'mock_ri_class' is assigned to but never used -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:474:44: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:490:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:168:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:177:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:185:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:189:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:191:71: E203 whitespace before ',' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:192:1: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:193:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:226:17: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:239:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:242:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:250:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:259:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:259:49: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:267:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:267:54: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:128: E501 line too long (142 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:270:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:273:76: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:128: E501 line too long (150 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:346:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:348:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:351:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:479:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:494:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:502:124: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:502:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:505:9: F841 local variable 'mock_ri_class' is assigned to but never used +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:508:44: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:524: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 @@ -11170,53 +7281,53 @@ ./tests/tfscreen/tfmodel/test_model_orchestrator.py:477:128: E501 line too long (184 > 127 characters) ./tests/tfscreen/tfmodel/test_model_orchestrator.py:502:18: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/test_model_orchestrator.py:503:18: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/test_model_orchestrator.py:673:128: E501 line too long (184 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:822:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:823:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:827:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:835:51: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:77: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:98: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:125: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:841:128: E501 line too long (131 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:842:128: E501 line too long (138 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:844:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:846:86: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:858:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:863:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:871:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:879:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:890:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:893:128: E501 line too long (129 > 127 characters) -./tests/tfscreen/tfmodel/test_model_orchestrator.py:900:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:907:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:915:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:920:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:925:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:931:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:940:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:944:26: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:954:30: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:955:25: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:957:34: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:958:33: W291 trailing whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:970:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:47: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:49: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:51: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:53: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:972:55: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/test_model_orchestrator.py:976:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/test_model_orchestrator.py:985:26: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:986:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:989:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:992:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1255:9: F401 'inspect' imported but unused -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1652:34: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1896:18: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/test_model_orchestrator.py:1910:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:804:128: E501 line too long (184 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:955:79: E712 comparison to False should be 'if cond is False:' or 'if not cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:956:64: E712 comparison to True should be 'if cond is True:' or 'if cond:' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:960:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:968:51: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:77: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:98: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:125: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:974:128: E501 line too long (131 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:975:128: E501 line too long (138 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:977:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:979:86: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:991:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:996:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1004:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1012:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1023:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1026:128: E501 line too long (129 > 127 characters) +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1033:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1040:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1048:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1053:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1058:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1064:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1073:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1077:26: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1087:30: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1088:25: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1090:34: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1091:33: W291 trailing whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1103:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:47: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:49: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:51: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:53: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1105:55: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1109:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1118:26: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1119:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1122:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1125:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1388:9: F401 'inspect' imported but unused +./tests/tfscreen/tfmodel/test_model_orchestrator.py:1785:34: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/test_model_orchestrator.py:2029:18: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/test_model_orchestrator.py:2043:1: E302 expected 2 blank lines, found 1 ./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 @@ -11519,52 +7630,52 @@ ./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 -96 C901 'cat_fit' is too complex (19) -20 E111 indentation is not a multiple of 4 -9 E114 indentation is not a multiple of 4 (comment) -8 E116 unexpected indentation (comment) -16 E117 over-indented -2 E122 continuation line missing indentation or outdented -3 E124 closing bracket does not match visual indentation -12 E125 continuation line with same indent as next logical line -262 E127 continuation line over-indented for visual indent -163 E128 continuation line under-indented for visual indent +48 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) +11 E117 over-indented +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 +209 E127 continuation line over-indented for visual indent +94 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent -72 E201 whitespace after '[' -48 E202 whitespace before ']' -10 E203 whitespace before ',' -8 E211 whitespace before '(' -3032 E221 multiple spaces before operator -27 E222 multiple spaces after operator -16 E225 missing whitespace around operator -2000 E231 missing whitespace after ',' -127 E251 unexpected spaces around keyword / parameter equals -28 E252 missing whitespace around parameter equals -236 E261 at least two spaces before inline comment -2 E262 inline comment should start with '# ' +43 E201 whitespace after '[' +28 E202 whitespace before ']' +6 E203 whitespace before ',' +4 E211 whitespace before '(' +1839 E221 multiple spaces before operator +26 E222 multiple spaces after operator +8 E225 missing whitespace around operator +1110 E231 missing whitespace after ',' +103 E251 unexpected spaces around keyword / parameter equals +14 E252 missing whitespace around parameter equals +216 E261 at least two spaces before inline comment +1 E262 inline comment should start with '# ' 2 E265 block comment should start with '# ' -3 E266 too many leading '#' for block comment +2 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword -2 E301 expected 1 blank line, found 0 -951 E302 expected 2 blank lines, found 1 -90 E303 too many blank lines (2) -24 E305 expected 2 blank lines after class or function definition, found 1 +1 E301 expected 1 blank line, found 0 +781 E302 expected 2 blank lines, found 1 +50 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 -2 E401 multiple imports on one line -54 E402 module level import not at top of file -138 E501 line too long (145 > 127 characters) -60 E701 multiple statements on one line (colon) -7 E712 comparison to True should be 'if cond is True:' or 'if cond:' -4 E713 test for membership should be 'not in' +1 E401 multiple imports on one line +37 E402 module level import not at top of file +86 E501 line too long (145 > 127 characters) +46 E701 multiple statements on one line (colon) +5 E712 comparison to True should be 'if cond is True:' or 'if cond:' +2 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def -27 E741 ambiguous variable name 'l' -280 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused -18 F541 f-string is missing placeholders -5 F811 redefinition of unused 'np' from line 1 -56 F841 local variable 'e' is assigned to but never used -1067 W291 trailing whitespace -133 W292 no newline at end of file -2167 W293 blank line contains whitespace -51 W391 blank line at end of file -11521 +20 E741 ambiguous variable name 'l' +228 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 +42 F841 local variable 'e' is assigned to but never used +620 W291 trailing whitespace +85 W292 no newline at end of file +1584 W293 blank line contains whitespace +30 W391 blank line at end of file +7632 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 4e479463..fc299974 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/tfmodel/generative/components/transformation/_congression.py b/src/tfscreen/tfmodel/generative/components/transformation/_congression.py index 649b15e3..f17c9236 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/_congression.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/_congression.py @@ -1,3 +1,5 @@ +import math + import jax import jax.numpy as jnp import numpyro as pyro @@ -427,34 +429,71 @@ def guide(name: str, raise ValueError(f"Unsupported mode: {priors.mode}") -def get_hyperparameters(): +def get_hyperparameters(lam_mean=None, lam_std=None): """ Gets default values for the model hyperparameters. + Parameters + ---------- + lam_mean : float, optional + Experimentally measured mean of the congression Poisson rate + lambda, in linear (arithmetic) space. Must be provided together + with ``lam_std``. + lam_std : float, optional + Experimentally measured standard deviation of lambda, in linear + (arithmetic) space. Must be provided together with ``lam_mean``. + Returns ------- dict A dictionary of hyperparameter names and their default values. + + Raises + ------ + ValueError + If exactly one of ``lam_mean``/``lam_std`` is given, or either is + not strictly positive. """ + if (lam_mean is None) != (lam_std is None): + raise ValueError( + "lam_mean and lam_std must be provided together (or neither)." + ) + parameters = {} - - # Lambda prior: experimentally measured lambda = 0.3572, 95% CI [0.1559, 0.6743] - # lam_loc = log(0.3572); lam_scale from CI width in log-space: (log(0.6743)-log(0.1559))/(2*1.96) - parameters["lam_loc"] = -1.029 - parameters["lam_scale"] = 0.37 - + + if lam_mean is not None: + if lam_mean <= 0: + raise ValueError(f"lam_mean must be > 0; got {lam_mean}") + if lam_std <= 0: + raise ValueError(f"lam_std must be > 0; got {lam_std}") + + # Moment-match the experimentally measured (mean, std) -- in linear + # space, as an experimentalist would report them -- onto the + # LogNormal prior's underlying-Normal parameters. + sigma2 = math.log(1.0 + (lam_std / lam_mean) ** 2) + parameters["lam_loc"] = math.log(lam_mean) - sigma2 / 2.0 + parameters["lam_scale"] = math.sqrt(sigma2) + else: + # Placeholder only -- never used by tfs-configure-model / + # tfs-fit-model, which require an experimentally measured lam_mean/ + # lam_std for this component (see ModelOrchestrator/configure_model). + # Exists so this module stays independently constructible/testable, + # mirroring dk_geno.pinned's placeholder convention. + parameters["lam_loc"] = 0.0 + parameters["lam_scale"] = 1.0 + # Anchoring scales (tightening this makes the background track the prior more closely) parameters["mu_anchoring_scale"] = 0.5 parameters["sigma_anchoring_scale"] = 0.2 - + # Background model mode: 'logit_normal' (default) or 'empirical' parameters["mode"] = "logit_norm" - + return parameters - -def get_guesses(name,data): + +def get_guesses(name, data, lam_mean=None): """ Gets initial guess values for model parameters. @@ -468,6 +507,10 @@ def get_guesses(name,data): data : DataClass A data object containing metadata, primarily: - ``data.num_genotype`` : (int) number of non-wt genotypes + lam_mean : float, optional + Experimentally measured mean of lambda (linear space); used + directly as the initial guess. If omitted, a placeholder guess is + used (see ``get_hyperparameters``). Returns ------- @@ -478,25 +521,34 @@ def get_guesses(name,data): guesses = {} - guesses[f"{name}_lam"] = 0.3572 # experimentally measured value - - # Only add these if we are not in empirical mode. - # NOTE: get_guesses currently doesn't know the mode from the config easily + guesses[f"{name}_lam"] = lam_mean if lam_mean is not None else 1.0 + + # Only add these if we are not in empirical mode. + # NOTE: get_guesses currently doesn't know the mode from the config easily # during initialization in model_orchestrator.py unless we pass it. - # For now, we'll keep them as guesses; they just won't be used if not + # For now, we'll keep them as guesses; they just won't be used if not # in the model/guide. guesses[f"{name}_mu"] = 0.0 guesses[f"{name}_sigma"] = 1.0 - + return guesses -def get_priors(): +def get_priors(lam_mean=None, lam_std=None): """ Utility function to create a populated ModelPriors object. + Parameters + ---------- + lam_mean : float, optional + Experimentally measured mean of lambda (linear space). See + ``get_hyperparameters``. + lam_std : float, optional + Experimentally measured standard deviation of lambda (linear + space). See ``get_hyperparameters``. + Returns ------- ModelPriors A populated Pytree (Flax dataclass) of hyperparameters. """ - return ModelPriors(**get_hyperparameters()) + return ModelPriors(**get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std)) diff --git a/src/tfscreen/tfmodel/generative/components/transformation/empirical.py b/src/tfscreen/tfmodel/generative/components/transformation/empirical.py index 3072bb0e..548bc4d2 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/empirical.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/empirical.py @@ -2,19 +2,31 @@ import pandas as pd from . import _congression as congression -def get_hyperparameters(): +def get_hyperparameters(lam_mean=None, lam_std=None): """ Gets default values for the model hyperparameters, forced to empirical mode. + + Parameters + ---------- + lam_mean, lam_std : float, optional + Experimentally measured mean/std of lambda (linear space). See + ``_congression.get_hyperparameters``. """ - parameters = congression.get_hyperparameters() + parameters = congression.get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std) parameters["mode"] = "empirical" return parameters -def get_priors(): +def get_priors(lam_mean=None, lam_std=None): """ Gets model priors initialized to empirical mode. + + Parameters + ---------- + lam_mean, lam_std : float, optional + Experimentally measured mean/std of lambda (linear space). See + ``_congression.get_hyperparameters``. """ - return congression.ModelPriors(**get_hyperparameters()) + return congression.ModelPriors(**get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std)) # These are mode-agnostic or depend on priors.mode get_guesses = congression.get_guesses diff --git a/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py b/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py index d19a0241..40bd3faa 100644 --- a/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py +++ b/src/tfscreen/tfmodel/generative/components/transformation/logit_norm.py @@ -3,19 +3,31 @@ import pandas as pd from . import _congression as congression -def get_hyperparameters(): +def get_hyperparameters(lam_mean=None, lam_std=None): """ Gets default values for the model hyperparameters, forced to logit_norm mode. + + Parameters + ---------- + lam_mean, lam_std : float, optional + Experimentally measured mean/std of lambda (linear space). See + ``_congression.get_hyperparameters``. """ - parameters = congression.get_hyperparameters() + parameters = congression.get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std) parameters["mode"] = "logit_norm" return parameters -def get_priors(): +def get_priors(lam_mean=None, lam_std=None): """ Gets model priors initialized to logit_norm mode. + + Parameters + ---------- + lam_mean, lam_std : float, optional + Experimentally measured mean/std of lambda (linear space). See + ``_congression.get_hyperparameters``. """ - return congression.ModelPriors(**get_hyperparameters()) + return congression.ModelPriors(**get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std)) # These are mode-agnostic or depend on priors.mode get_guesses = congression.get_guesses diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 0616bae3..b7b81f7b 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -820,8 +820,19 @@ class ModelOrchestrator: theta : str, optional Model name for theta calculation (e.g., "hill"). transformation : str, optional - Model name for transformation correction. Allowed values are 'single', - 'empirical', or 'logit_norm'. Default 'empirical' + Model name for transformation correction. Allowed values are 'single' + (default), 'empirical', or 'logit_norm'. + transform_lam : tuple, optional + ``(mean, std)`` -- the experimentally measured congression lambda, + in linear space -- used to anchor the ``transformation`` prior when + it is 'empirical' or 'logit_norm'. Forbidden when + ``transformation == 'single'`` (which has no lambda parameter). If + omitted for 'empirical'/'logit_norm', a weakly-informative + placeholder prior is used (see + ``generative/components/transformation/_congression.get_hyperparameters``); + ``configure_model`` (the ``tfs-configure-model`` entry point) + requires it explicitly rather than silently falling back to the + placeholder. theta_growth_noise : str, optional Model name for noise on theta in the growth model ('zero', 'beta', or 'logit_normal'). Default 'logit_normal'. @@ -861,7 +872,8 @@ def __init__(self, dk_geno_pins_file=None, activity="horseshoe_geno", theta="hill_geno", - transformation="empirical", + transformation="single", + transform_lam=None, theta_rescale="passthrough", theta_growth_noise="logit_normal", theta_binding_noise="zero", @@ -892,6 +904,7 @@ def __init__(self, self._activity = activity self._theta = theta self._transformation = transformation + self._transform_lam = transform_lam self._theta_rescale = theta_rescale self._theta_growth_noise = theta_growth_noise self._theta_binding_noise = theta_binding_noise @@ -919,6 +932,17 @@ def __init__(self, f"use it." ) + if self._transformation == "single" and self._transform_lam is not None: + raise ValueError( + "transform_lam was provided but transformation == 'single', " + "which has no lambda parameter to anchor it to." + ) + if self._transform_lam is not None and len(self._transform_lam) != 2: + raise ValueError( + f"transform_lam must be a (mean, std) pair; got " + f"{self._transform_lam!r}." + ) + self._initialize_data() self._initialize_classes() @@ -1581,6 +1605,12 @@ def _initialize_classes(self): elif "dk_geno_values" in priors_sig.parameters: priors_class_kwargs[prior_group][key] = \ component_module.get_priors(dk_geno_values=self._dk_geno_values) + elif "lam_mean" in priors_sig.parameters: + lam_mean, lam_std = ( + (None, None) if self._transform_lam is None else self._transform_lam + ) + priors_class_kwargs[prior_group][key] = \ + component_module.get_priors(lam_mean=lam_mean, lam_std=lam_std) else: priors_class_kwargs[prior_group][key] = \ component_module.get_priors() @@ -1590,6 +1620,8 @@ def _initialize_classes(self): guesses_kwargs = {"name": key, "data": component_data} if "presplit" in guesses_sig.parameters: guesses_kwargs["presplit"] = self._data.presplit + if "lam_mean" in guesses_sig.parameters and self._transform_lam is not None: + guesses_kwargs["lam_mean"] = self._transform_lam[0] guesses = component_module.get_guesses(**guesses_kwargs) init_params.update(guesses) @@ -1828,6 +1860,7 @@ def settings(self): "activity":self._activity, "theta":self._theta, "transformation":self._transformation, + "transform_lam":self._transform_lam, "theta_rescale":self._theta_rescale, "theta_growth_noise":self._theta_growth_noise, "theta_binding_noise":self._theta_binding_noise, diff --git a/src/tfscreen/tfmodel/scripts/configure_model_cli.py b/src/tfscreen/tfmodel/scripts/configure_model_cli.py index 99b896da..d5f07ff4 100644 --- a/src/tfscreen/tfmodel/scripts/configure_model_cli.py +++ b/src/tfscreen/tfmodel/scripts/configure_model_cli.py @@ -57,7 +57,8 @@ def configure_model(binding_df, dk_geno_model="hierarchical_geno", activity_model="horseshoe_geno", theta_model="hill_geno", - transformation_model="empirical", + transformation_model="single", + transform_lam=None, theta_rescale_model="passthrough", theta_growth_noise_model="zero", theta_binding_noise_model="zero", @@ -137,8 +138,15 @@ def configure_model(binding_df, 'thermo.O2_C12_K5_U0_a.PnnC', 'thermo.O2_C12_K5_U0_a.PddG', and their O2_C4_K3_U1_a / O2_C12_K5_U1_a unfolded equivalents). transformation_model : str, optional - Model for transformation correction. Allowed values are 'single', - 'empirical', or 'logit_norm'. Default 'empirical'. + Model for transformation correction. Allowed values are 'single' + (default), 'empirical', or 'logit_norm'. + transform_lam : list or tuple, optional + ``(mean, std)`` -- the experimentally measured congression lambda, + in linear space (e.g. ``(0.36, 0.05)``). Required when + ``transformation_model`` is 'empirical' or 'logit_norm'; forbidden + when it is 'single'. Used to moment-match a LogNormal prior for the + transformation's lambda parameter, replacing the manual step of + hand-editing the priors/guesses CSVs with rescaled log-space values. theta_rescale_model : str, optional Rescaling applied to theta before it enters the growth model. Allowed values are 'passthrough' (default, identity) or 'logit' (maps theta to @@ -201,6 +209,14 @@ def configure_model(binding_df, if not binding_only: check_component_compatibility(condition_growth_model, theta_rescale_model) + if transformation_model != "single" and transform_lam is None: + raise ValueError( + f"transformation_model='{transformation_model}' requires " + f"transform_lam (mean, std) -- the experimentally measured " + f"congression lambda in linear space, e.g. " + f"transform_lam=(0.36, 0.05)." + ) + # Initialize model to build mappings and get guesses orchestrator = ModelOrchestrator(growth_df, binding_df, @@ -214,6 +230,7 @@ def configure_model(binding_df, activity=activity_model, theta=theta_model, transformation=transformation_model, + transform_lam=transform_lam, theta_rescale=theta_rescale_model, theta_growth_noise=theta_growth_noise_model, theta_binding_noise=theta_binding_noise_model, @@ -246,8 +263,10 @@ def main(): "spiked":list, "thermo_data":str, "batch_size":int, - "binding_weight":float}, - manual_arg_nargs={"spiked":"+"}) + "binding_weight":float, + "transform_lam":float}, + manual_arg_nargs={"spiked":"+", + "transform_lam":2}) if __name__ == "__main__": main() diff --git a/tests/tfscreen/tfmodel/analysis/test_prediction.py b/tests/tfscreen/tfmodel/analysis/test_prediction.py index 17802b12..615116f1 100644 --- a/tests/tfscreen/tfmodel/analysis/test_prediction.py +++ b/tests/tfscreen/tfmodel/analysis/test_prediction.py @@ -40,7 +40,13 @@ def dummy_orchestrator(): "theta_std": [0.01, 0.01] }) - return ModelOrchestrator(growth_df, binding_df) + # transformation='empirical' (rather than the 'single' default) is load- + # bearing for TestGenotypeSubsetPopulationReference below, which relies + # on NEEDS_FULL_POPULATION_THETA=True. + return ModelOrchestrator( + growth_df, binding_df, + transformation="empirical", transform_lam=(0.36, 0.05), + ) def test_copy_orchestrator_defaults(dummy_orchestrator): """Test copy_orchestrator with all None inputs.""" @@ -604,7 +610,7 @@ def _fake_posteriors_with_theta_growth_pred(self, orchestrator): def test_genotype_subset_still_gets_full_population_sized_reference( self, dummy_orchestrator, mocker): - """dummy_orchestrator defaults to theta='hill_geno', + """dummy_orchestrator uses theta='hill_geno', transformation='empirical' (NEEDS_FULL_POPULATION_THETA=True). Requesting a single genotype must still populate pred_data.growth.external_theta_population with the FULL genotype diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py b/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py index a7e567d6..7d269d7b 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test__congression.py @@ -199,15 +199,83 @@ def test_getters(): assert "lam_loc" in params assert "mu_anchoring_scale" in params assert "sigma_anchoring_scale" in params - + guesses = transformation_congression.get_guesses("test", MagicMock()) assert "test_lam" in guesses assert "test_mu" in guesses assert "test_sigma" in guesses - + priors = transformation_congression.get_priors() assert isinstance(priors, transformation_congression.ModelPriors) + +# ------------------------------------------------------------------------- +# lam_mean/lam_std -- experimentally measured lambda moment-matching +# ------------------------------------------------------------------------- + +def test_get_hyperparameters_placeholder_default(): + """With no lam_mean/lam_std, a weakly-informative placeholder is used -- + never a specific 'real' experimental value (that would be misleading + now that the real value must be supplied explicitly by the caller).""" + params = transformation_congression.get_hyperparameters() + assert params["lam_loc"] == 0.0 + assert params["lam_scale"] == 1.0 + + +def test_get_hyperparameters_moment_matching(): + """lam_mean/lam_std (linear space) must moment-match onto the + LogNormal's underlying-Normal parameters, i.e. the resulting + LogNormal(lam_loc, lam_scale) has the requested arithmetic mean/std.""" + lam_mean, lam_std = 0.3572, 0.13 + params = transformation_congression.get_hyperparameters( + lam_mean=lam_mean, lam_std=lam_std) + + lam_loc = params["lam_loc"] + lam_scale = params["lam_scale"] + + # Analytic mean/variance of a LogNormal(loc, scale). + implied_mean = np.exp(lam_loc + lam_scale**2 / 2.0) + implied_var = (np.exp(lam_scale**2) - 1.0) * np.exp(2 * lam_loc + lam_scale**2) + + assert np.isclose(implied_mean, lam_mean) + assert np.isclose(implied_var, lam_std**2) + + +def test_get_hyperparameters_requires_both_lam_mean_and_lam_std(): + """A lone lam_mean or lam_std (without its partner) is ambiguous and + must raise rather than silently guessing the other.""" + with pytest.raises(ValueError, match="together"): + transformation_congression.get_hyperparameters(lam_mean=0.36) + with pytest.raises(ValueError, match="together"): + transformation_congression.get_hyperparameters(lam_std=0.05) + + +@pytest.mark.parametrize("lam_mean,lam_std", [(0.0, 0.1), (-0.1, 0.1), (0.36, 0.0), (0.36, -0.1)]) +def test_get_hyperparameters_rejects_nonpositive_lam(lam_mean, lam_std): + """lam_mean and lam_std must both be strictly positive (LogNormal support).""" + with pytest.raises(ValueError): + transformation_congression.get_hyperparameters(lam_mean=lam_mean, lam_std=lam_std) + + +def test_get_guesses_uses_lam_mean_as_guess(): + """When lam_mean is supplied, it becomes the initial guess directly + (rather than the old hardcoded 0.3572).""" + guesses = transformation_congression.get_guesses("test", MagicMock(), lam_mean=0.5) + assert guesses["test_lam"] == 0.5 + + +def test_get_guesses_placeholder_without_lam_mean(): + guesses = transformation_congression.get_guesses("test", MagicMock()) + assert guesses["test_lam"] == 1.0 + + +def test_get_priors_forwards_lam_mean_std(): + priors = transformation_congression.get_priors(lam_mean=0.3572, lam_std=0.13) + assert isinstance(priors, transformation_congression.ModelPriors) + expected = transformation_congression.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + assert priors.lam_loc == expected["lam_loc"] + assert priors.lam_scale == expected["lam_scale"] + def test_define_model(): """Test Numpyro model definition with plates.""" priors = transformation_congression.get_priors() diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py index 25453f07..2faa2de8 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test_empirical.py @@ -24,6 +24,22 @@ def test_get_priors_mode(): assert priors.mode == "empirical" +def test_get_hyperparameters_forwards_lam_mean_std(): + params = empirical.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + expected = congression.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + assert params["lam_loc"] == expected["lam_loc"] + assert params["lam_scale"] == expected["lam_scale"] + assert params["mode"] == "empirical" + + +def test_get_priors_forwards_lam_mean_std(): + priors = empirical.get_priors(lam_mean=0.3572, lam_std=0.13) + assert priors.mode == "empirical" + expected = congression.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + assert priors.lam_loc == expected["lam_loc"] + assert priors.lam_scale == expected["lam_scale"] + + def test_update_thetas_bound_with_empirical(): """Pre-bound update_thetas should invoke empirical path taking only (lam,).""" theta = jnp.array([[0.1, 0.5, 0.9]]) diff --git a/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py b/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py index 881e5678..4d5bdb7c 100644 --- a/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py +++ b/tests/tfscreen/tfmodel/generative/components/transformation/test_logit_norm.py @@ -25,6 +25,22 @@ def test_get_priors_mode(): assert priors.mode == "logit_norm" +def test_get_hyperparameters_forwards_lam_mean_std(): + params = logit_norm.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + expected = congression.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + assert params["lam_loc"] == expected["lam_loc"] + assert params["lam_scale"] == expected["lam_scale"] + assert params["mode"] == "logit_norm" + + +def test_get_priors_forwards_lam_mean_std(): + priors = logit_norm.get_priors(lam_mean=0.3572, lam_std=0.13) + assert priors.mode == "logit_norm" + expected = congression.get_hyperparameters(lam_mean=0.3572, lam_std=0.13) + assert priors.lam_loc == expected["lam_loc"] + assert priors.lam_scale == expected["lam_scale"] + + def test_update_thetas_bound_with_logit_norm(): """Pre-bound update_thetas should invoke logit_norm path without theta_dist arg.""" theta = jnp.array([[0.2, 0.5, 0.8]]) diff --git a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py index 96d58998..de089d0c 100644 --- a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py +++ b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py @@ -113,6 +113,40 @@ def test_configure_model_passes_base_growth_df_to_orchestrator_and_config(mock_o assert written_config["data"]["base_growth"] == "bg.csv" +def test_configure_model_requires_transform_lam_for_empirical(mock_orchestrator, tmpdir): + """transformation_model='empirical' (or 'logit_norm') without transform_lam + must raise before ModelOrchestrator is even constructed.""" + out_prefix = os.path.join(tmpdir, "test") + with pytest.raises(ValueError, match="transform_lam"): + configure_model( + "b.csv", growth_df="g.csv", + transformation_model="empirical", + out_prefix=out_prefix, + ) + + +def test_configure_model_allows_single_without_transform_lam(mock_orchestrator, tmpdir): + """transformation_model='single' (the default) never requires transform_lam.""" + out_prefix = os.path.join(tmpdir, "test") + configure_model("b.csv", growth_df="g.csv", out_prefix=out_prefix) + assert os.path.exists(f"{out_prefix}_config.yaml") + + +def test_configure_model_forwards_transform_lam_to_orchestrator(mock_orchestrator, tmpdir): + mock_orchestrator_class, mock_orchestrator_inst = mock_orchestrator + out_prefix = os.path.join(tmpdir, "test") + + configure_model( + "b.csv", growth_df="g.csv", + transformation_model="empirical", + transform_lam=(0.3572, 0.13), + out_prefix=out_prefix, + ) + + assert mock_orchestrator_class.call_args.kwargs["transform_lam"] == (0.3572, 0.13) + assert mock_orchestrator_class.call_args.kwargs["transformation"] == "empirical" + + def test_configure_model_omits_base_growth_when_not_given(mock_orchestrator, tmpdir): """Without base_growth_df, no 'base_growth' key is written under data.""" mock_orchestrator_class, mock_orchestrator_inst = mock_orchestrator diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index dbcaf261..1f7ab7e0 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -648,6 +648,137 @@ def test_dk_geno_pinned_builds_values_and_wires_into_priors(mocker, tmp_path): assert model.settings["dk_geno"] == "pinned" +# --------------------------------------------------------------------------- +# transform_lam wiring +# --------------------------------------------------------------------------- + +def test_transform_lam_forbidden_with_single_transformation(): + """transformation='single' has no lambda parameter to anchor transform_lam + to, so supplying it must raise before any data I/O happens.""" + with pytest.raises(ValueError, match="transformation == 'single'"): + ModelOrchestrator( + "g.csv", "b.csv", + transformation="single", + transform_lam=(0.36, 0.05), + ) + + +def test_transform_lam_wrong_length_raises(): + with pytest.raises(ValueError, match="mean, std"): + ModelOrchestrator( + "g.csv", "b.csv", + transformation="empirical", + transform_lam=(0.36,), + ) + + +class _SpyTransformationModule: + """ + Thin real-object wrapper around a transformation component (logit_norm/ + empirical), recording what get_priors/get_guesses were actually called + with. + + inspect.signature(component_module.get_priors) must see the real + lam_mean/lam_std parameters for _initialize_classes's branch selection + to fire -- a bare MagicMock's signature is just (*args, **kwargs), + which would silently fall through to the wrong branch (mirrors + _SpyPinnedModule above). + """ + + def __init__(self, real_module): + self._real_module = real_module + self.priors_calls = [] + self.guesses_calls = [] + + def get_priors(self, lam_mean=None, lam_std=None): + self.priors_calls.append((lam_mean, lam_std)) + return self._real_module.get_priors(lam_mean=lam_mean, lam_std=lam_std) + + def get_guesses(self, name, data, lam_mean=None): + self.guesses_calls.append(lam_mean) + return self._real_module.get_guesses(name, data, lam_mean=lam_mean) + + def __getattr__(self, name): + return getattr(self._real_module, name) + + +def _build_orchestrator_with_transformation_spy(mocker, spy, transform_lam): + mock_growth_tm = create_mock_tm(is_growth=True) + mock_binding_tm = create_mock_tm(is_growth=False) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_growth_tm", return_value=mock_growth_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator._read_binding_df") + mocker.patch("tfscreen.tfmodel.model_orchestrator._build_binding_tm", return_value=mock_binding_tm) + mocker.patch("tfscreen.tfmodel.model_orchestrator.populate_dataclass", return_value=MagicMock()) + mocker.patch( + "tfscreen.tfmodel.model_orchestrator._setup_batching", + return_value={"batch_idx": jnp.array([0]), "batch_size": 1, + "scale_vector": jnp.array([1.0]), "num_binding": 0}, + ) + + with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", { + "condition_growth": {"independent": MagicMock()}, + "growth_transition": {"instant": MagicMock()}, + "ln_cfu0": {"hierarchical": MagicMock()}, + "dk_geno": {"hierarchical_geno": MagicMock()}, + "activity": {"hierarchical_geno": MagicMock()}, + "theta": {"hill_geno": MagicMock()}, + "transformation": {"logit_norm": spy}, + "theta_rescale": {"passthrough": MagicMock()}, + "theta_growth_noise": {"zero": MagicMock()}, + "theta_binding_noise": {"zero": MagicMock()}, + "growth_noise": {"zero": MagicMock()}, + "sample_offset": {"zero": MagicMock()}, + "observe_binding": MagicMock(), + "observe_growth": MagicMock(), + }, clear=True): + for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", + "activity", "theta", "theta_growth_noise", + "theta_binding_noise", "growth_noise", "sample_offset"]: + for sub_k in tfscreen.tfmodel.model_orchestrator.model_registry[k]: + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_priors.return_value = {} + tfscreen.tfmodel.model_orchestrator.model_registry[k][sub_k].get_guesses.return_value = {} + + return ModelOrchestrator( + "g.csv", "b.csv", + theta="hill_geno", transformation="logit_norm", + transform_lam=transform_lam, + condition_growth="independent", growth_transition="instant", + activity="hierarchical_geno", theta_growth_noise="zero", + ) + + +def test_transform_lam_wired_into_component_priors_and_guesses(mocker): + """End-to-end: transform_lam=(mean, std) must reach the real component's + get_priors(lam_mean=..., lam_std=...) and get_guesses(..., lam_mean=...) + via signature-based dispatch in _initialize_classes.""" + from tfscreen.tfmodel.generative.components.transformation import logit_norm as real_logit_norm + + spy = _SpyTransformationModule(real_logit_norm) + model = _build_orchestrator_with_transformation_spy(mocker, spy, (0.3572, 0.13)) + + assert spy.priors_calls == [(0.3572, 0.13)] + assert spy.guesses_calls == [0.3572] + + # Round-trips through the settings dict for YAML config serialisation. + assert model.settings["transform_lam"] == (0.3572, 0.13) + + +def test_transform_lam_omitted_falls_back_to_placeholder(mocker): + """Without transform_lam, the component still gets called (with + lam_mean=lam_std=None) rather than being skipped -- it falls back to + its own placeholder prior rather than ModelOrchestrator refusing to + build the model.""" + from tfscreen.tfmodel.generative.components.transformation import logit_norm as real_logit_norm + + spy = _SpyTransformationModule(real_logit_norm) + model = _build_orchestrator_with_transformation_spy(mocker, spy, None) + + assert spy.priors_calls == [(None, None)] + assert spy.guesses_calls == [None] + assert model.settings["transform_lam"] is None + + @pytest.mark.parametrize("transformation_key, expected_needs_population", [ ("single", False), ("logit_norm", False), @@ -783,6 +914,7 @@ def test_model_class_properties(initialized_model_class): model._activity = "a" model._theta = "t" model._transformation = "tr" + model._transform_lam = None model._theta_rescale = "rs" model._condition_growth = "cg" model._growth_transition = "gt" @@ -809,6 +941,7 @@ def test_model_class_properties(initialized_model_class): assert ModelOrchestrator.settings.fget(model)["activity"] == "a" assert ModelOrchestrator.settings.fget(model)["theta"] == "t" assert ModelOrchestrator.settings.fget(model)["transformation"] == "tr" + assert ModelOrchestrator.settings.fget(model)["transform_lam"] is None assert ModelOrchestrator.settings.fget(model)["theta_rescale"] == "rs" assert ModelOrchestrator.settings.fget(model)["condition_growth"] == "cg" assert ModelOrchestrator.settings.fget(model)["growth_transition"] == "gt" From 128cd4771e87f28d25cb1cde4b9273e9a11bfcca Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 11:37:08 -0700 Subject: [PATCH 17/30] implement condition-specific priors on growth param --- CLAUDE.md | 15 +- src/tfscreen/tfmodel/configuration_io.py | 163 +++++++++++++++- .../generative/components/growth/linear.py | 63 ++++-- .../generative/components/growth/power.py | 70 +++++-- .../components/growth/saturation.py | 53 ++++- .../tfmodel/scripts/prefit_calibration_cli.py | 183 ++++++++++++++++-- .../test_prefit_calibration_smoke.py | 143 ++++++++++++++ .../components/growth/test_linear.py | 83 ++++++++ .../components/growth/test_power.py | 76 ++++++++ .../components/growth/test_saturation.py | 75 +++++++ .../tfmodel/scripts/test_configure_and_run.py | 53 +++++ .../scripts/test_prefit_calibration_cli.py | 170 +++++++++++++++- .../tfmodel/test_configuration_io_helpers.py | 166 ++++++++++++++++ 13 files changed, 1245 insertions(+), 68 deletions(-) create mode 100644 tests/smoke-tests/test_prefit_calibration_smoke.py diff --git a/CLAUDE.md b/CLAUDE.md index 3e93950b..03ae2dad 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -115,7 +115,7 @@ The hierarchical Bayesian inference engine. Key files: - **`generative/components/`** — Pluggable model components selected via the YAML config's `components:` section (registry key noted in parens where it differs from the directory name): - `activity/`: `fixed`, `hierarchical_geno`, `hierarchical_mut`, `horseshoe_geno`, `horseshoe_mut` - - `growth/` (registry key `condition_growth`): `linear`, `power`, `saturation` + - `growth/` (registry key `condition_growth`): `linear`, `power`, `saturation`. Their per-condition prior loc/scale fields accept a scalar (broadcast to all conditions) **or** a per-condition array; the pre-fit calibration writes per-condition arrays to pin the baselines (see **Per-condition growth priors** below). Each declares `get_scale_bounds()`. - `growth_transition/`: `instant`, `memory`, `baranyi`, `baranyi_k`, `baranyi_tau`, `two_pop` - `transformation/`: `empirical`, `logit_norm`, `single` - `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) @@ -134,9 +134,22 @@ The hierarchical Bayesian inference engine. Key files: 2. Implement the required interface (follow an existing component as reference) 3. Register it in `tfmodel/generative/registry.py` under the appropriate category key 4. Add a test in `tests/tfscreen/tfmodel/components//` +5. For a new `condition_growth` component: make its per-condition prior loc/scale fields accept scalar-or-array (broadcast-then-index by the condition plate) and implement `get_scale_bounds()` so the pre-fit can pin its per-condition baselines — see **Per-condition growth priors** above. (This applies to `components/` categories. `generative/observe/` is not a `/` registry entry — see above.) +### Per-condition growth priors + +The `condition_growth` components (`linear`/`power`/`saturation`) carry a per-condition **additive baseline** (`k` for linear/power, `min` for saturation) that is only jointly identified with the shared per-genotype `dk_geno`: the growth likelihood `g = k_condition + dk_geno + A·m·θ` is invariant to `k += C, dk_geno −= C`. With only weak/rare anchors (wt's pinned `dk_geno=0`, `base_growth`) the whole system slides by a global constant `C`, inflating all condition baselines and `k_ref` and making genotypes with constrained `dk_geno` (notably wt) badly mis-fit their `ln_cfu`. The fix is to pin each condition baseline with a per-condition prior — a prior on the 4 baseline params acts at full strength, unlike the abundance-diluted genotype anchors. + +Mechanism, spanning three files: + +- **Components** (`generative/components/growth/*.py`): `ModelPriors` loc/scale fields accept a scalar (broadcast, the default/back-compat) or a length-`num_condition_rep` array; `define_model`/`guide` broadcast-then-index by the condition plate. Each component declares `get_scale_bounds() → {suffix: {floor, ceiling, scale_field}}`, giving the pre-fit per-parameter scale floors (tight for the baseline term, looser for e.g. `power`'s log-exponent `n`). +- **CSV (de)serialization** (`configuration_io.py`): the priors CSV supports per-condition **indexed rows** (`flat_index` + `condition_rep`/`replicate` label columns) alongside scalar rows. On load, indexed rows are **name-joined** to the model's `map_condition_rep` order (`_read_priors_flat`/`_assemble_condition_array`) and **fail fast** on an unknown or missing condition. A fresh `tfs-configure-model` still writes scalar rows (2-column CSV, legacy path). +- **Pre-fit** (`prefit_calibration_cli.py`): after the MAP calibration, `_build_csv_updates` writes each `condition_growth` site's per-condition MAP **loc** array into the priors CSV (the baseline pin), and `_build_hessian_scale_updates` writes a tight **scalar** scale (floored via `get_scale_bounds()`). `_apply_priors_updates` expands a scalar prior row into per-condition indexed rows tagged with `condition_rep`. `growth_transition` sites keep warm-start-only behavior. + +Net flow: `configure` (scalar) → `prefit` (per-condition `k_loc` indexed rows + tight scalar `k_scale`) → `fit` (loads per-condition priors that hold the baselines, closing the slide). This is the primary mechanism; the `base_growth_data`/`k_ref` anchor (below) is complementary but insufficient alone because `k_ref` is itself free to slide. + ### Key Abstractions **`TensorManager`** (`tfmodel/tensors/tensor_manager.py`): Handles ragged tensors. Genotypes have different numbers of observations; this class pads and indexes into JAX-compatible arrays. diff --git a/src/tfscreen/tfmodel/configuration_io.py b/src/tfscreen/tfmodel/configuration_io.py index 50fd0f56..678937ed 100644 --- a/src/tfscreen/tfmodel/configuration_io.py +++ b/src/tfscreen/tfmodel/configuration_io.py @@ -113,6 +113,135 @@ def _update_dataclass(dc, prefix, flat_dict): return dataclasses.replace(dc, **updates) return dc +def _extract_prior_arrays(obj, prefix=""): + """ + Recursively collect 1-D *floating-point* array leaves from a PriorsClass, + keyed by dotted path. + + Companion to :func:`_extract_scalars`, which emits only scalar leaves and + silently skips arrays. Per-condition priors (e.g. ``condition_growth``'s + ``k_loc`` after the pre-fit calibration writes per-condition values) live in + array leaves, so they need their own extraction to reach the priors CSV. + + Only floating arrays are returned: static config tuples such as + ``m_is_selection`` (a tuple of bools) must never be mistaken for a + per-condition prior. + """ + out = {} + for k in dir(obj): + if k.startswith("_") or k in ['replace', 'asdict', '__class__', + 'tree_flatten', 'tree_unflatten']: + continue + v = getattr(obj, k) + if hasattr(v, '__dataclass_fields__'): + out.update(_extract_prior_arrays(v, prefix + k + ".")) + elif isinstance(v, dict) or not hasattr(v, 'shape'): + # dicts (e.g. `pinned`) and non-array leaves (scalars, static + # tuples like m_is_selection) are not per-condition arrays. + continue + else: + try: + arr = np.asarray(v) + except (ValueError, TypeError): + continue + if arr.ndim >= 1 and arr.size > 0 and arr.dtype.kind == "f": + out[f"{prefix}{k}"] = arr + return out + + +def _assemble_condition_array(param, grp, cond_rep_map): + """ + Assemble one per-condition prior array from its indexed CSV rows. + + The rows are joined to the model's condition order by ``condition_rep`` + *name* (and ``replicate`` when present), not by raw integer index, so a + priors CSV stays correct even if conditions are reordered. Fails fast if + the CSV references an unknown condition or is missing any condition — a + stale priors file should error, not silently mis-map (see the fail-fast + config-validation convention). + + Falls back to ``flat_index`` ordering when no ``condition_rep`` map or + label columns are available (e.g. non-growth arrays). + """ + if cond_rep_map is None or getattr(cond_rep_map, "empty", True): + ordered = grp.sort_values("flat_index") if "flat_index" in grp else grp + return jnp.asarray(ordered["value"].to_numpy(dtype=float)) + + sorted_map = cond_rep_map.sort_values("map_condition_rep").reset_index(drop=True) + label_cols = [c for c in ("replicate", "condition_rep") + if c in sorted_map.columns and c in grp.columns] + + if not label_cols: + ordered = grp.sort_values("flat_index") if "flat_index" in grp else grp + arr = ordered["value"].to_numpy(dtype=float) + if len(arr) != len(sorted_map): + raise ValueError( + f"Prior '{param}' has {len(arr)} indexed row(s) in the priors " + f"CSV but the model has {len(sorted_map)} condition(s), and no " + f"condition_rep labels are present to join on. Regenerate the " + f"priors file with tfs-configure-model." + ) + return jnp.asarray(arr) + + key_to_pos = { + tuple(str(sorted_map.loc[i, c]) for c in label_cols): i + for i in range(len(sorted_map)) + } + + arr = np.full(len(sorted_map), np.nan, dtype=float) + for _, r in grp.iterrows(): + key = tuple(str(r[c]) for c in label_cols) + pos = key_to_pos.get(key) + if pos is None: + raise ValueError( + f"Prior '{param}' references condition {key} (columns " + f"{label_cols}) in the priors CSV, which is not one of the " + f"model's conditions {sorted(key_to_pos)}. The priors file is " + f"likely stale — regenerate it with tfs-configure-model." + ) + arr[pos] = float(r["value"]) + + missing = [k for k, i in key_to_pos.items() if np.isnan(arr[i])] + if missing: + raise ValueError( + f"Prior '{param}' is missing per-condition row(s) for {missing} in " + f"the priors CSV; every condition_rep must have a row. Regenerate " + f"with tfs-configure-model / tfs-prefit-calibration." + ) + return jnp.asarray(arr) + + +def _read_priors_flat(priors_df, cond_rep_map): + """ + Build the flat prior dict from a priors CSV. + + Scalar rows (no ``flat_index``, or ``flat_index`` NaN) are read as scalars + exactly as before. Rows carrying a ``flat_index`` are grouped by parameter + and assembled into per-condition arrays via + :func:`_assemble_condition_array`. A legacy 2-column CSV (no ``flat_index``) + takes the pure-scalar path untouched. + """ + def _coerce(v): + try: + return float(v) + except (ValueError, TypeError): + return v + + if "flat_index" not in priors_df.columns: + return {k: _coerce(v) + for k, v in zip(priors_df["parameter"], priors_df["value"])} + + scalar_mask = priors_df["flat_index"].isna() + flat = {row["parameter"]: _coerce(row["value"]) + for _, row in priors_df[scalar_mask].iterrows()} + + indexed = priors_df[~scalar_mask] + for param, grp in indexed.groupby("parameter", observed=True): + flat[param] = _assemble_condition_array(param, grp, cond_rep_map) + + return flat + + def write_configuration(orchestrator, out_prefix, growth_df_path=None, @@ -245,6 +374,28 @@ def write_configuration(orchestrator, guesses_list.append(df) + # Per-condition array priors (e.g. condition_growth k_loc/k_scale once the + # pre-fit calibration has written per-condition values). _extract_scalars + # skips array leaves, so emit them here as indexed rows tagged with + # condition_rep labels, mirroring the per-condition guesses rows. Restricted + # to the growth linking-function components so other components' internal + # arrays are untouched. On a fresh configure these fields are still scalar, + # so nothing is emitted here and the priors CSV stays 2-column (legacy). + for dotted_key, arr in _extract_prior_arrays(orchestrator.priors).items(): + if ("condition_growth" not in dotted_key + and "growth_transition" not in dotted_key): + continue + flat_val = np.asarray(arr).flatten() + df = pd.DataFrame({"parameter": dotted_key, + "value": flat_val, + "flat_index": range(len(flat_val))}) + if (not cond_rep_map.empty) and len(flat_val) == len(cond_rep_map): + sorted_map = cond_rep_map.sort_values("map_condition_rep").reset_index(drop=True) + for col in ("replicate", "condition_rep"): + if col in sorted_map.columns: + df[col] = sorted_map[col].values + priors_list.append(df) + if len(priors_list) > 0: final_priors = pd.concat(priors_list, ignore_index=True) final_priors.to_csv(priors_path, index=False) @@ -322,13 +473,11 @@ def read_configuration(config_file): raise FileNotFoundError(f"Priors file not found: {priors_path}") priors_df = pd.read_csv(priors_path) - flat_priors = {} - for k, v in zip(priors_df["parameter"], priors_df["value"]): - try: - flat_priors[k] = float(v) - except (ValueError, TypeError): - flat_priors[k] = v - + cond_rep_map = None + if orchestrator.growth_tm is not None: + cond_rep_map = orchestrator.growth_tm.map_groups.get("condition_rep") + flat_priors = _read_priors_flat(priors_df, cond_rep_map) + new_priors = _update_dataclass(orchestrator.priors, "", flat_priors) orchestrator._priors = new_priors diff --git a/src/tfscreen/tfmodel/generative/components/growth/linear.py b/src/tfscreen/tfmodel/generative/components/growth/linear.py index 944fb5b2..5c47d567 100644 --- a/src/tfscreen/tfmodel/generative/components/growth/linear.py +++ b/src/tfscreen/tfmodel/generative/components/growth/linear.py @@ -32,12 +32,17 @@ class ModelPriors: Attributes ---------- - k_loc : float + k_loc : float or array Mean of the Normal prior on the per-condition baseline growth rate k. - k_scale : float - Standard deviation of the Normal prior on k. - m_loc : float + May be a scalar (broadcast to every condition) or a length- + ``num_condition_rep`` array of per-condition locs (written by the + pre-fit calibration; see prefit_calibration_cli). + k_scale : float or array + Standard deviation of the Normal prior on k. Scalar or per-condition + array, mirroring ``k_loc``. + m_loc : float or array Mean of the Normal prior on the per-condition occupancy slope m. + Scalar or per-condition array. m_scale : float Standard deviation of the Normal prior on m (used for all conditions when ``m_is_selection`` is ``None``). @@ -141,17 +146,28 @@ def define_model(name: str, params : LinearParams A dataclass containing k_pre, m_pre, k_sel, and m_sel. """ + num_cr = data.num_condition_rep + if priors.m_is_selection is None: - m_scale_arr = jnp.full(data.num_condition_rep, priors.m_scale) + m_scale_arr = jnp.full(num_cr, priors.m_scale) else: m_scale_arr = jnp.array([ priors.m_scale_plus if sel else priors.m_scale_minus for sel in priors.m_is_selection ]) - with pyro.plate(f"{name}_condition_parameters", data.num_condition_rep) as idx: - growth_k = pyro.sample(f"{name}_k", dist.Normal(priors.k_loc, priors.k_scale)) - growth_m = pyro.sample(f"{name}_m", dist.Normal(priors.m_loc, m_scale_arr[idx])) + # Broadcast scalar-or-array priors to a per-condition array so k, m can be + # pinned condition-by-condition (see prefit calibration). A scalar prior + # broadcasts to every condition, preserving the previous behaviour. + k_loc_arr = jnp.broadcast_to(jnp.asarray(priors.k_loc, dtype=float), (num_cr,)) + k_scale_arr = jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)) + m_loc_arr = jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,)) + + with pyro.plate(f"{name}_condition_parameters", num_cr) as idx: + growth_k = pyro.sample(f"{name}_k", + dist.Normal(k_loc_arr[idx], k_scale_arr[idx])) + growth_m = pyro.sample(f"{name}_m", + dist.Normal(m_loc_arr[idx], m_scale_arr[idx])) k_pre = growth_k[data.map_condition_pre] m_pre = growth_m[data.map_condition_pre] @@ -169,15 +185,16 @@ def guide(name: str, Maintains per-condition variational parameters for k and m. """ + num_cr = data.num_condition_rep k_locs = pyro.param(f"{name}_k_locs", - jnp.full(data.num_condition_rep, priors.k_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.k_loc, dtype=float), (num_cr,))) k_scales = pyro.param(f"{name}_k_scales", - jnp.full(data.num_condition_rep, priors.k_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) m_locs = pyro.param(f"{name}_m_locs", - jnp.full(data.num_condition_rep, priors.m_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,))) m_scales = pyro.param(f"{name}_m_scales", - jnp.full(data.num_condition_rep, priors.m_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.m_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) with pyro.plate(f"{name}_condition_parameters", data.num_condition_rep) as idx: @@ -370,6 +387,28 @@ def get_priors(condition_labels: Optional[List[str]] = None, return ModelPriors(**hypers) +def get_scale_bounds(): + """ + Per-condition prior-scale bounds for the pre-fit calibration. + + Maps each per-condition sample-site suffix (the ``{param}`` in the + ``{name}_{param}`` site name) to the floor/ceiling applied to its + Hessian-derived prior scale, and the ``ModelPriors`` field the scalar + fallback is written to. ``k`` (the theta-independent baseline that trades + off against ``dk_geno``) gets a tight floor so calibration can pin it hard; + ``m`` inherits the selection-condition scale field. + + Returns + ------- + dict + ``{suffix: {"floor": float, "ceiling": float, "scale_field": str}}``. + """ + return { + "k": {"floor": 0.002, "ceiling": 0.1, "scale_field": "k_scale"}, + "m": {"floor": 0.001, "ceiling": 0.01, "scale_field": "m_scale_plus"}, + } + + def get_extract_specs(ctx): if "condition_rep" not in ctx.growth_tm.map_groups: return [] diff --git a/src/tfscreen/tfmodel/generative/components/growth/power.py b/src/tfscreen/tfmodel/generative/components/growth/power.py index 8eb3e57b..7bb3b9ec 100644 --- a/src/tfscreen/tfmodel/generative/components/growth/power.py +++ b/src/tfscreen/tfmodel/generative/components/growth/power.py @@ -29,13 +29,17 @@ class ModelPriors: Attributes ---------- - k_loc, k_scale : float + k_loc, k_scale : float or array Normal prior parameters for per-condition baseline growth rate k. - m_loc, m_scale : float + Scalar (broadcast to every condition) or a length-``num_condition_rep`` + array of per-condition values (written by the pre-fit calibration). + m_loc, m_scale : float or array Normal prior parameters for per-condition occupancy slope m. - n_loc, n_scale : float + Scalar or per-condition array. + n_loc, n_scale : float or array Normal prior parameters for log(n), the power-law exponent. The actual exponent n = exp(sample), so n > 0 always. + Scalar or per-condition array. """ k_loc: float k_scale: float @@ -68,14 +72,29 @@ def define_model(name: str, params : PowerParams A dataclass containing k, m, and n for pre and sel. """ - with pyro.plate(f"{name}_k_condition_parameters", data.num_condition_rep): - k_per_condition = pyro.sample(f"{name}_k", dist.Normal(priors.k_loc, priors.k_scale)) + num_cr = data.num_condition_rep + + # Broadcast scalar-or-array priors to per-condition arrays so each + # parameter can be pinned condition-by-condition (see prefit calibration). + # A scalar prior broadcasts to every condition (previous behaviour). + k_loc_arr = jnp.broadcast_to(jnp.asarray(priors.k_loc, dtype=float), (num_cr,)) + k_scale_arr = jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)) + m_loc_arr = jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,)) + m_scale_arr = jnp.broadcast_to(jnp.asarray(priors.m_scale, dtype=float), (num_cr,)) + n_loc_arr = jnp.broadcast_to(jnp.asarray(priors.n_loc, dtype=float), (num_cr,)) + n_scale_arr = jnp.broadcast_to(jnp.asarray(priors.n_scale, dtype=float), (num_cr,)) + + with pyro.plate(f"{name}_k_condition_parameters", num_cr) as idx: + k_per_condition = pyro.sample(f"{name}_k", + dist.Normal(k_loc_arr[idx], k_scale_arr[idx])) - with pyro.plate(f"{name}_m_condition_parameters", data.num_condition_rep): - m_per_condition = pyro.sample(f"{name}_m", dist.Normal(priors.m_loc, priors.m_scale)) + with pyro.plate(f"{name}_m_condition_parameters", num_cr) as idx: + m_per_condition = pyro.sample(f"{name}_m", + dist.Normal(m_loc_arr[idx], m_scale_arr[idx])) - with pyro.plate(f"{name}_n_condition_parameters", data.num_condition_rep): - ln_n = pyro.sample(f"{name}_n", dist.Normal(priors.n_loc, priors.n_scale)) + with pyro.plate(f"{name}_n_condition_parameters", num_cr) as idx: + ln_n = pyro.sample(f"{name}_n", + dist.Normal(n_loc_arr[idx], n_scale_arr[idx])) n_per_condition = jnp.exp(ln_n) k_pre = k_per_condition[data.map_condition_pre] @@ -96,20 +115,21 @@ def guide(name: str, """ Guide for the power growth model with simple Normal priors. """ + num_cr = data.num_condition_rep k_locs = pyro.param(f"{name}_k_locs", - jnp.full(data.num_condition_rep, priors.k_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.k_loc, dtype=float), (num_cr,))) k_scales = pyro.param(f"{name}_k_scales", - jnp.full(data.num_condition_rep, priors.k_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) m_locs = pyro.param(f"{name}_m_locs", - jnp.full(data.num_condition_rep, priors.m_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,))) m_scales = pyro.param(f"{name}_m_scales", - jnp.full(data.num_condition_rep, priors.m_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.m_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) n_locs = pyro.param(f"{name}_n_locs", - jnp.full(data.num_condition_rep, priors.n_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.n_loc, dtype=float), (num_cr,))) n_scales = pyro.param(f"{name}_n_scales", - jnp.full(data.num_condition_rep, priors.n_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.n_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) with pyro.plate(f"{name}_k_condition_parameters", data.num_condition_rep) as idx: @@ -188,6 +208,26 @@ def get_priors(): return ModelPriors(**get_hyperparameters()) +def get_scale_bounds(): + """ + Per-condition prior-scale bounds for the pre-fit calibration. + + See ``linear.get_scale_bounds`` for the contract. ``k`` is the + theta-independent baseline (tight floor); ``n`` is a log-space exponent, + so its bounds are looser than the rate parameters. + + Returns + ------- + dict + ``{suffix: {"floor": float, "ceiling": float, "scale_field": str}}``. + """ + return { + "k": {"floor": 0.002, "ceiling": 0.1, "scale_field": "k_scale"}, + "m": {"floor": 0.001, "ceiling": 0.01, "scale_field": "m_scale"}, + "n": {"floor": 0.05, "ceiling": 0.5, "scale_field": "n_scale"}, + } + + def get_extract_specs(ctx): if "condition_rep" not in ctx.growth_tm.map_groups: return [] diff --git a/src/tfscreen/tfmodel/generative/components/growth/saturation.py b/src/tfscreen/tfmodel/generative/components/growth/saturation.py index 393cade4..65290c5c 100644 --- a/src/tfscreen/tfmodel/generative/components/growth/saturation.py +++ b/src/tfscreen/tfmodel/generative/components/growth/saturation.py @@ -27,10 +27,13 @@ class ModelPriors: Attributes ---------- - min_loc, min_scale : float + min_loc, min_scale : float or array Normal prior parameters for per-condition minimum growth rate. - max_loc, max_scale : float + Scalar (broadcast to every condition) or a length-``num_condition_rep`` + array of per-condition values (written by the pre-fit calibration). + max_loc, max_scale : float or array Normal prior parameters for per-condition maximum growth rate. + Scalar or per-condition array. """ min_loc: float min_scale: float @@ -58,13 +61,23 @@ def define_model(name: str, params : SaturationParams A dataclass containing min and max for pre and sel. """ - with pyro.plate(f"{name}_min_condition_parameters", data.num_condition_rep): + num_cr = data.num_condition_rep + + # Broadcast scalar-or-array priors to per-condition arrays so min, max can + # be pinned condition-by-condition (see prefit calibration). A scalar + # prior broadcasts to every condition (previous behaviour). + min_loc_arr = jnp.broadcast_to(jnp.asarray(priors.min_loc, dtype=float), (num_cr,)) + min_scale_arr = jnp.broadcast_to(jnp.asarray(priors.min_scale, dtype=float), (num_cr,)) + max_loc_arr = jnp.broadcast_to(jnp.asarray(priors.max_loc, dtype=float), (num_cr,)) + max_scale_arr = jnp.broadcast_to(jnp.asarray(priors.max_scale, dtype=float), (num_cr,)) + + with pyro.plate(f"{name}_min_condition_parameters", num_cr) as idx: min_per_condition = pyro.sample(f"{name}_min", - dist.Normal(priors.min_loc, priors.min_scale)) + dist.Normal(min_loc_arr[idx], min_scale_arr[idx])) - with pyro.plate(f"{name}_max_condition_parameters", data.num_condition_rep): + with pyro.plate(f"{name}_max_condition_parameters", num_cr) as idx: max_per_condition = pyro.sample(f"{name}_max", - dist.Normal(priors.max_loc, priors.max_scale)) + dist.Normal(max_loc_arr[idx], max_scale_arr[idx])) min_pre = min_per_condition[data.map_condition_pre] max_pre = max_per_condition[data.map_condition_pre] @@ -81,15 +94,16 @@ def guide(name: str, """ Guide for the saturation growth model with simple Normal priors. """ + num_cr = data.num_condition_rep min_locs = pyro.param(f"{name}_min_locs", - jnp.full(data.num_condition_rep, priors.min_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.min_loc, dtype=float), (num_cr,))) min_scales = pyro.param(f"{name}_min_scales", - jnp.full(data.num_condition_rep, priors.min_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.min_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) max_locs = pyro.param(f"{name}_max_locs", - jnp.full(data.num_condition_rep, priors.max_loc, dtype=float)) + jnp.broadcast_to(jnp.asarray(priors.max_loc, dtype=float), (num_cr,))) max_scales = pyro.param(f"{name}_max_scales", - jnp.full(data.num_condition_rep, priors.max_scale, dtype=float), + jnp.broadcast_to(jnp.asarray(priors.max_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) with pyro.plate(f"{name}_min_condition_parameters", data.num_condition_rep) as idx: @@ -156,6 +170,25 @@ def get_priors(): return ModelPriors(**get_hyperparameters()) +def get_scale_bounds(): + """ + Per-condition prior-scale bounds for the pre-fit calibration. + + See ``linear.get_scale_bounds`` for the contract. ``min`` is the + theta-independent baseline that trades off against ``dk_geno`` (tight + floor); ``max`` is a rate too and gets the same bounds. + + Returns + ------- + dict + ``{suffix: {"floor": float, "ceiling": float, "scale_field": str}}``. + """ + return { + "min": {"floor": 0.002, "ceiling": 0.1, "scale_field": "min_scale"}, + "max": {"floor": 0.002, "ceiling": 0.1, "scale_field": "max_scale"}, + } + + def get_extract_specs(ctx): if "condition_rep" not in ctx.growth_tm.map_groups: return [] diff --git a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py index c901bab3..18e5ae2d 100644 --- a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py +++ b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py @@ -66,6 +66,7 @@ from tfscreen.tfmodel.configuration_io import ( read_configuration, ) +from tfscreen.tfmodel.generative.registry import model_registry # --------------------------------------------------------------------------- @@ -558,10 +559,14 @@ def _build_csv_updates(field_mapping, params): Returns ------- - prior_updates : dict[str, float] + prior_updates : dict[str, float | np.ndarray] ``{csv_row_name → new_value}`` for the priors CSV. - Scalar Normal/HalfNormal sites write the MAP value to their - ``loc_field`` / ``scale_field`` respectively. + Scalar Normal/HalfNormal sites write the MAP value (a float) to their + ``loc_field`` / ``scale_field`` respectively. Per-condition + ``condition_growth`` array sites write the full MAP array to their + ``loc_field`` — this is the per-condition baseline *pin* that closes + the k/dk_geno additive slide. ``_apply_priors_updates`` expands array + values into indexed rows keyed by ``condition_rep``. guess_updates : dict[str, np.ndarray | float] ``{site_name → MAP value}`` for the guesses CSV. Array sites write per-condition MAP arrays (keyed as @@ -583,10 +588,17 @@ def _build_csv_updates(field_mapping, params): is_array = info.get("is_array", False) if is_array: - # Simple-prior per-condition array site: write MAP array to guesses - # so the production SVI starts from the calibration fit. + # Simple-prior per-condition array site: write the MAP array to + # guesses so the production SVI starts from the calibration fit. if loc_field is not None: guess_updates[f"{site_name}_locs"] = map_val_arr + # For condition_growth, also pin the per-condition prior LOC. + # A warm start alone leaves the baselines free to slide back + # down the k/dk_geno flat direction; the per-condition prior + # loc is what actually holds them. (growth_transition keeps + # its warm-start-only behaviour.) + if component == "condition_growth": + prior_updates[_csv_row_name(component, loc_field)] = map_val_arr else: # Scalar site (legacy hierarchical components). if map_val_arr.shape != (): @@ -610,13 +622,23 @@ def _build_csv_updates(field_mapping, params): def _build_hessian_scale_updates(field_mapping, hessian_results, k_scale_floor, m_scale_floor, - k_scale_ceiling, m_scale_ceiling): + k_scale_ceiling, m_scale_ceiling, + scale_bounds=None): """ Build per-condition scale updates from Hessian-derived sigmas with floors and ceilings. - For each array condition_growth site (``k`` and ``m``) that appears in - both ``field_mapping`` and ``hessian_results``, the per-element Hessian + When ``scale_bounds`` is given (a ``{suffix: {floor, ceiling, + scale_field}}`` map from the growth component's ``get_scale_bounds()``), + every per-condition site the component declares is handled generically — + so ``power``'s ``n`` and ``saturation``'s ``min``/``max`` get tight scales + the same way ``linear``'s ``k`` does, without hard-coding parameter names + here. When ``scale_bounds`` is ``None`` the legacy ``k``/``m`` hard-code + is used (the ``k_scale_floor``/``m_scale_floor``/ceiling args), preserving + older callers. + + For each array condition_growth site that appears in both + ``field_mapping`` and ``hessian_results``, the per-element Hessian sigma is clipped to ``[floor, ceiling]`` and returned in two dicts: * **guess_updates** — per-condition sigma arrays keyed as @@ -684,7 +706,18 @@ def _build_hessian_scale_updates(field_mapping, hessian_results, scale_field = info.get("scale_field") component = info["component"] - if loc_field == "k_loc": + if scale_bounds is not None: + # Generic path: look up the per-condition site by its suffix + # (the "{param}" in loc_field="{param}_loc") in the component's + # declared scale bounds. + suffix = loc_field[:-len("_loc")] if loc_field.endswith("_loc") else loc_field + spec = scale_bounds.get(suffix) + if spec is None: + continue + floor = spec["floor"] + ceiling = spec["ceiling"] + prior_field = spec["scale_field"] + elif loc_field == "k_loc": floor = k_scale_floor ceiling = k_scale_ceiling prior_field = scale_field # "k_scale" @@ -712,13 +745,87 @@ def _build_hessian_scale_updates(field_mapping, hessian_results, return guess_updates, prior_updates -def _apply_priors_updates(priors_path, prior_updates): +def _resolve_scale_bounds(condition_growth_choice, + k_scale_floor, m_scale_floor, + k_scale_ceiling, m_scale_ceiling): + """ + Build the per-suffix scale-bounds map for the active condition_growth + component, applying the CLI floor/ceiling arguments as backward-compatible + overrides for the ``k`` and ``m`` suffixes. + + Returns ``{}`` when the component declares no ``get_scale_bounds`` (in + which case the caller falls back to the legacy k/m hard-code path). + """ + module = model_registry["condition_growth"].get(condition_growth_choice) + get_bounds = getattr(module, "get_scale_bounds", None) + if get_bounds is None: + return {} + + bounds = {suffix: dict(spec) for suffix, spec in get_bounds().items()} + + cli_overrides = { + "k": (k_scale_floor, k_scale_ceiling), + "m": (m_scale_floor, m_scale_ceiling), + } + for suffix, (floor, ceiling) in cli_overrides.items(): + if suffix not in bounds: + continue + if floor is not None: + bounds[suffix]["floor"] = floor + if ceiling is not None: + bounds[suffix]["ceiling"] = ceiling + + return bounds + + +def _condition_rep_labels(orchestrator): """ - Overwrite ``parameter == row_name`` rows of the production priors - CSV with the new values. Writes a ``.bak`` copy first. Rows whose - ``parameter`` is not present in ``prior_updates`` are preserved - unchanged. Logs a warning for any update key that has no matching - row. + Per-condition label frame (``condition_rep`` and, when present, + ``replicate``) ordered by ``map_condition_rep`` — i.e. the same order as + the per-condition MAP arrays. Returns ``None`` when no condition_rep map + is available. Used to tag per-condition prior rows so the loader can + name-join them back to the production condition order. + """ + growth_tm = getattr(orchestrator, "growth_tm", None) + if growth_tm is None: + return None + crm = growth_tm.map_groups.get("condition_rep") + if crm is None or getattr(crm, "empty", True): + return None + sorted_map = crm.sort_values("map_condition_rep").reset_index(drop=True) + cols = [c for c in ("replicate", "condition_rep") if c in sorted_map.columns] + if not cols: + return None + return sorted_map[cols].reset_index(drop=True) + + +def _apply_priors_updates(priors_path, prior_updates, cond_rep_labels=None): + """ + Apply prior updates to the production priors CSV. Writes a ``.bak`` copy + first. Rows whose ``parameter`` is not in ``prior_updates`` are preserved. + + Two kinds of update value are supported: + + * **scalar** (float) — overwrites the ``value`` of the matching + ``parameter`` row in place (unchanged behaviour). A warning is logged + if no row matches. + * **array** (1-D ``np.ndarray``) — a per-condition prior (e.g. + ``condition_growth.k_loc``). Any existing rows for that parameter are + dropped and replaced with one indexed row per condition, tagged with the + ``condition_rep`` (and ``replicate``) labels from ``cond_rep_labels`` so + the loader can name-join them back to the model's condition order. + + Parameters + ---------- + priors_path : str + Path to the production priors CSV. + prior_updates : dict[str, float | np.ndarray] + Update values keyed by dotted parameter name. + cond_rep_labels : pandas.DataFrame or None + Per-condition label columns (``condition_rep`` and, when present, + ``replicate``) ordered by ``map_condition_rep`` — i.e. matching the + order of the per-condition MAP arrays. Required to label array + updates; when absent, array rows carry only ``flat_index``. """ if not prior_updates: return @@ -729,14 +836,25 @@ def _apply_priors_updates(priors_path, prior_updates): "'value' columns." ) - matched = set() + scalar_updates = {} + array_updates = {} for row_name, new_val in prior_updates.items(): + arr = np.asarray(new_val) + if arr.ndim == 0: + scalar_updates[row_name] = float(arr) + else: + array_updates[row_name] = arr + + matched = set() + + # Scalar overwrites (in place). + for row_name, new_val in scalar_updates.items(): mask = df["parameter"] == row_name if mask.any(): df.loc[mask, "value"] = new_val matched.add(row_name) - missing = sorted(set(prior_updates) - matched) + missing = sorted(set(scalar_updates) - matched) if missing: print( f" warning: {len(missing)} prior update(s) had no matching row " @@ -744,6 +862,24 @@ def _apply_priors_updates(priors_path, prior_updates): file=sys.stderr, ) + # Array updates: drop existing rows for the parameter, append indexed rows. + if array_updates: + new_frames = [] + for row_name, arr in array_updates.items(): + flat_val = np.asarray(arr).flatten() + df = df[df["parameter"] != row_name] + row_df = pd.DataFrame({"parameter": row_name, + "value": flat_val, + "flat_index": range(len(flat_val))}) + if (cond_rep_labels is not None + and len(cond_rep_labels) == len(flat_val)): + for col in ("replicate", "condition_rep"): + if col in cond_rep_labels.columns: + row_df[col] = cond_rep_labels[col].to_numpy() + new_frames.append(row_df) + matched.add(row_name) + df = pd.concat([df] + new_frames, ignore_index=True) + shutil.copy2(priors_path, priors_path + ".bak") df.to_csv(priors_path, index=False) print(f"Updated {len(matched)} priors row(s) in {priors_path}") @@ -1099,15 +1235,26 @@ def run_prefit_calibration(config_file, ) prior_updates, guess_updates = _build_csv_updates(field_mapping, params) + # Per-suffix scale bounds declared by the active condition_growth component + # (generalises the old k/m hard-code to n / min / max), with the CLI + # floor/ceiling args applied as overrides for backward compatibility. + scale_bounds = _resolve_scale_bounds( + orchestrator_prod.settings.get("condition_growth"), + k_scale_floor, m_scale_floor, k_scale_ceiling, m_scale_ceiling, + ) hessian_guess_updates, hessian_prior_updates = _build_hessian_scale_updates( field_mapping, hessian_results, k_scale_floor, m_scale_floor, k_scale_ceiling, m_scale_ceiling, + scale_bounds=(scale_bounds or None), ) guess_updates.update(hessian_guess_updates) prior_updates.update(hessian_prior_updates) - _apply_priors_updates(priors_path, prior_updates) + # Labels ordered as the per-condition MAP arrays, so the per-condition + # prior loc rows can be name-joined back to the production condition order. + cond_rep_labels = _condition_rep_labels(orchestrator_cal) + _apply_priors_updates(priors_path, prior_updates, cond_rep_labels=cond_rep_labels) _apply_guesses_updates(guesses_path, guess_updates) return svi_state, params, converged diff --git a/tests/smoke-tests/test_prefit_calibration_smoke.py b/tests/smoke-tests/test_prefit_calibration_smoke.py new file mode 100644 index 00000000..67f25471 --- /dev/null +++ b/tests/smoke-tests/test_prefit_calibration_smoke.py @@ -0,0 +1,143 @@ +""" +Smoke tests for tfs-prefit-calibration writing per-condition growth priors. + +These run a genuine (tiny) configure -> prefit for each condition_growth +component and assert that the pre-fit rewrites the baseline term's prior as +per-condition *indexed* rows (labeled by condition_rep) which then load back +as a per-condition array. This is the end-to-end check that the generic +per-condition-prior path works uniformly across linear / power / saturation +(not just the linear component it was first built for). +""" + +import os + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.tfmodel.scripts.configure_model_cli import configure_model +from tfscreen.tfmodel.scripts.prefit_calibration_cli import run_prefit_calibration +from tfscreen.tfmodel.scripts.fit_model_cli import fit_model +from tfscreen.tfmodel.configuration_io import read_configuration + + +def _write_inputs(tmpdir): + """Two genotypes x three conditions x two titrant concs x two timepoints.""" + genotypes = ["wt", "A123B"] + conc = [0.1, 1.0] + # condition_pre is a control ('-'); two distinct selection ('+') conditions + # give three distinct condition_reps: C1-, C2+, C3+. + sel_conditions = ["C2+", "C3+"] + + rows = [] + for g in genotypes: + for cs in sel_conditions: + for c in conc: + for t_sel in [0.0, 10.0]: + rows.append({ + "library": "lib", + "replicate": "R1", + "condition_pre": "C1-", + "condition_sel": cs, + "genotype": g, + "t_sel": t_sel, + "t_pre": 12.0, + # mild genotype/condition-dependent slope so the MAP has signal + "ln_cfu": 1.0 + 0.05 * t_sel + (0.2 if g == "A123B" else 0.0), + "ln_cfu_std": 0.1, + "titrant_name": "T1", + "titrant_conc": c, + }) + growth_df = pd.DataFrame(rows) + + binding_df = pd.DataFrame({ + "genotype": ["wt", "wt", "A123B", "A123B"], + "titrant_name": ["T1"] * 4, + "titrant_conc": [0.1, 1.0, 0.1, 1.0], + "theta_obs": [0.8, 0.3, 0.7, 0.2], + "theta_std": [0.05, 0.05, 0.05, 0.05], + }) + + growth_path = os.path.join(tmpdir, "growth.csv") + binding_path = os.path.join(tmpdir, "binding.csv") + growth_df.to_csv(growth_path, index=False) + binding_df.to_csv(binding_path, index=False) + return growth_path, binding_path + + +@pytest.mark.slow +@pytest.mark.parametrize("cg_model,baseline_loc", [ + ("linear", "k_loc"), + ("power", "k_loc"), + ("saturation", "min_loc"), +]) +def test_prefit_writes_per_condition_baseline_prior(tmpdir, cg_model, baseline_loc): + growth_path, binding_path = _write_inputs(tmpdir) + out_prefix = os.path.join(tmpdir, f"tfs_{cg_model}") + + configure_model(binding_path, + growth_df=growth_path, + condition_growth_model=cg_model, + theta_model="categorical_geno", + out_prefix=out_prefix) + + config_file = f"{out_prefix}_config.yaml" + priors_file = f"{out_prefix}_priors.csv" + + # Before the prefit the baseline prior is a single scalar row. + pre = pd.read_csv(priors_file) + baseline_param = f"growth.condition_growth.{baseline_loc}" + assert (pre["parameter"] == baseline_param).sum() == 1 + assert "flat_index" not in pre.columns or pre["flat_index"].isna().all() + + run_prefit_calibration(config_file=config_file, + seed=1, + max_num_epochs=3, + convergence_check_interval=1, + patience=1, + hessian_chunk_size=8) + + # After the prefit the baseline prior is per-condition indexed rows. + post = pd.read_csv(priors_file) + base_rows = post[post["parameter"] == baseline_param] + assert len(base_rows) >= 2, "baseline prior should be expanded per condition" + assert base_rows["flat_index"].notna().all() + assert "condition_rep" in post.columns + assert base_rows["condition_rep"].notna().all() + # One row per distinct condition + assert base_rows["condition_rep"].nunique() == len(base_rows) + + # And it loads back as a per-condition array on the ModelPriors. + orch, _ = read_configuration(config_file) + cg = orch.priors.growth.condition_growth + loaded = np.asarray(getattr(cg, baseline_loc)) + assert loaded.shape == (len(base_rows),) + + +@pytest.mark.slow +def test_configure_prefit_fit_full_loop_with_per_condition_priors(tmpdir): + """The full configure -> prefit -> fit loop runs once the priors CSV holds + per-condition (array) baseline priors — i.e. the SVI actually consumes + them without a tracing/shape error.""" + growth_path, binding_path = _write_inputs(tmpdir) + out_prefix = os.path.join(tmpdir, "tfs_full") + + configure_model(binding_path, + growth_df=growth_path, + condition_growth_model="linear", + theta_model="categorical_geno", + out_prefix=out_prefix) + config_file = f"{out_prefix}_config.yaml" + + run_prefit_calibration(config_file=config_file, seed=1, + max_num_epochs=3, convergence_check_interval=1, + patience=1, hessian_chunk_size=8) + + # Sanity: the priors CSV now carries per-condition k_loc rows. + post = pd.read_csv(f"{out_prefix}_priors.csv") + assert (post["parameter"] == "growth.condition_growth.k_loc").sum() >= 2 + + fit_out = os.path.join(tmpdir, "tfs_full_fit") + fit_model(config_file=config_file, seed=42, max_num_epochs=1, + out_prefix=fit_out) + assert os.path.exists(f"{fit_out}_checkpoint.pkl") diff --git a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py index 9bf98df8..875b779e 100644 --- a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py +++ b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py @@ -11,10 +11,24 @@ get_hyperparameters, get_guesses, get_priors, + get_scale_bounds, _parse_condition_label, LinearParams, ) + +def _site_loc(site): + """Drill to the innermost Normal .loc, unwrapping plate/expand wrappers.""" + fn = site["fn"] + for _ in range(5): + if hasattr(fn, "loc"): + return np.asarray(fn.loc) + if hasattr(fn, "base_dist"): + fn = fn.base_dist + else: + break + raise AssertionError("could not find .loc on site distribution") + # --- Mock Data Fixtures --- MockGrowthData = namedtuple("MockGrowthData", [ @@ -550,3 +564,72 @@ def test_model_guide_compatible_with_labels(self): } guide_samples = {n for n, s in guide_trace.items() if s["type"] == "sample"} assert model_samples == guide_samples + + +# --------------------------------------------------------------------------- +# Phase 1: per-condition (array) priors on k / m +# --------------------------------------------------------------------------- + +class TestPerConditionPriors: + + def test_scalar_prior_broadcasts(self, mock_data): + """A scalar k_loc broadcasts to every condition (legacy behaviour).""" + name = "sc" + priors = get_priors() # scalar k_loc = 0.020 + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + loc = _site_loc(tr[f"{name}_k"]) + assert loc.shape == (mock_data.num_condition_rep,) + assert np.allclose(loc, 0.020) + + def test_array_k_loc_is_per_condition(self, mock_data): + """A per-condition k_loc array flows through to the k sample site.""" + name = "arr" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(k_loc=per_cond, k_scale=jnp.full(3, 0.002)) + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + loc = _site_loc(tr[f"{name}_k"]) + assert np.allclose(loc, np.array([0.011, 0.021, 0.029])) + + def test_array_prior_initializes_guide_params(self, mock_data): + """The guide's k_locs param initialises from a per-condition array prior.""" + name = "gp" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(k_loc=per_cond) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + k_locs = np.asarray(gtr[f"{name}_k_locs"]["value"]) + assert np.allclose(k_locs, np.array([0.011, 0.021, 0.029])) + + def test_array_and_scalar_give_same_sites(self, mock_data): + """Model/guide site sets are identical whether priors are scalar or array.""" + name = "ss" + priors = get_priors().replace(k_loc=jnp.array([0.011, 0.021, 0.029])) + with seed(rng_seed=0): + mtr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + model_samples = { + n for n, s in mtr.items() + if s["type"] == "sample" and not s.get("is_observed", False) + } + guide_samples = {n for n, s in gtr.items() if s["type"] == "sample"} + assert model_samples == guide_samples + + +class TestGetScaleBounds: + + def test_structure(self): + bounds = get_scale_bounds() + assert set(bounds) == {"k", "m"} + for suffix, spec in bounds.items(): + assert set(spec) == {"floor", "ceiling", "scale_field"} + assert spec["floor"] < spec["ceiling"] + + def test_baseline_floor_tight(self): + """The baseline term k must get a tight floor to be pinnable.""" + bounds = get_scale_bounds() + assert bounds["k"]["floor"] <= 0.002 + assert bounds["k"]["scale_field"] == "k_scale" + assert bounds["m"]["scale_field"] == "m_scale_plus" diff --git a/tests/tfscreen/tfmodel/generative/components/growth/test_power.py b/tests/tfscreen/tfmodel/generative/components/growth/test_power.py index 1614d9a4..1552869b 100644 --- a/tests/tfscreen/tfmodel/generative/components/growth/test_power.py +++ b/tests/tfscreen/tfmodel/generative/components/growth/test_power.py @@ -1,4 +1,5 @@ import pytest +import numpy as np import jax.numpy as jnp from numpyro.handlers import trace, substitute, seed from collections import namedtuple @@ -10,9 +11,23 @@ get_hyperparameters, get_guesses, get_priors, + get_scale_bounds, PowerParams, ) + +def _site_loc(site): + """Drill to the innermost Normal .loc, unwrapping plate/expand wrappers.""" + fn = site["fn"] + for _ in range(5): + if hasattr(fn, "loc"): + return np.asarray(fn.loc) + if hasattr(fn, "base_dist"): + fn = fn.base_dist + else: + break + raise AssertionError("could not find .loc on site distribution") + MockGrowthData = namedtuple("MockGrowthData", [ "num_condition_rep", "num_replicate", @@ -129,3 +144,64 @@ def test_model_and_guide_have_compatible_sample_sites(mock_data): m_samples = {k for k, v in m_tr.items() if v["type"] == "sample"} g_samples = {k for k, v in g_tr.items() if v["type"] == "sample"} assert m_samples == g_samples + + +# --------------------------------------------------------------------------- +# Phase 1: per-condition (array) priors on k / m / n +# --------------------------------------------------------------------------- + +class TestPerConditionPriors: + + def test_scalar_prior_broadcasts(self, mock_data): + name = "sc" + priors = get_priors() + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + loc = _site_loc(tr[f"{name}_k"]) + assert loc.shape == (mock_data.num_condition_rep,) + assert np.allclose(loc, 0.020) + + def test_array_k_loc_is_per_condition(self, mock_data): + name = "arr" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(k_loc=per_cond, k_scale=jnp.full(3, 0.002)) + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + assert np.allclose(_site_loc(tr[f"{name}_k"]), np.array([0.011, 0.021, 0.029])) + + def test_array_prior_initializes_guide_params(self, mock_data): + name = "gp" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(k_loc=per_cond) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + assert np.allclose(np.asarray(gtr[f"{name}_k_locs"]["value"]), + np.array([0.011, 0.021, 0.029])) + + def test_array_and_scalar_give_same_sites(self, mock_data): + name = "ss" + priors = get_priors().replace(k_loc=jnp.array([0.011, 0.021, 0.029])) + with seed(rng_seed=0): + mtr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + m_samples = {n for n, s in mtr.items() + if s["type"] == "sample" and not s.get("is_observed", False)} + g_samples = {n for n, s in gtr.items() if s["type"] == "sample"} + assert m_samples == g_samples + + +class TestGetScaleBounds: + + def test_structure(self): + bounds = get_scale_bounds() + assert set(bounds) == {"k", "m", "n"} + for spec in bounds.values(): + assert set(spec) == {"floor", "ceiling", "scale_field"} + assert spec["floor"] < spec["ceiling"] + + def test_baseline_floor_tight(self): + bounds = get_scale_bounds() + assert bounds["k"]["floor"] <= 0.002 + assert bounds["k"]["scale_field"] == "k_scale" + assert bounds["n"]["scale_field"] == "n_scale" diff --git a/tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py b/tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py index 2d6b7a2b..4216d7a8 100644 --- a/tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py +++ b/tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py @@ -1,4 +1,5 @@ import pytest +import numpy as np import jax.numpy as jnp from numpyro.handlers import trace, substitute, seed from collections import namedtuple @@ -10,9 +11,23 @@ get_hyperparameters, get_guesses, get_priors, + get_scale_bounds, SaturationParams, ) + +def _site_loc(site): + """Drill to the innermost Normal .loc, unwrapping plate/expand wrappers.""" + fn = site["fn"] + for _ in range(5): + if hasattr(fn, "loc"): + return np.asarray(fn.loc) + if hasattr(fn, "base_dist"): + fn = fn.base_dist + else: + break + raise AssertionError("could not find .loc on site distribution") + MockGrowthData = namedtuple("MockGrowthData", [ "num_condition_rep", "num_replicate", @@ -128,3 +143,63 @@ def test_model_and_guide_have_compatible_sample_sites(mock_data): m_samples = {k for k, v in m_tr.items() if v["type"] == "sample"} g_samples = {k for k, v in g_tr.items() if v["type"] == "sample"} assert m_samples == g_samples + + +# --------------------------------------------------------------------------- +# Phase 1: per-condition (array) priors on min / max +# --------------------------------------------------------------------------- + +class TestPerConditionPriors: + + def test_scalar_prior_broadcasts(self, mock_data): + name = "sc" + priors = get_priors() + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + loc = _site_loc(tr[f"{name}_min"]) + assert loc.shape == (mock_data.num_condition_rep,) + assert np.allclose(loc, 0.020) + + def test_array_min_loc_is_per_condition(self, mock_data): + name = "arr" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(min_loc=per_cond, min_scale=jnp.full(3, 0.002)) + with seed(rng_seed=0): + tr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + assert np.allclose(_site_loc(tr[f"{name}_min"]), np.array([0.011, 0.021, 0.029])) + + def test_array_prior_initializes_guide_params(self, mock_data): + name = "gp" + per_cond = jnp.array([0.011, 0.021, 0.029]) + priors = get_priors().replace(min_loc=per_cond) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + assert np.allclose(np.asarray(gtr[f"{name}_min_locs"]["value"]), + np.array([0.011, 0.021, 0.029])) + + def test_array_and_scalar_give_same_sites(self, mock_data): + name = "ss" + priors = get_priors().replace(min_loc=jnp.array([0.011, 0.021, 0.029])) + with seed(rng_seed=0): + mtr = trace(define_model).get_trace(name=name, data=mock_data, priors=priors) + with seed(rng_seed=0): + gtr = trace(guide).get_trace(name=name, data=mock_data, priors=priors) + m_samples = {n for n, s in mtr.items() + if s["type"] == "sample" and not s.get("is_observed", False)} + g_samples = {n for n, s in gtr.items() if s["type"] == "sample"} + assert m_samples == g_samples + + +class TestGetScaleBounds: + + def test_structure(self): + bounds = get_scale_bounds() + assert set(bounds) == {"min", "max"} + for spec in bounds.values(): + assert set(spec) == {"floor", "ceiling", "scale_field"} + assert spec["floor"] < spec["ceiling"] + + def test_baseline_floor_tight(self): + bounds = get_scale_bounds() + assert bounds["min"]["floor"] <= 0.002 + assert bounds["min"]["scale_field"] == "min_scale" diff --git a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py index de089d0c..0e0cf852 100644 --- a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py +++ b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py @@ -198,6 +198,59 @@ def test_read_configuration_logic(tmpdir, mocker): assert isinstance(init_params["param2"], jnp.ndarray) +def test_read_configuration_assembles_per_condition_priors(tmpdir, mocker): + """Indexed prior rows are name-joined to the model's condition order, + independent of CSV row/flat_index order (Phase 2).""" + config_path = os.path.join(tmpdir, "config.yaml") + priors_path = os.path.join(tmpdir, "priors.csv") + guesses_path = os.path.join(tmpdir, "guesses.csv") + + config = { + "data": {"growth": "g.csv", "binding": "b.csv"}, + "components": {"batch_size": 256}, + "priors_file": "priors.csv", + "guesses_file": "guesses.csv", + } + with open(config_path, "w") as f: + yaml.dump(config, f) + + # Indexed rows in a deliberately shuffled order. + pd.DataFrame({ + "parameter": ["growth.condition_growth.k_loc"] * 3, + "value": [0.029, 0.011, 0.021], + "flat_index": [2, 0, 1], + "condition_rep": ["pheS+4CP", "kanR+kan", "kanR-kan"], + }).to_csv(priors_path, index=False) + pd.DataFrame({"parameter": ["param1"], "value": [0.5], + "flat_index": [0]}).to_csv(guesses_path, index=False) + + mock_orchestrator_class = mocker.patch( + "tfscreen.tfmodel.configuration_io.ModelOrchestrator") + inst = mock_orchestrator_class.return_value + inst.init_params = {"param1": 0.0} + inst.growth_tm.map_groups = { + "condition_rep": pd.DataFrame({ + "map_condition_rep": [0, 1, 2], + "condition_rep": ["kanR+kan", "kanR-kan", "pheS+4CP"], + }) + } + + captured = {} + + def _capture(dc, prefix, flat): + captured["flat"] = flat + return MagicMock() + + mocker.patch("tfscreen.tfmodel.configuration_io._update_dataclass", + side_effect=_capture) + + read_configuration(config_path) + + arr = np.asarray(captured["flat"]["growth.condition_growth.k_loc"]) + # map order is [kanR+kan, kanR-kan, pheS+4CP] -> [0.011, 0.021, 0.029] + assert np.allclose(arr, [0.011, 0.021, 0.029]) + + def test_read_configuration_passes_base_growth_df_path(tmpdir, mocker): """data.base_growth must reach ModelOrchestrator as base_growth_df, and any stray 'base_growth_df' left in components (round-tripped via diff --git a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py index c7070e79..f2dc8ec6 100644 --- a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py @@ -39,6 +39,8 @@ _inject_calibration_priors, _intersect_data, _resolve_csv_paths, + _resolve_scale_bounds, + _condition_rep_labels, main, run_prefit_calibration, _CALIBRATION_OVERRIDES, @@ -568,8 +570,9 @@ def test_skips_sites_without_auto_loc_in_params(self): assert prior_updates == {} assert guess_updates == {} - def test_array_site_writes_locs_to_guesses(self): - """Simple-prior array sites write per-condition MAP values to guesses.""" + def test_array_site_writes_locs_to_guesses_and_priors(self): + """condition_growth array sites warm-start guesses AND pin the + per-condition prior loc (the baseline pin that closes the slide).""" field_mapping = { "condition_growth_k": { "component": "condition_growth", @@ -581,12 +584,30 @@ def test_array_site_writes_locs_to_guesses(self): } params = {"condition_growth_k_auto_loc": np.array([1.0, 2.0, 3.0])} prior_updates, guess_updates = _build_csv_updates(field_mapping, params) - # Array sites do NOT update priors - assert prior_updates == {} - # Guess locs get the per-condition MAP array + # Guess locs get the per-condition MAP array (warm start) assert "condition_growth_k_locs" in guess_updates assert np.allclose(guess_updates["condition_growth_k_locs"], [1.0, 2.0, 3.0]) + # Priors get the per-condition loc array (the pin) + assert "growth.condition_growth.k_loc" in prior_updates + assert np.allclose(prior_updates["growth.condition_growth.k_loc"], + [1.0, 2.0, 3.0]) + + def test_growth_transition_array_site_does_not_pin_priors(self): + """growth_transition array sites keep warm-start-only behaviour.""" + field_mapping = { + "growth_transition_tau0": { + "component": "growth_transition", + "dist_class": "Normal", + "loc_field": "tau0_loc", + "scale_field": "tau0_scale", + "is_array": True, + }, + } + params = {"growth_transition_tau0_auto_loc": np.array([1.0, 2.0, 3.0])} + prior_updates, guess_updates = _build_csv_updates(field_mapping, params) + assert "growth_transition_tau0_locs" in guess_updates + assert prior_updates == {} # --------------------------------------------------------------------------- @@ -645,6 +666,47 @@ def test_raises_on_malformed_csv(self, tmp_path): with pytest.raises(ValueError, match="missing required"): _apply_priors_updates(str(bad), {"x": 1.0}) + def test_array_update_expands_to_labeled_indexed_rows(self, tmp_path): + """A per-condition array prior replaces the scalar row with one + indexed, condition_rep-labeled row per condition.""" + path = self._write_csv(tmp_path, [ + {"parameter": "growth.condition_growth.k_loc", "value": 0.02}, + {"parameter": "growth.condition_growth.k_scale", "value": 0.1}, + ]) + labels = pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR-kan", "pheS+4CP"], + }) + updates = {"growth.condition_growth.k_loc": np.array([0.011, 0.021, 0.029])} + _apply_priors_updates(path, updates, cond_rep_labels=labels) + + new = pd.read_csv(path) + k_rows = new[new["parameter"] == "growth.condition_growth.k_loc"] + # One row per condition, replacing the single scalar row + assert len(k_rows) == 3 + assert "flat_index" in k_rows.columns + assert "condition_rep" in k_rows.columns + by_cond = dict(zip(k_rows["condition_rep"], k_rows["value"])) + assert by_cond["kanR+kan"] == pytest.approx(0.011) + assert by_cond["pheS+4CP"] == pytest.approx(0.029) + # A scalar row alongside is preserved + assert (new["parameter"] == "growth.condition_growth.k_scale").sum() == 1 + + def test_array_and_scalar_updates_together(self, tmp_path): + path = self._write_csv(tmp_path, [ + {"parameter": "growth.condition_growth.k_loc", "value": 0.02}, + {"parameter": "growth.condition_growth.k_scale", "value": 0.1}, + ]) + labels = pd.DataFrame({"condition_rep": ["a+x", "b-y"]}) + updates = { + "growth.condition_growth.k_loc": np.array([0.011, 0.021]), + "growth.condition_growth.k_scale": 0.002, + } + _apply_priors_updates(path, updates, cond_rep_labels=labels) + new = pd.read_csv(path).set_index("parameter") + assert new.loc["growth.condition_growth.k_scale", "value"] == pytest.approx(0.002) + assert (pd.read_csv(path)["parameter"] + == "growth.condition_growth.k_loc").sum() == 2 + class TestApplyGuessesUpdates: @@ -1637,6 +1699,104 @@ def test_default_ceilings_match_linear_defaults(self): assert _DEFAULT_M_SCALE_CEILING == pytest.approx(h["m_scale_plus"]) +class TestBuildHessianScaleBoundsPath: + """The generic scale_bounds path generalises beyond hard-coded k/m.""" + + def _fm(self, sites): + out = {} + for site_name, loc_field in sites: + suffix = loc_field.replace("_loc", "") + out[site_name] = { + "component": "condition_growth", + "dist_class": "Normal", + "loc_field": loc_field, + "scale_field": f"{suffix}_scale", + "is_array": True, + } + return out + + def _hr(self, site_name, sigmas): + return {site_name: {"map": np.zeros_like(sigmas), "sigma": np.array(sigmas)}} + + def test_saturation_min_baseline_gets_tight_scale(self): + """saturation 'min' (the baseline) is handled via bounds, not the + k/m hard-code, and floored tight.""" + fm = self._fm([("condition_growth_min", "min_loc")]) + hr = self._hr("condition_growth_min", [1e-5, 1e-5]) + bounds = {"min": {"floor": 0.002, "ceiling": 0.1, "scale_field": "min_scale"}} + g, p = _build_hessian_scale_updates( + fm, hr, 0.002, 0.001, 0.1, 0.01, scale_bounds=bounds) + assert np.all(g["condition_growth_min_scales"] == pytest.approx(0.002)) + assert p["growth.condition_growth.min_scale"] == pytest.approx(0.002) + + def test_power_n_uses_its_own_scale_field(self): + fm = self._fm([("condition_growth_n", "n_loc")]) + hr = self._hr("condition_growth_n", [0.2, 0.3]) + bounds = {"n": {"floor": 0.05, "ceiling": 0.5, "scale_field": "n_scale"}} + g, p = _build_hessian_scale_updates( + fm, hr, 0.002, 0.001, 0.1, 0.01, scale_bounds=bounds) + assert "growth.condition_growth.n_scale" in p + + def test_suffix_absent_from_bounds_skipped(self): + fm = self._fm([("condition_growth_k", "k_loc")]) + hr = self._hr("condition_growth_k", [0.01]) + g, p = _build_hessian_scale_updates( + fm, hr, 0.002, 0.001, 0.1, 0.01, scale_bounds={"m": {}}) + assert g == {} and p == {} + + def test_linear_m_scale_field_from_bounds(self): + """With bounds, m routes to its declared scale_field (m_scale_plus).""" + fm = self._fm([("condition_growth_m", "m_loc")]) + hr = self._hr("condition_growth_m", [0.02, 0.03]) + bounds = {"m": {"floor": 0.001, "ceiling": 0.01, "scale_field": "m_scale_plus"}} + _, p = _build_hessian_scale_updates( + fm, hr, 0.002, 0.001, 0.1, 0.01, scale_bounds=bounds) + assert "growth.condition_growth.m_scale_plus" in p + + +class TestResolveScaleBounds: + + def test_linear_bounds_have_k_and_m(self): + bounds = _resolve_scale_bounds("linear", 0.002, 0.001, 0.1, 0.01) + assert set(bounds) == {"k", "m"} + assert bounds["k"]["scale_field"] == "k_scale" + assert bounds["m"]["scale_field"] == "m_scale_plus" + + def test_saturation_bounds_have_min_max(self): + bounds = _resolve_scale_bounds("saturation", 0.002, 0.001, 0.1, 0.01) + assert set(bounds) == {"min", "max"} + + def test_cli_floor_overrides_component_floor(self): + bounds = _resolve_scale_bounds("linear", 0.005, 0.001, 0.1, 0.01) + assert bounds["k"]["floor"] == pytest.approx(0.005) + + def test_unknown_component_returns_empty(self): + assert _resolve_scale_bounds("does_not_exist", 0.002, 0.001, 0.1, 0.01) == {} + + +class TestConditionRepLabels: + + def test_labels_ordered_by_map_condition_rep(self): + class _TM: + map_groups = { + "condition_rep": pd.DataFrame({ + "map_condition_rep": [2, 0, 1], + "condition_rep": ["pheS+4CP", "kanR+kan", "kanR-kan"], + }) + } + + class _Orch: + growth_tm = _TM() + + labels = _condition_rep_labels(_Orch()) + assert list(labels["condition_rep"]) == ["kanR+kan", "kanR-kan", "pheS+4CP"] + + def test_none_when_no_growth_tm(self): + class _Orch: + growth_tm = None + assert _condition_rep_labels(_Orch()) is None + + # --------------------------------------------------------------------------- # main() CLI plumbing # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/test_configuration_io_helpers.py b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py index b72625fd..9848c373 100644 --- a/tests/tfscreen/tfmodel/test_configuration_io_helpers.py +++ b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py @@ -9,12 +9,44 @@ import numpy as np import pytest +import pandas as pd +import jax.numpy as jnp + from tfscreen.tfmodel.configuration_io import ( _extract_scalars, _gather_dict_field, + _extract_prior_arrays, + _assemble_condition_array, + _read_priors_flat, ) +# Minimal dataclasses mirroring the growth.condition_growth prior nesting so +# _extract_prior_arrays produces the real dotted keys the loader expects. +@dataclasses.dataclass +class _CondGrowthPriors: + k_loc: object = dataclasses.field(default_factory=lambda: np.array([0.011, 0.021, 0.029])) + k_scale: float = 0.1 + m_is_selection: tuple = (True, False, True) # static bool tuple: must be ignored + + +@dataclasses.dataclass +class _GrowthPriors: + condition_growth: _CondGrowthPriors = dataclasses.field(default_factory=_CondGrowthPriors) + + +@dataclasses.dataclass +class _RootPriors: + growth: _GrowthPriors = dataclasses.field(default_factory=_GrowthPriors) + + +def _cond_rep_map(): + return pd.DataFrame({ + "map_condition_rep": [0, 1, 2], + "condition_rep": ["kanR+kan", "kanR-kan", "pheS+4CP"], + }) + + # --------------------------------------------------------------------------- # Minimal dataclass helpers # --------------------------------------------------------------------------- @@ -191,3 +223,137 @@ def test_multiple_suffixes_collected(self): assert len(result) == 5 for i in range(5): assert result[f"k{i}"] == pytest.approx(float(i)) + + +# --------------------------------------------------------------------------- +# _extract_prior_arrays +# --------------------------------------------------------------------------- + +class TestExtractPriorArrays: + + def test_float_array_extracted_with_dotted_key(self): + out = _extract_prior_arrays(_RootPriors()) + assert "growth.condition_growth.k_loc" in out + assert np.allclose(out["growth.condition_growth.k_loc"], + [0.011, 0.021, 0.029]) + + def test_scalar_field_not_extracted(self): + out = _extract_prior_arrays(_RootPriors()) + assert "growth.condition_growth.k_scale" not in out + + def test_bool_tuple_not_extracted(self): + """Static config tuples (m_is_selection) must never look like a prior.""" + out = _extract_prior_arrays(_RootPriors()) + assert "growth.condition_growth.m_is_selection" not in out + + +# --------------------------------------------------------------------------- +# _assemble_condition_array — name-join + fail-fast +# --------------------------------------------------------------------------- + +class TestAssembleConditionArray: + + def _grp(self, rows): + return pd.DataFrame(rows) + + def test_name_join_orders_by_map_not_row_order(self): + # Rows deliberately shuffled; flat_index does NOT match map order. + grp = self._grp([ + {"value": 0.029, "flat_index": 0, "condition_rep": "pheS+4CP"}, + {"value": 0.011, "flat_index": 1, "condition_rep": "kanR+kan"}, + {"value": 0.021, "flat_index": 2, "condition_rep": "kanR-kan"}, + ]) + arr = _assemble_condition_array("k_loc", grp, _cond_rep_map()) + assert np.allclose(arr, [0.011, 0.021, 0.029]) + + def test_unknown_condition_raises(self): + grp = self._grp([ + {"value": 0.011, "flat_index": 0, "condition_rep": "kanR+kan"}, + {"value": 0.021, "flat_index": 1, "condition_rep": "kanR-kan"}, + {"value": 0.029, "flat_index": 2, "condition_rep": "MYSTERY"}, + ]) + with pytest.raises(ValueError, match="not one of the model's conditions"): + _assemble_condition_array("k_loc", grp, _cond_rep_map()) + + def test_missing_condition_raises(self): + grp = self._grp([ + {"value": 0.011, "flat_index": 0, "condition_rep": "kanR+kan"}, + {"value": 0.021, "flat_index": 1, "condition_rep": "kanR-kan"}, + ]) + with pytest.raises(ValueError, match="missing per-condition"): + _assemble_condition_array("k_loc", grp, _cond_rep_map()) + + def test_fallback_to_flat_index_without_map(self): + grp = self._grp([ + {"value": 0.029, "flat_index": 2}, + {"value": 0.011, "flat_index": 0}, + {"value": 0.021, "flat_index": 1}, + ]) + arr = _assemble_condition_array("k_loc", grp, None) + assert np.allclose(arr, [0.011, 0.021, 0.029]) + + +# --------------------------------------------------------------------------- +# _read_priors_flat — scalar / mixed / legacy +# --------------------------------------------------------------------------- + +class TestReadPriorsFlat: + + def test_legacy_two_column_scalar_only(self): + df = pd.DataFrame({ + "parameter": ["growth.condition_growth.k_scale", "growth.x.y"], + "value": [0.1, 2.0], + }) + flat = _read_priors_flat(df, _cond_rep_map()) + assert flat["growth.condition_growth.k_scale"] == pytest.approx(0.1) + assert flat["growth.x.y"] == pytest.approx(2.0) + + def test_mixed_scalar_and_indexed(self): + df = pd.DataFrame([ + {"parameter": "growth.condition_growth.m_scale_plus", + "value": 0.01, "flat_index": np.nan, "condition_rep": np.nan}, + {"parameter": "growth.condition_growth.k_loc", + "value": 0.021, "flat_index": 1, "condition_rep": "kanR-kan"}, + {"parameter": "growth.condition_growth.k_loc", + "value": 0.011, "flat_index": 0, "condition_rep": "kanR+kan"}, + {"parameter": "growth.condition_growth.k_loc", + "value": 0.029, "flat_index": 2, "condition_rep": "pheS+4CP"}, + ]) + flat = _read_priors_flat(df, _cond_rep_map()) + assert flat["growth.condition_growth.m_scale_plus"] == pytest.approx(0.01) + assert np.allclose(np.asarray(flat["growth.condition_growth.k_loc"]), + [0.011, 0.021, 0.029]) + + def test_indexed_array_is_jax(self): + df = pd.DataFrame([ + {"parameter": "growth.condition_growth.k_loc", + "value": v, "flat_index": i, "condition_rep": c} + for i, (v, c) in enumerate([(0.011, "kanR+kan"), + (0.021, "kanR-kan"), + (0.029, "pheS+4CP")]) + ]) + flat = _read_priors_flat(df, _cond_rep_map()) + assert isinstance(flat["growth.condition_growth.k_loc"], jnp.ndarray) + + +# --------------------------------------------------------------------------- +# write→read round trip at the helper level (no orchestrator) +# --------------------------------------------------------------------------- + +class TestPriorArrayRoundTrip: + + def test_extract_then_read_preserves_array(self): + # Emulate write_configuration's per-condition prior emission. + arrays = _extract_prior_arrays(_RootPriors()) + key = "growth.condition_growth.k_loc" + arr = arrays[key] + cond_rep_map = _cond_rep_map() + sorted_map = cond_rep_map.sort_values("map_condition_rep").reset_index(drop=True) + df = pd.DataFrame({ + "parameter": key, + "value": np.asarray(arr).flatten(), + "flat_index": range(len(arr)), + "condition_rep": sorted_map["condition_rep"].values, + }) + flat = _read_priors_flat(df, cond_rep_map) + assert np.allclose(np.asarray(flat[key]), [0.011, 0.021, 0.029]) From 5893f82cee741bd144ec9939c955803bc6ae4fdf Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 12:26:14 -0700 Subject: [PATCH 18/30] clean up/bug fix in transformation_lambda --- examples/tfmodel/grid.yaml | 4 +-- src/tfscreen/tfmodel/model_orchestrator.py | 24 ++++++------- .../tfmodel/scripts/configure_model_cli.py | 16 ++++----- .../tfmodel/scripts/prefit_calibration_cli.py | 5 +++ .../tfmodel/analysis/test_prediction.py | 2 +- .../tfmodel/scripts/test_configure_and_run.py | 16 ++++----- .../scripts/test_prefit_calibration_cli.py | 35 +++++++++++++++++++ .../tfmodel/test_model_orchestrator.py | 32 ++++++++--------- 8 files changed, 87 insertions(+), 47 deletions(-) diff --git a/examples/tfmodel/grid.yaml b/examples/tfmodel/grid.yaml index e2789b64..b1cbe049 100644 --- a/examples/tfmodel/grid.yaml +++ b/examples/tfmodel/grid.yaml @@ -43,9 +43,9 @@ configure_model: transformation: empirical # (mean, std) of the experimentally measured congression lambda, in # linear space -- required whenever transformation is 'empirical' - # or 'logit_norm' (transformation and transform_lam always travel + # or 'logit_norm' (transformation and transformation_lambda always travel # together, hence the joint variant here). - transform_lam: [0.3572, 0.13] + transformation_lambda: [0.3572, 0.13] theta_rescale: passthrough # --- Auto: enumerate every registered component for an axis -------------- diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index b7b81f7b..848a6111 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -822,7 +822,7 @@ class ModelOrchestrator: transformation : str, optional Model name for transformation correction. Allowed values are 'single' (default), 'empirical', or 'logit_norm'. - transform_lam : tuple, optional + transformation_lambda : tuple, optional ``(mean, std)`` -- the experimentally measured congression lambda, in linear space -- used to anchor the ``transformation`` prior when it is 'empirical' or 'logit_norm'. Forbidden when @@ -873,7 +873,7 @@ def __init__(self, activity="horseshoe_geno", theta="hill_geno", transformation="single", - transform_lam=None, + transformation_lambda=None, theta_rescale="passthrough", theta_growth_noise="logit_normal", theta_binding_noise="zero", @@ -904,7 +904,7 @@ def __init__(self, self._activity = activity self._theta = theta self._transformation = transformation - self._transform_lam = transform_lam + self._transformation_lambda = transformation_lambda self._theta_rescale = theta_rescale self._theta_growth_noise = theta_growth_noise self._theta_binding_noise = theta_binding_noise @@ -932,15 +932,15 @@ def __init__(self, f"use it." ) - if self._transformation == "single" and self._transform_lam is not None: + if self._transformation == "single" and self._transformation_lambda is not None: raise ValueError( - "transform_lam was provided but transformation == 'single', " + "transformation_lambda was provided but transformation == 'single', " "which has no lambda parameter to anchor it to." ) - if self._transform_lam is not None and len(self._transform_lam) != 2: + if self._transformation_lambda is not None and len(self._transformation_lambda) != 2: raise ValueError( - f"transform_lam must be a (mean, std) pair; got " - f"{self._transform_lam!r}." + f"transformation_lambda must be a (mean, std) pair; got " + f"{self._transformation_lambda!r}." ) self._initialize_data() @@ -1607,7 +1607,7 @@ def _initialize_classes(self): component_module.get_priors(dk_geno_values=self._dk_geno_values) elif "lam_mean" in priors_sig.parameters: lam_mean, lam_std = ( - (None, None) if self._transform_lam is None else self._transform_lam + (None, None) if self._transformation_lambda is None else self._transformation_lambda ) priors_class_kwargs[prior_group][key] = \ component_module.get_priors(lam_mean=lam_mean, lam_std=lam_std) @@ -1620,8 +1620,8 @@ def _initialize_classes(self): guesses_kwargs = {"name": key, "data": component_data} if "presplit" in guesses_sig.parameters: guesses_kwargs["presplit"] = self._data.presplit - if "lam_mean" in guesses_sig.parameters and self._transform_lam is not None: - guesses_kwargs["lam_mean"] = self._transform_lam[0] + if "lam_mean" in guesses_sig.parameters and self._transformation_lambda is not None: + guesses_kwargs["lam_mean"] = self._transformation_lambda[0] guesses = component_module.get_guesses(**guesses_kwargs) init_params.update(guesses) @@ -1860,7 +1860,7 @@ def settings(self): "activity":self._activity, "theta":self._theta, "transformation":self._transformation, - "transform_lam":self._transform_lam, + "transformation_lambda":self._transformation_lambda, "theta_rescale":self._theta_rescale, "theta_growth_noise":self._theta_growth_noise, "theta_binding_noise":self._theta_binding_noise, diff --git a/src/tfscreen/tfmodel/scripts/configure_model_cli.py b/src/tfscreen/tfmodel/scripts/configure_model_cli.py index d5f07ff4..87004862 100644 --- a/src/tfscreen/tfmodel/scripts/configure_model_cli.py +++ b/src/tfscreen/tfmodel/scripts/configure_model_cli.py @@ -58,7 +58,7 @@ def configure_model(binding_df, activity_model="horseshoe_geno", theta_model="hill_geno", transformation_model="single", - transform_lam=None, + transformation_lambda=None, theta_rescale_model="passthrough", theta_growth_noise_model="zero", theta_binding_noise_model="zero", @@ -140,7 +140,7 @@ def configure_model(binding_df, transformation_model : str, optional Model for transformation correction. Allowed values are 'single' (default), 'empirical', or 'logit_norm'. - transform_lam : list or tuple, optional + transformation_lambda : list or tuple, optional ``(mean, std)`` -- the experimentally measured congression lambda, in linear space (e.g. ``(0.36, 0.05)``). Required when ``transformation_model`` is 'empirical' or 'logit_norm'; forbidden @@ -209,12 +209,12 @@ def configure_model(binding_df, if not binding_only: check_component_compatibility(condition_growth_model, theta_rescale_model) - if transformation_model != "single" and transform_lam is None: + if transformation_model != "single" and transformation_lambda is None: raise ValueError( f"transformation_model='{transformation_model}' requires " - f"transform_lam (mean, std) -- the experimentally measured " + f"transformation_lambda (mean, std) -- the experimentally measured " f"congression lambda in linear space, e.g. " - f"transform_lam=(0.36, 0.05)." + f"transformation_lambda=(0.36, 0.05)." ) # Initialize model to build mappings and get guesses @@ -230,7 +230,7 @@ def configure_model(binding_df, activity=activity_model, theta=theta_model, transformation=transformation_model, - transform_lam=transform_lam, + transformation_lambda=transformation_lambda, theta_rescale=theta_rescale_model, theta_growth_noise=theta_growth_noise_model, theta_binding_noise=theta_binding_noise_model, @@ -264,9 +264,9 @@ def main(): "thermo_data":str, "batch_size":int, "binding_weight":float, - "transform_lam":float}, + "transformation_lambda":float}, manual_arg_nargs={"spiked":"+", - "transform_lam":2}) + "transformation_lambda":2}) if __name__ == "__main__": main() diff --git a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py index 18e5ae2d..4c7b1fae 100644 --- a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py +++ b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py @@ -266,6 +266,11 @@ def _build_calibration_model(orchestrator_prod, growth_df_cal, binding_df_cal): settings = dict(orchestrator_prod.settings) for k, v in _CALIBRATION_OVERRIDES.items(): settings[k] = v + # transformation is forced to "single" above, which carries no lambda + # parameter; drop any production transformation_lambda (set when the production + # transformation is "empirical"/"logit_norm") so it doesn't get passed + # through to a "single" calibration model. + settings["transformation_lambda"] = None settings["spiked_genotypes"] = None # Equal weighting: the calibration MAP must learn the binding→growth # linkage from both data sources together. The production binding_weight diff --git a/tests/tfscreen/tfmodel/analysis/test_prediction.py b/tests/tfscreen/tfmodel/analysis/test_prediction.py index 615116f1..5458267b 100644 --- a/tests/tfscreen/tfmodel/analysis/test_prediction.py +++ b/tests/tfscreen/tfmodel/analysis/test_prediction.py @@ -45,7 +45,7 @@ def dummy_orchestrator(): # on NEEDS_FULL_POPULATION_THETA=True. return ModelOrchestrator( growth_df, binding_df, - transformation="empirical", transform_lam=(0.36, 0.05), + transformation="empirical", transformation_lambda=(0.36, 0.05), ) def test_copy_orchestrator_defaults(dummy_orchestrator): diff --git a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py index 0e0cf852..b61ca288 100644 --- a/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py +++ b/tests/tfscreen/tfmodel/scripts/test_configure_and_run.py @@ -113,11 +113,11 @@ def test_configure_model_passes_base_growth_df_to_orchestrator_and_config(mock_o assert written_config["data"]["base_growth"] == "bg.csv" -def test_configure_model_requires_transform_lam_for_empirical(mock_orchestrator, tmpdir): - """transformation_model='empirical' (or 'logit_norm') without transform_lam +def test_configure_model_requires_transformation_lambda_for_empirical(mock_orchestrator, tmpdir): + """transformation_model='empirical' (or 'logit_norm') without transformation_lambda must raise before ModelOrchestrator is even constructed.""" out_prefix = os.path.join(tmpdir, "test") - with pytest.raises(ValueError, match="transform_lam"): + with pytest.raises(ValueError, match="transformation_lambda"): configure_model( "b.csv", growth_df="g.csv", transformation_model="empirical", @@ -125,25 +125,25 @@ def test_configure_model_requires_transform_lam_for_empirical(mock_orchestrator, ) -def test_configure_model_allows_single_without_transform_lam(mock_orchestrator, tmpdir): - """transformation_model='single' (the default) never requires transform_lam.""" +def test_configure_model_allows_single_without_transformation_lambda(mock_orchestrator, tmpdir): + """transformation_model='single' (the default) never requires transformation_lambda.""" out_prefix = os.path.join(tmpdir, "test") configure_model("b.csv", growth_df="g.csv", out_prefix=out_prefix) assert os.path.exists(f"{out_prefix}_config.yaml") -def test_configure_model_forwards_transform_lam_to_orchestrator(mock_orchestrator, tmpdir): +def test_configure_model_forwards_transformation_lambda_to_orchestrator(mock_orchestrator, tmpdir): mock_orchestrator_class, mock_orchestrator_inst = mock_orchestrator out_prefix = os.path.join(tmpdir, "test") configure_model( "b.csv", growth_df="g.csv", transformation_model="empirical", - transform_lam=(0.3572, 0.13), + transformation_lambda=(0.3572, 0.13), out_prefix=out_prefix, ) - assert mock_orchestrator_class.call_args.kwargs["transform_lam"] == (0.3572, 0.13) + assert mock_orchestrator_class.call_args.kwargs["transformation_lambda"] == (0.3572, 0.13) assert mock_orchestrator_class.call_args.kwargs["transformation"] == "empirical" diff --git a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py index f2dc8ec6..d5205d3f 100644 --- a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py @@ -962,6 +962,41 @@ def test_dk_geno_pins_file_dropped_when_not_pinned(self): assert kwargs["dk_geno"] == "fixed" assert "dk_geno_pins_file" not in kwargs + def test_transformation_lambda_dropped_when_forced_to_single(self): + """ + Production transformation="empirical" carries a transformation_lambda + (mean, std) pair anchoring its lambda parameter. The calibration + model always overrides transformation to "single", which has no + lambda parameter -- ModelOrchestrator raises if transformation_lambda is + still set in that case, so it must be cleared here too. + """ + orchestrator_prod = MagicMock() + orchestrator_prod.settings = { + "theta": "categorical_geno", + "activity": "horseshoe_geno", + "dk_geno": "fixed", + "ln_cfu0": "fixed", + "transformation": "empirical", + "transformation_lambda": (0.3572, 0.2592), + "theta_growth_noise": "beta", + "theta_binding_noise": "beta", + "condition_growth": "linear", + "growth_transition": "instant", + "batch_size": None, + "spiked_genotypes": None, + } + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator" + ) as MockGM: + MockGM.return_value = MagicMock() + _build_calibration_model(orchestrator_prod, pd.DataFrame(), pd.DataFrame()) + + kwargs = MockGM.call_args.kwargs + assert kwargs["transformation"] == "single" + assert kwargs["transformation_lambda"] is None + def test_binding_weight_reset_from_large_production_value(self): # Reproduces the weighting bug: production YAML stores a large # binding_weight (N_growth / N_binding); the calibration model diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 1f7ab7e0..2ecaf966 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -649,26 +649,26 @@ def test_dk_geno_pinned_builds_values_and_wires_into_priors(mocker, tmp_path): # --------------------------------------------------------------------------- -# transform_lam wiring +# transformation_lambda wiring # --------------------------------------------------------------------------- -def test_transform_lam_forbidden_with_single_transformation(): - """transformation='single' has no lambda parameter to anchor transform_lam +def test_transformation_lambda_forbidden_with_single_transformation(): + """transformation='single' has no lambda parameter to anchor transformation_lambda to, so supplying it must raise before any data I/O happens.""" with pytest.raises(ValueError, match="transformation == 'single'"): ModelOrchestrator( "g.csv", "b.csv", transformation="single", - transform_lam=(0.36, 0.05), + transformation_lambda=(0.36, 0.05), ) -def test_transform_lam_wrong_length_raises(): +def test_transformation_lambda_wrong_length_raises(): with pytest.raises(ValueError, match="mean, std"): ModelOrchestrator( "g.csv", "b.csv", transformation="empirical", - transform_lam=(0.36,), + transformation_lambda=(0.36,), ) @@ -702,7 +702,7 @@ def __getattr__(self, name): return getattr(self._real_module, name) -def _build_orchestrator_with_transformation_spy(mocker, spy, transform_lam): +def _build_orchestrator_with_transformation_spy(mocker, spy, transformation_lambda): mock_growth_tm = create_mock_tm(is_growth=True) mock_binding_tm = create_mock_tm(is_growth=False) mocker.patch("tfscreen.tfmodel.model_orchestrator._read_growth_df") @@ -742,14 +742,14 @@ def _build_orchestrator_with_transformation_spy(mocker, spy, transform_lam): return ModelOrchestrator( "g.csv", "b.csv", theta="hill_geno", transformation="logit_norm", - transform_lam=transform_lam, + transformation_lambda=transformation_lambda, condition_growth="independent", growth_transition="instant", activity="hierarchical_geno", theta_growth_noise="zero", ) -def test_transform_lam_wired_into_component_priors_and_guesses(mocker): - """End-to-end: transform_lam=(mean, std) must reach the real component's +def test_transformation_lambda_wired_into_component_priors_and_guesses(mocker): + """End-to-end: transformation_lambda=(mean, std) must reach the real component's get_priors(lam_mean=..., lam_std=...) and get_guesses(..., lam_mean=...) via signature-based dispatch in _initialize_classes.""" from tfscreen.tfmodel.generative.components.transformation import logit_norm as real_logit_norm @@ -761,11 +761,11 @@ def test_transform_lam_wired_into_component_priors_and_guesses(mocker): assert spy.guesses_calls == [0.3572] # Round-trips through the settings dict for YAML config serialisation. - assert model.settings["transform_lam"] == (0.3572, 0.13) + assert model.settings["transformation_lambda"] == (0.3572, 0.13) -def test_transform_lam_omitted_falls_back_to_placeholder(mocker): - """Without transform_lam, the component still gets called (with +def test_transformation_lambda_omitted_falls_back_to_placeholder(mocker): + """Without transformation_lambda, the component still gets called (with lam_mean=lam_std=None) rather than being skipped -- it falls back to its own placeholder prior rather than ModelOrchestrator refusing to build the model.""" @@ -776,7 +776,7 @@ def test_transform_lam_omitted_falls_back_to_placeholder(mocker): assert spy.priors_calls == [(None, None)] assert spy.guesses_calls == [None] - assert model.settings["transform_lam"] is None + assert model.settings["transformation_lambda"] is None @pytest.mark.parametrize("transformation_key, expected_needs_population", [ @@ -914,7 +914,7 @@ def test_model_class_properties(initialized_model_class): model._activity = "a" model._theta = "t" model._transformation = "tr" - model._transform_lam = None + model._transformation_lambda = None model._theta_rescale = "rs" model._condition_growth = "cg" model._growth_transition = "gt" @@ -941,7 +941,7 @@ def test_model_class_properties(initialized_model_class): assert ModelOrchestrator.settings.fget(model)["activity"] == "a" assert ModelOrchestrator.settings.fget(model)["theta"] == "t" assert ModelOrchestrator.settings.fget(model)["transformation"] == "tr" - assert ModelOrchestrator.settings.fget(model)["transform_lam"] is None + assert ModelOrchestrator.settings.fget(model)["transformation_lambda"] is None assert ModelOrchestrator.settings.fget(model)["theta_rescale"] == "rs" assert ModelOrchestrator.settings.fget(model)["condition_growth"] == "cg" assert ModelOrchestrator.settings.fget(model)["growth_transition"] == "gt" From 22405db4eab1e97d2c18479ab1d0902a96cab5c7 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 13:01:05 -0700 Subject: [PATCH 19/30] moved priors out of model_orch into components --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 782 +++++++++--------- reports/junit/junit.xml | 2 +- src/tfscreen/tfmodel/data_class.py | 3 +- .../tfmodel/generative/observe/base_growth.py | 51 ++ .../tfmodel/generative/observe/growth.py | 19 +- src/tfscreen/tfmodel/model_orchestrator.py | 59 +- .../observe/test_observe_base_growth.py | 39 +- .../generative/observe/test_observe_growth.py | 26 +- .../tfmodel/test_model_orchestrator.py | 26 +- 11 files changed, 558 insertions(+), 453 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 0d114e2c..397f274e 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.49%coverage96.49% \ No newline at end of file +coverage: 96.43%coverage96.43% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 21e7d556..dd5e451a 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3841tests3841 \ No newline at end of file +tests: 3891tests3891 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index 0a47f677..3e2c66ab 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1508,31 +1508,30 @@ ./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 -./src/tfscreen/tfmodel/configuration_io.py:116:1: C901 'write_configuration' is too complex (32) ./src/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:198:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:201:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:203:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:204:40: E713 test for membership should be 'not in' -./src/tfscreen/tfmodel/configuration_io.py:210:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:211:31: E713 test for membership should be 'not in' -./src/tfscreen/tfmodel/configuration_io.py:217:18: W291 trailing whitespace -./src/tfscreen/tfmodel/configuration_io.py:233:33: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/configuration_io.py:245:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:259:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/configuration_io.py:259:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/configuration_io.py:261:1: C901 'read_configuration' is too complex (20) -./src/tfscreen/tfmodel/configuration_io.py:261:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:298:128: E501 line too long (139 > 127 characters) -./src/tfscreen/tfmodel/configuration_io.py:309:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:310:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:311:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:312:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:313:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:319:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:331:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:346:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:351:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:245:1: C901 'write_configuration' is too complex (37) +./src/tfscreen/tfmodel/configuration_io.py:327:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:330:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:332:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:333:40: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:339:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:340:31: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:346:18: W291 trailing whitespace +./src/tfscreen/tfmodel/configuration_io.py:362:33: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/configuration_io.py:374:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:410:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/configuration_io.py:410:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/configuration_io.py:412:1: C901 'read_configuration' is too complex (18) +./src/tfscreen/tfmodel/configuration_io.py:412:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/configuration_io.py:449:128: E501 line too long (139 > 127 characters) +./src/tfscreen/tfmodel/configuration_io.py:460:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:461:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:462:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:463:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:464:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:470:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:495:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:500:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) @@ -1540,9 +1539,9 @@ ./src/tfscreen/tfmodel/data_class.py:116:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/data_class.py:133:49: W291 trailing whitespace ./src/tfscreen/tfmodel/data_class.py:135:76: W291 trailing whitespace -./src/tfscreen/tfmodel/data_class.py:290:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/data_class.py:297:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/data_class.py:298:5: E266 too many leading '#' for block comment +./src/tfscreen/tfmodel/data_class.py:291:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/data_class.py:298:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/data_class.py:299:5: E266 too many leading '#' for block comment ./src/tfscreen/tfmodel/generative/components/__init__.py:3:4: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:8:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/activity/fixed.py:16:1: E302 expected 2 blank lines, found 1 @@ -1759,21 +1758,21 @@ ./src/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/growth/linear.py:92:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:237:40: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/generative/components/growth/linear.py:260:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:274:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:280:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:282:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:283:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:284:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:285:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:286:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:287:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:288:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:289:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:290:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:313:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:97:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:254:40: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/generative/components/growth/linear.py:277:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:291:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:297:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:299:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:300:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:301:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:302:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:303:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:304:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:305:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:306:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:307:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:330:12: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment @@ -3221,7 +3220,7 @@ ./src/tfscreen/tfmodel/generative/observe/growth.py:73:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/observe/growth.py:79:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/observe/growth.py:104:5: F841 local variable 'nu' is assigned to but never used -./src/tfscreen/tfmodel/generative/observe/growth.py:106:11: W292 no newline at end of file +./src/tfscreen/tfmodel/generative/observe/growth.py:123:52: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/registry.py:64:23: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:65:17: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/generative/registry.py:66:16: E231 missing whitespace after ':' @@ -3373,198 +3372,198 @@ ./src/tfscreen/tfmodel/inference/run_inference.py:1362:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/inference/run_inference.py:1366:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/inference/run_inference.py:1372:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:40:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/model_orchestrator.py:74:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:77:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:81:25: E222 multiple spaces after operator -./src/tfscreen/tfmodel/model_orchestrator.py:81:37: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:81:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:82:42: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:86:65: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:86:88: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:106:30: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:106:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:106:55: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:106:63: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:107:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:121:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:125:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:126:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:128:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/model_orchestrator.py:211:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:38:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/model_orchestrator.py:72:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:75:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:79:25: E222 multiple spaces after operator +./src/tfscreen/tfmodel/model_orchestrator.py:79:37: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:79:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:80:42: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:84:65: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:84:88: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:104:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:104:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:104:55: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:104:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:105:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:119:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:123:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:124:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:126:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:209:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:212:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:212:73: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/model_orchestrator.py:214:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:214:73: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:216:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:217:61: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:218:61: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:219:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:220:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:222:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:223:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:224:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:225:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:228:63: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:229:73: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:230:73: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:240:63: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:245:42: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:245:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:245:68: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:246:29: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:247:40: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:248:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:248:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:248:72: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:289:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:298:33: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:298:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:299:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:302:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:308:27: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:337:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/model_orchestrator.py:369:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:370:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:371:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:373:23: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:374:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:375:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:379:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:458:12: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:543:66: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:694:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:697:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:702:52: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:703:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:710:30: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:714:38: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:810:82: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:815:87: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:818:84: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:950:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) -./src/tfscreen/tfmodel/model_orchestrator.py:950:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:975:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:976:28: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:978:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:979:35: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:979:48: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:979:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:980:46: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:980:66: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:981:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:985:39: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:986:34: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:991:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:998:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1000:10: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:1000:10: E116 unexpected indentation (comment) -./src/tfscreen/tfmodel/model_orchestrator.py:1002:76: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1005:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1007:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1009:49: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1021:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1029:57: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1051:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1052:41: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1052:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1053:44: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1053:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1054:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1054:58: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1055:46: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1055:71: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1057:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1064:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1084:39: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1084:45: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1084:53: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1091:40: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1137:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1138:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1139:26: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1140:32: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1180:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1183:78: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1184:32: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1185:60: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1189:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1190:36: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1191:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1192:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1194:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1205:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1205:62: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1208:74: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1209:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1214:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1215:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1216:58: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1218:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1223:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1227:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1231:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1234:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1240:86: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1242:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1249:77: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1310:57: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1319:25: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1329:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1330:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1331:35: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1332:38: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1333:39: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1340:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1341:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1342:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1418:25: E221 multiple spaces before operator -./src/tfscreen/tfmodel/model_orchestrator.py:1419:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1421:31: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/model_orchestrator.py:1494:5: C901 'ModelOrchestrator._initialize_classes' is too complex (25) -./src/tfscreen/tfmodel/model_orchestrator.py:1514:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1516:67: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1517:71: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1519:68: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1520:77: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1521:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1522:40: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1539:42: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1540:43: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1541:40: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1541:43: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1541:53: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1541:56: E231 missing whitespace after ',' -./src/tfscreen/tfmodel/model_orchestrator.py:1541:64: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1630:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1633:69: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1654:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1656:9: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1738:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1743:5: E303 too many blank lines (2) -./src/tfscreen/tfmodel/model_orchestrator.py:1757:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1767:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1777:75: W291 trailing whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1791:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1794:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1823:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1835:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1847:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/model_orchestrator.py:1853:25: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1854:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1855:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1856:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1857:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1858:22: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1859:32: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1860:23: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1861:20: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1862:29: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1863:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1864:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1865:33: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1866:34: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1867:27: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1868:28: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/model_orchestrator.py:1869:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:215:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:216:61: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:217:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:218:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:220:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:221:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:222:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:223:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:226:63: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:227:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:228:73: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:238:63: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:243:42: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:243:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:243:68: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:244:29: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:245:40: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:246:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:246:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:246:72: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:287:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:296:33: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:296:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:297:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:300:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:306:27: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:335:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/model_orchestrator.py:367:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:368:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:369:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:371:23: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:372:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:373:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:377:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:456:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:530:66: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:657:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:660:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:665:52: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:666:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:673:30: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:677:38: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:773:82: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:778:87: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:781:84: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:913:5: C901 'ModelOrchestrator._initialize_data' is too complex (19) +./src/tfscreen/tfmodel/model_orchestrator.py:913:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:938:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:939:28: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:941:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:942:35: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:942:48: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:942:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:943:46: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:943:66: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:944:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:948:39: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:949:34: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:954:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:961:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:963:10: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:963:10: E116 unexpected indentation (comment) +./src/tfscreen/tfmodel/model_orchestrator.py:965:76: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:968:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:970:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:972:49: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:984:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:992:57: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1014:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1015:41: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1015:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1016:44: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1016:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1017:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1017:58: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1018:46: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1018:71: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1020:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1027:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1047:39: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1047:45: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1047:53: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1054:40: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1100:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1101:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1102:26: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1103:32: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1143:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1146:78: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1147:32: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1148:60: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1152:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1153:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1154:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1155:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1157:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1168:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1168:62: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1171:74: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1172:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1177:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1178:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1179:58: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1181:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1186:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1190:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1194:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1197:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1203:86: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1205:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1212:77: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1273:57: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1282:25: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1294:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1295:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1296:35: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1297:38: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1298:39: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1305:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1306:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1307:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1383:25: E221 multiple spaces before operator +./src/tfscreen/tfmodel/model_orchestrator.py:1384:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1386:31: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/model_orchestrator.py:1459:5: C901 'ModelOrchestrator._initialize_classes' is too complex (25) +./src/tfscreen/tfmodel/model_orchestrator.py:1479:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1481:67: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1482:71: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1484:68: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1485:77: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1486:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1487:40: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1504:42: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1505:43: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1506:40: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1506:43: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1506:53: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1506:56: E231 missing whitespace after ',' +./src/tfscreen/tfmodel/model_orchestrator.py:1506:64: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1595:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1598:69: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1619:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1621:9: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1705:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1710:5: E303 too many blank lines (2) +./src/tfscreen/tfmodel/model_orchestrator.py:1724:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1734:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1744:75: W291 trailing whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1758:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1761:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1790:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1802:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1814:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/model_orchestrator.py:1820:25: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1821:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1822:31: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1823:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1824:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1825:22: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1826:32: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1827:23: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1828:20: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1829:29: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1830:36: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1831:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1832:33: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1833:34: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1834:27: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1835:28: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/model_orchestrator.py:1836:31: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent @@ -3596,9 +3595,9 @@ ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:264:60: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:265:59: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:266:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:267:62: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:267:70: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:268:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:269:62: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:269:70: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:271:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) @@ -3624,21 +3623,23 @@ ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:115:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:116:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:207:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:117:23: E221 multiple spaces before operator ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:208:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:213:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:290:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:291:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:292:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:295:1: C901 '_inject_calibration_priors' is too complex (21) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:554:1: C901 '_build_csv_updates' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:612:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:613:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:752:1: C901 '_apply_guesses_updates' is too complex (12) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:904:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:908:1: E302 expected 2 blank lines, found 3 +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:209:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:214:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:296:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:297:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:298:24: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:301:1: C901 '_inject_calibration_priors' is too complex (21) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:560:1: C901 '_build_csv_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:629:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:630:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:631:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:807:1: C901 '_apply_priors_updates' is too complex (13) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:893:1: C901 '_apply_guesses_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1045:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1049:1: E302 expected 2 blank lines, found 3 ./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used @@ -5616,14 +5617,17 @@ ./tests/tfscreen/tfmodel/generative/components/dk_geno/test_hierarchical_geno.py:415:21: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/dk_geno/test_hierarchical_geno.py:426:9: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:7:1: F401 'tfscreen.tfmodel.generative.components.growth.linear.LinearParams' imported but unused -./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:56:10: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:138:28: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:140:28: E272 multiple spaces before keyword -./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:3:1: F401 'numpyro.handlers.substitute' imported but unused -./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:6:1: F401 'tfscreen.tfmodel.generative.components.growth.power.PowerParams' imported but unused -./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:23:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py:6:1: F401 'tfscreen.tfmodel.generative.components.growth.saturation.SaturationParams' imported but unused -./tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py:23:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:34:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:70:10: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:152:28: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/growth/test_linear.py:154:28: E272 multiple spaces before keyword +./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:4:1: F401 'numpyro.handlers.substitute' imported but unused +./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:7:1: F401 'tfscreen.tfmodel.generative.components.growth.power.PowerParams' imported but unused +./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:31:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/generative/components/growth/test_power.py:38:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py:7:1: F401 'tfscreen.tfmodel.generative.components.growth.saturation.SaturationParams' imported but unused +./tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py:31:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/tfmodel/generative/components/growth/test_saturation.py:38:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/components/growth_noise/test_normal_kt.py:1:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/generative/components/growth_noise/test_normal_kt.py:3:1: F401 'jax.numpy as jnp' imported but unused ./tests/tfscreen/tfmodel/generative/components/growth_noise/test_normal_kt.py:4:1: F401 'numpyro' imported but unused @@ -6557,57 +6561,57 @@ ./tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py:108:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py:115:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/observe/test_observe_binding.py:117:41: W292 no newline at end of file -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:23:20: W291 trailing whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:29:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:33:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:43:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:46:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:48:76: W291 trailing whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:50:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:53:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:56:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:31: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:33: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:35: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:37: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:39: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:59:41: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:60:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:76:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:28:20: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:34:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:38:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:48:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:51:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:53:76: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:55:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:58:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:61:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:31: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:33: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:35: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:37: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:39: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:64:41: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:65:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:81:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:106:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:114:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:119:56: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:133:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:135:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:141:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:145:24: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:86:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:111:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:119:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:124:56: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:138:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:140:1: W293 blank line contains whitespace ./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:146:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:154:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:35: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:37: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:39: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:41: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:43: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:164:45: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:177:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:180:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:23: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:25: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:27: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:29: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:31: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:33: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:183:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:23: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:25: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:27: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:29: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:31: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:33: E231 missing whitespace after ',' -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:210:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:275:57: W292 no newline at end of file +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:150:24: W291 trailing whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:151:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:159:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:35: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:37: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:39: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:41: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:43: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:169:45: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:182:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:185:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:23: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:25: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:27: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:29: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:31: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:187:33: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:188:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:23: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:25: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:27: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:29: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:31: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:190:33: E231 missing whitespace after ',' +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:192:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:215:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py:297:62: 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 @@ -7000,58 +7004,58 @@ ./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:191:71: E203 whitespace before ',' ./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:192:1: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:193:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:226:17: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:239:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:242:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:247:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:250:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:253:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:259:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:259:49: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:261:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:267:34: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:267:54: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:269:128: E501 line too long (142 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:270:1: W293 blank line contains whitespace -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:273:76: E261 at least two spaces before inline comment -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:14: E111 indentation is not a multiple of 4 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:14: E117 over-indented -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:31: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:41: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:56: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:75: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:128: E501 line too long (150 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:30: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:40: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:55: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:291:74: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:346:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:348:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:351:5: E306 expected 1 blank line before a nested definition, found 0 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:479:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:494:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:502:124: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:502:128: E501 line too long (130 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:505:9: F841 local variable 'mock_ri_class' is assigned to but never used -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:508:44: E231 missing whitespace after ':' -./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:524:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:279:17: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:292:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:295:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:300:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:300:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:300:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:300:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:303:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:306:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:306:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:306:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:306:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:312:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:312:49: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:314:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:320:34: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:320:54: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:322:128: E501 line too long (142 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:323:1: W293 blank line contains whitespace +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:326:76: E261 at least two spaces before inline comment +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:14: E111 indentation is not a multiple of 4 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:14: E117 over-indented +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:31: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:41: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:56: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:75: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:332:128: E501 line too long (150 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:344:30: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:344:40: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:344:55: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:344:74: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:399:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:401:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:404:5: E306 expected 1 blank line before a nested definition, found 0 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:532:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:547:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:555:124: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:555:128: E501 line too long (130 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:558:9: F841 local variable 'mock_ri_class' is assigned to but never used +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:561:44: E231 missing whitespace after ':' +./tests/tfscreen/tfmodel/scripts/test_configure_and_run.py:577: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 @@ -7072,32 +7076,32 @@ ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:13:1: F401 'shutil' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:14:1: F401 'sys' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:22:1: F401 'jax' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:936:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:937:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:938:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:939:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:940:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:941:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:942:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:943:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:944:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1462:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1468:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1474:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1481:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1489:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1495:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1503:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1509:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1515:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1522:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1529:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1543:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1557:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1569:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1654:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1673:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1688:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1033:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1034:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1035:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1036:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1037:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1038:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1039:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1040:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1041:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1559:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1565:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1571:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1578:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1586:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1592:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1600:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1606:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1612:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1619:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1626:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1640:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1654:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1666:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1849:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1868:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1883:14: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_sample_posterior_cli.py:5:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/tfmodel/scripts/test_sample_prior_cli.py:3:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/scripts/test_subset_genotypes_cli.py:84:31: E741 ambiguous variable name 'l' @@ -7630,7 +7634,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 -48 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) @@ -7638,7 +7642,7 @@ 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 -209 E127 continuation line over-indented for visual indent +210 E127 continuation line over-indented for visual indent 94 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' @@ -7659,7 +7663,7 @@ 1 E301 expected 1 blank line, found 0 781 E302 expected 2 blank lines, found 1 50 E303 too many blank lines (2) -16 E305 expected 2 blank lines after class or function definition, found 1 +19 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 37 E402 module level import not at top of file @@ -7676,6 +7680,6 @@ 42 F841 local variable 'e' is assigned to but never used 620 W291 trailing whitespace 85 W292 no newline at end of file -1584 W293 blank line contains whitespace +1583 W293 blank line contains whitespace 30 W391 blank line at end of file -7632 +7636 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index fc299974..d1101a71 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/tfmodel/data_class.py b/src/tfscreen/tfmodel/data_class.py index 6a3146be..89c3daad 100644 --- a/src/tfscreen/tfmodel/data_class.py +++ b/src/tfscreen/tfmodel/data_class.py @@ -282,7 +282,8 @@ class BaseGrowthPriors: Prior for the optional k_ref scalar (see BaseGrowthData / model.py's base_growth_obs block). k_ref_loc is derived empirically from wt's row in base_growth_df (dk_geno_wt == 0 makes wt's own measurement a direct - read of k_ref) -- see model_orchestrator._derive_k_ref_guess. + read of k_ref) -- see + generative.observe.base_growth.derive_k_ref_guess/get_priors. """ k_ref_loc: float k_ref_scale: float diff --git a/src/tfscreen/tfmodel/generative/observe/base_growth.py b/src/tfscreen/tfmodel/generative/observe/base_growth.py index b004aefd..b3d0a148 100644 --- a/src/tfscreen/tfmodel/generative/observe/base_growth.py +++ b/src/tfscreen/tfmodel/generative/observe/base_growth.py @@ -109,3 +109,54 @@ def guide(name: str, pyro.sample(f"{name}_k_ref", dist.Normal(k_ref_loc, k_ref_scale)) return + + +def get_hyperparameters(): + """ + Default hyperparameter for the k_ref prior's scale -- weakly-informative, + centred on the empirical guess (see derive_k_ref_guess), wide enough that + a handful of base_growth_df measurements dominate it rather than the + reverse. + """ + return {"k_ref_scale": 0.02} + + +def derive_k_ref_guess(base_growth_df): + """ + Empirically derive k_ref's initial guess (and prior location) from wt's + measured rate in base_growth_df. + + dk_geno is fixed to exactly 0 for wt by every dk_geno component, so wt's + own measurement is a direct, uncontaminated read of k_ref + (rate_obs_wt ~ Normal(k_ref + 0, rate_std_wt)). + + Parameters + ---------- + base_growth_df : pd.DataFrame + Output of model_orchestrator._read_base_growth_df; must contain a + 'wt' row (enforced there). + + Returns + ------- + float + wt's measured rate. + """ + wt_row = base_growth_df[base_growth_df["genotype"].astype(str) == "wt"] + return float(wt_row["rate"].iloc[0]) + + +def get_priors(k_ref_loc): + """ + Build the BaseGrowthPriors dataclass from an empirically-derived + ``k_ref_loc`` (see derive_k_ref_guess) plus the default scale from + get_hyperparameters(). + """ + return BaseGrowthPriors(k_ref_loc=k_ref_loc, **get_hyperparameters()) + + +def get_guesses(name, k_ref_loc): + """ + Initial optimizer guess for the k_ref latent -- the same value used as + the prior's loc (see get_priors/derive_k_ref_guess). + """ + return {f"{name}_k_ref": jnp.array(k_ref_loc)} diff --git a/src/tfscreen/tfmodel/generative/observe/growth.py b/src/tfscreen/tfmodel/generative/observe/growth.py index 97457318..d8299e47 100644 --- a/src/tfscreen/tfmodel/generative/observe/growth.py +++ b/src/tfscreen/tfmodel/generative/observe/growth.py @@ -103,4 +103,21 @@ def guide(name: str, nu = pyro.sample(f"{name}_nu", dist.LogNormal(nu_loc, nu_scale)) - return \ No newline at end of file + return + + +def get_hyperparameters(): + """ + Default Gamma(concentration, rate) hyperparameters for the growth + observer's StudentT degrees-of-freedom latent ``nu``. Mean = + concentration/rate = 2.0/0.1 = 20.0. + """ + return {"nu_concentration": 2.0, "nu_rate": 0.1} + + +def get_priors(): + """ + Build the GrowthObsPriors dataclass from get_hyperparameters()'s + defaults. + """ + return GrowthObsPriors(**get_hyperparameters()) \ No newline at end of file diff --git a/src/tfscreen/tfmodel/model_orchestrator.py b/src/tfscreen/tfmodel/model_orchestrator.py index 848a6111..e97d2ed5 100644 --- a/src/tfscreen/tfmodel/model_orchestrator.py +++ b/src/tfscreen/tfmodel/model_orchestrator.py @@ -16,8 +16,6 @@ BaseGrowthData, PriorsClass, GrowthPriors, - GrowthObsPriors, - BaseGrowthPriors, BindingPriors ) @@ -489,17 +487,6 @@ def _build_presplit_tm(presplit_df, growth_tm): return presplit_tm -# Weakly-informative default scale for k_ref's prior -- centred on the -# empirical guess (see _derive_k_ref_guess), wide enough that a handful of -# base_growth_df measurements dominate it rather than the reverse. -_K_REF_PRIOR_SCALE = 0.02 - -# Default Gamma(concentration, rate) prior for the growth observer's StudentT -# degrees-of-freedom latent `nu` (see observe/growth.py). Mean = 2.0/0.1 = 20.0. -_NU_PRIOR_CONCENTRATION = 2.0 -_NU_PRIOR_RATE = 0.1 - - def _read_base_growth_df(base_growth_df, growth_df): """ Read and validate the optional base (reference-condition) growth-rate @@ -636,30 +623,6 @@ def _build_base_growth_arrays(base_growth_df, genotype_labels): return {"rate_obs": rate_obs, "rate_std": rate_std, "good_mask": good_mask} -def _derive_k_ref_guess(base_growth_df): - """ - Empirically derive k_ref's initial guess (and prior location) from wt's - measured rate in base_growth_df. - - dk_geno is fixed to exactly 0 for wt by every dk_geno component, so wt's - own measurement is a direct, uncontaminated read of k_ref - (rate_obs_wt ~ Normal(k_ref + 0, rate_std_wt)). - - Parameters - ---------- - base_growth_df : pd.DataFrame - Output of _read_base_growth_df; must contain a 'wt' row (enforced - there). - - Returns - ------- - float - wt's measured rate. - """ - wt_row = base_growth_df[base_growth_df["genotype"].astype(str) == "wt"] - return float(wt_row["rate"].iloc[0]) - - def _setup_batching(growth_genotypes, binding_genotypes, batch_size): @@ -1318,7 +1281,9 @@ def _initialize_data(self): sources=[bg_arrays, {"num_genotype": self.growth_tm.tensor_shape[-1]}], ) - self._k_ref_guess = _derive_k_ref_guess(self.base_growth_df) + self._k_ref_guess = model_registry["observe_base_growth"].derive_k_ref_guess( + self.base_growth_df + ) else: self.base_growth_df = None base_growth_dataclass = None @@ -1717,16 +1682,18 @@ def _initialize_classes(self): growth_obs=None, ) else: - priors_class_kwargs["growth"]["growth_obs"] = GrowthObsPriors( - nu_concentration=_NU_PRIOR_CONCENTRATION, - nu_rate=_NU_PRIOR_RATE, - ) + priors_class_kwargs["growth"]["growth_obs"] = \ + model_registry["observe_growth"].get_priors() if self._base_growth_df is not None: - priors_class_kwargs["growth"]["base_growth"] = BaseGrowthPriors( - k_ref_loc=self._k_ref_guess, - k_ref_scale=_K_REF_PRIOR_SCALE, + priors_class_kwargs["growth"]["base_growth"] = \ + model_registry["observe_base_growth"].get_priors( + k_ref_loc=self._k_ref_guess + ) + init_params.update( + model_registry["observe_base_growth"].get_guesses( + "base_growth", self._k_ref_guess + ) ) - init_params["base_growth_k_ref"] = jnp.array(self._k_ref_guess) growth_priors = populate_dataclass(GrowthPriors, sources=priors_class_kwargs["growth"]) binding_priors = populate_dataclass(BindingPriors, diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py index 02165cc1..2ae1abfc 100644 --- a/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_base_growth.py @@ -5,8 +5,18 @@ from numpyro.handlers import trace, seed, substitute from collections import namedtuple +import pandas as pd + # --- Import Module Under Test (MUT) --- -from tfscreen.tfmodel.generative.observe.base_growth import observe, guide +from tfscreen.tfmodel.generative.observe.base_growth import ( + observe, + guide, + get_hyperparameters, + derive_k_ref_guess, + get_priors, + get_guesses, +) +from tfscreen.tfmodel.data_class import BaseGrowthPriors # --- Mock Data Fixtures --- @@ -192,3 +202,30 @@ def test_guide_registers_k_ref(mock_data, full_growth, priors): constraint = scale_site["kwargs"]["constraint"] assert isinstance(constraint, dist.constraints._GreaterThan) assert constraint.lower_bound == pytest.approx(1e-4) + + +def test_get_hyperparameters_default_scale(): + hypers = get_hyperparameters() + assert hypers == {"k_ref_scale": 0.02} + + +def test_derive_k_ref_guess_returns_wt_rate(): + base_growth_df = pd.DataFrame({ + "genotype": ["wt", "A2G"], + "rate": [0.021, 0.015], + "rate_std": [0.001, 0.002], + }) + assert derive_k_ref_guess(base_growth_df) == pytest.approx(0.021) + + +def test_get_priors_uses_loc_and_default_scale(): + priors = get_priors(k_ref_loc=0.0234) + assert isinstance(priors, BaseGrowthPriors) + assert priors.k_ref_loc == pytest.approx(0.0234) + assert priors.k_ref_scale == pytest.approx(get_hyperparameters()["k_ref_scale"]) + + +def test_get_guesses_keys_by_name(): + guesses = get_guesses("base_growth", 0.0234) + assert set(guesses.keys()) == {"base_growth_k_ref"} + assert jnp.allclose(guesses["base_growth_k_ref"], 0.0234) diff --git a/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py b/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py index 9c717dd4..12dfb0c2 100644 --- a/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py +++ b/tests/tfscreen/tfmodel/generative/observe/test_observe_growth.py @@ -6,7 +6,12 @@ from collections import namedtuple # --- Import Module Under Test (MUT) --- -from tfscreen.tfmodel.generative.observe.growth import observe, guide +from tfscreen.tfmodel.generative.observe.growth import ( + observe, + guide, + get_hyperparameters, + get_priors, +) from tfscreen.tfmodel.data_class import GrowthObsPriors # --- Mock Data Fixture --- @@ -272,4 +277,21 @@ def test_sigma_k_quadrature_formula(mock_data, mock_priors): ) base = tr[f"{name}_obs"]["fn"].base_dist expected = jnp.sqrt(ln_cfu_std ** 2 + sigma_k ** 2) - assert jnp.allclose(base.scale, expected, rtol=1e-6) \ No newline at end of file + assert jnp.allclose(base.scale, expected, rtol=1e-6) + + +# --------------------------------------------------------------------------- +# Tests for default-hyperparameter ownership (get_hyperparameters/get_priors) +# --------------------------------------------------------------------------- + +def test_get_hyperparameters_default_nu_prior(): + hypers = get_hyperparameters() + assert hypers == {"nu_concentration": 2.0, "nu_rate": 0.1} + + +def test_get_priors_builds_growth_obs_priors_from_defaults(): + priors = get_priors() + assert isinstance(priors, GrowthObsPriors) + hypers = get_hyperparameters() + assert priors.nu_concentration == pytest.approx(hypers["nu_concentration"]) + assert priors.nu_rate == pytest.approx(hypers["nu_rate"]) \ No newline at end of file diff --git a/tests/tfscreen/tfmodel/test_model_orchestrator.py b/tests/tfscreen/tfmodel/test_model_orchestrator.py index 2ecaf966..f32b4506 100644 --- a/tests/tfscreen/tfmodel/test_model_orchestrator.py +++ b/tests/tfscreen/tfmodel/test_model_orchestrator.py @@ -2222,9 +2222,9 @@ def test_build_base_growth_arrays_shapes_and_values(self): assert not arrays["good_mask"][k3r_idx] def test_derive_k_ref_guess_returns_wt_rate(self): - from tfscreen.tfmodel.model_orchestrator import ( - _read_base_growth_df, - _derive_k_ref_guess, + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + from tfscreen.tfmodel.generative.observe.base_growth import ( + derive_k_ref_guess, ) growth_df = _read_growth_df(self._growth_df()) @@ -2235,18 +2235,24 @@ def test_derive_k_ref_guess_returns_wt_rate(self): }) processed = _read_base_growth_df(base_growth_df_raw, growth_df) - guess = _derive_k_ref_guess(processed) + guess = derive_k_ref_guess(processed) assert guess == pytest.approx(0.021) def test_base_growth_df_wires_k_ref_into_growth_priors(self, mocker): """ End-to-end: supplying base_growth_df must derive a k_ref guess from wt's rate and thread it into growth_priors.base_growth as a - BaseGrowthPriors(k_ref_loc=guess, k_ref_scale=_K_REF_PRIOR_SCALE) - instance. Without base_growth_df, growth_priors.base_growth must - stay None (its dataclass default). + BaseGrowthPriors(k_ref_loc=guess, k_ref_scale=) instance, built via observe.base_growth.get_priors (which + now owns the k_ref prior's default hyperparameters -- see + observe.base_growth.get_hyperparameters). Without base_growth_df, + growth_priors.base_growth must stay None (its dataclass default). """ - from tfscreen.tfmodel.model_orchestrator import _K_REF_PRIOR_SCALE + from tfscreen.tfmodel.generative.observe import ( + growth as observe_growth, + base_growth as observe_base_growth, + ) + _K_REF_PRIOR_SCALE = observe_base_growth.get_hyperparameters()["k_ref_scale"] from tfscreen.tfmodel.tensors.populate_dataclass import ( populate_dataclass as real_populate_dataclass, ) @@ -2306,8 +2312,8 @@ def _populate_side_effect(target_dataclass, sources): "growth_noise": {"zero": MagicMock()}, "sample_offset": {"zero": MagicMock()}, "observe_binding": MagicMock(), - "observe_growth": MagicMock(), - "observe_base_growth": MagicMock(), + "observe_growth": observe_growth, + "observe_base_growth": observe_base_growth, } with patch.dict("tfscreen.tfmodel.model_orchestrator.model_registry", registry, clear=True): for k in ["condition_growth", "growth_transition", "ln_cfu0", "dk_geno", From 3ab5f408482f42038e013c05a66638e44dd7b2dc Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 13:41:51 -0700 Subject: [PATCH 20/30] added growth parameter outputs to summary --- CLAUDE.md | 13 +- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 34 +-- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/base_growth_data.py | 38 +++ .../simulate/growth_parameters_output.py | 84 ++++++ src/tfscreen/simulate/scripts/simulate_cli.py | 30 ++- .../tfmodel/scripts/summarize_fit_cli.py | 154 +++++++++++ .../simulate/test_base_growth_data.py | 33 ++- .../simulate/test_growth_parameters_output.py | 91 +++++++ tests/tfscreen/simulate/test_simulate_cli.py | 130 +++++++++- .../tfmodel/scripts/test_summarize_fit_cli.py | 239 ++++++++++++++++++ 13 files changed, 815 insertions(+), 37 deletions(-) create mode 100644 src/tfscreen/simulate/growth_parameters_output.py create mode 100644 tests/tfscreen/simulate/test_growth_parameters_output.py diff --git a/CLAUDE.md b/CLAUDE.md index 03ae2dad..f5c8447e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -206,6 +206,16 @@ The optional `base_growth_data` YAML block generates a simulated `base_growth_df - Every requested genotype must already exist in `parameters_df` — `dk_geno` is looked up from the value already assigned during the normal per-library draw (`_assign_dk_geno` in `thermo_to_growth.py`), never redrawn. This mirrors the inference-side requirement that `base_growth_df` genotypes already exist in `growth_df`. - `rate_true = k_ref + dk_geno[genotype]` unless overridden via `rates`; the observed `rate` adds Gaussian noise (sigma = `noise`), and `rate_std` is reported as that same flat `noise` value for every row (matching the `binding_data.noise` → `theta_std` convention). - **`noise` must be strictly positive if the CSV is fed to `tfs-configure-model --base_growth_df`.** `rate_std` is used directly as a Normal likelihood scale — both when `_read_base_growth_df` inverse-variance-combines multiple rows per genotype, and in the `base_growth_obs` likelihood itself. `rate_std == 0.0` (the default when `noise` is omitted) causes a division-by-zero (`1/rate_std**2`) that produces a NaN `k_ref` prior location, surfacing as a numpyro "invalid loc parameter" crash the first time the model is traced (`tfs-prefit-calibration` or `tfs-fit-model`) — not at `tfs-simulate` or `tfs-configure-model` time, which makes it confusing to diagnose. `_read_base_growth_df` raises a clear `ValueError` naming the offending genotypes if any `rate_std <= 0` is present. +- `simulate/base_growth_data.py::generate_k_ref_df` writes a single-row `tfs_sim_k_ref.csv` (`parameter="k_ref"`, `ref=`) alongside `base_growth_df`, purely as an echo of the configured `k_ref` — the ground-truth counterpart to the fit's single global `*_params_k_ref.csv` (see `tfmodel/analysis/extraction.py`'s `k_ref` block). It is kept out of `tfs_sim_parameters.csv`/`tfs_sim_growth_parameters.csv` because it is neither genotype- nor condition-indexed. + +### Growth parameter ground-truth output (`tfs_sim_growth_parameters.csv`) + +`tfs-simulate` writes `tfs_sim_growth_parameters.csv`, the per-condition ground-truth counterpart to the fit's `condition_growth` component outputs (`*_params_growth_k.csv`, `*_params_growth_m.csv`, `*_params_growth_n.csv`, `*_params_growth_min.csv`, `*_params_growth_max.csv` — see `generative/components/growth/*.py`'s `get_extract_specs`). It is always written (the top-level `growth` config block is required, unlike the optional `*_data` blocks). + +- Generation lives in `simulate/growth_parameters_output.py::generate_growth_parameters_df`, called from `simulate/scripts/simulate_cli.py` right after `library_prediction`, since it only needs `cf['growth']`. +- One row per condition, keyed by `condition_rep` — the same raw condition string used as `growth`'s dict keys (`{"kanR+kan": {...}}`) *is* the fit side's `condition_rep` value (see `model_orchestrator._build_growth_tm`, which pools `condition_pre`/`condition_sel` directly into a column literally named `condition_rep`), so no name-mapping step is needed to join this file against a fit's extracted params. +- Each growth model uses different YAML parameter names than the fit's extract names, and the module hand-maintains the mapping (`b,m` → `growth_k,growth_m` for `linear`; `b,a,n` → `growth_k,growth_m,growth_n` for `power`; `kmin,kmax` → `growth_min,growth_max` for `saturation`) by comparing `simulate/growth/growth_linkage.py`'s numpy formulas against the corresponding JAX formulas in `generative/components/growth/*.py`. If a new `condition_growth` component is added, this mapping must be extended too, or its parameters won't get ground-truth comparison in `tfs-summarize-fit`. +- On the `tfmodel` side, `tfmodel/scripts/summarize_fit_cli.py::_summarize_condition_growth_params` and `_summarize_k_ref` join these two files against the fit's extracted params (on `condition_rep`, and trivially for the single-row `k_ref`, respectively) to annotate them with a `ref` column, mirroring `_summarize_params`'s genotype-keyed comparison but for growth's condition-keyed/global-scalar parameters. ### theta_gc_override and theta_params_override @@ -231,7 +241,8 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/thermo_to_growth.py` | Prior-predictive sampling, theta injection, growth calculation, parameters_df assembly | | `simulate/binding_params.py` | CSV reading (with theta clipping), per-component override builders, binding theta assemblers | | `simulate/binding_data.py` | Generates simulated observed binding curve data (`binding_data.genotypes` path; `generate_binding_df`) | -| `simulate/base_growth_data.py` | Generates simulated direct growth-rate calibration data (`base_growth_data` YAML block) | +| `simulate/base_growth_data.py` | Generates simulated direct growth-rate calibration data (`base_growth_data` YAML block) and the single-row `k_ref` ground-truth echo | +| `simulate/growth_parameters_output.py` | Generates per-condition `condition_growth` ground truth (`tfs_sim_growth_parameters.csv`) from the `growth` YAML block | | `simulate/presplit_data.py` | Generates simulated pre-split (t = -t_pre) data (`presplit_data` YAML block; `generate_presplit_df`) | | `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 | diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 397f274e..97afee55 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.43%coverage96.43% \ No newline at end of file +coverage: 96.42%coverage96.42% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index dd5e451a..f270cfd2 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3891tests3891 \ No newline at end of file +tests: 3924tests3924 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index 3e2c66ab..f9e71df7 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1309,7 +1309,8 @@ ./src/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./src/tfscreen/simulate/scripts/simulate_cli.py:15:1: C901 'run_simulation_from_config' is too complex (12) +./src/tfscreen/simulate/scripts/simulate_cli.py:16:1: C901 'run_simulation_from_config' is too complex (12) +./src/tfscreen/simulate/scripts/simulate_cli.py:145:128: E501 line too long (131 > 127 characters) ./src/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' @@ -3645,7 +3646,8 @@ ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) -./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:521:1: C901 'summarize_fit' is too complex (59) +./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:528:1: C901 '_summarize_condition_growth_params' is too complex (14) +./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:674:1: C901 'summarize_fit' is too complex (59) ./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) ./src/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 @@ -5138,6 +5140,7 @@ ./tests/tfscreen/simulate/test_build_sample_dataframes.py:104:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:115:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:128:55: W292 no newline at end of file +./tests/tfscreen/simulate/test_growth_parameters_output.py:4:1: F401 'pandas as pd' imported but unused ./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 @@ -5333,13 +5336,13 @@ ./tests/tfscreen/simulate/test_selection_experiment.py:1269:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1272:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1322:18: W292 no newline at end of file -./tests/tfscreen/simulate/test_simulate_cli.py:220:11: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_simulate_cli.py:224:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:266:11: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_simulate_cli.py:271:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:273:31: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:275:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:331:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused +./tests/tfscreen/simulate/test_simulate_cli.py:333:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:337:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:380:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:385:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:387:31: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:389:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:445:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused ./tests/tfscreen/simulate/test_thermo_to_growth.py:28:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:32:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:41:1: E302 expected 2 blank lines, found 1 @@ -7116,7 +7119,8 @@ ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:972:17: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1237:1: E402 module level import not at top of file ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1419:14: E221 multiple spaces before operator -./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1751:21: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1681:1: E402 module level import not at top of file +./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1990: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/tensors/test_batch.py:3:1: F401 'numpy as np' imported but unused @@ -7634,7 +7638,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 -49 C901 'cat_fit' is too complex (19) +50 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) @@ -7666,15 +7670,15 @@ 19 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 -37 E402 module level import not at top of file -86 E501 line too long (145 > 127 characters) +38 E402 module level import not at top of file +87 E501 line too long (131 > 127 characters) 46 E701 multiple statements on one line (colon) 5 E712 comparison to True should be 'if cond is True:' or 'if cond:' 2 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def 20 E741 ambiguous variable name 'l' -228 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +229 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 42 F841 local variable 'e' is assigned to but never used @@ -7682,4 +7686,4 @@ 85 W292 no newline at end of file 1583 W293 blank line contains whitespace 30 W391 blank line at end of file -7636 +7640 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index d1101a71..8af0115f 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/simulate/base_growth_data.py b/src/tfscreen/simulate/base_growth_data.py index 76787281..b0565cb0 100644 --- a/src/tfscreen/simulate/base_growth_data.py +++ b/src/tfscreen/simulate/base_growth_data.py @@ -131,3 +131,41 @@ def generate_base_growth_df(base_growth_cfg, parameters_df, rng): }) return pd.DataFrame(rows) + + +def generate_k_ref_df(base_growth_cfg): + """ + Generate a one-row ground-truth DataFrame for the global k_ref scalar. + + k_ref is a single global scalar, not genotype- or condition-indexed + like the values in tfs_sim_parameters.csv or + tfs_sim_growth_parameters.csv, so it gets its own single-row summary + file (tfs_sim_k_ref.csv) rather than being folded into either of those. + + Parameters + ---------- + base_growth_cfg : dict + The 'base_growth_data' sub-dict from the config. Must contain: + k_ref : float + Reference (wt) growth rate, hr^-1. + + Returns + ------- + pandas.DataFrame + Single row with columns 'parameter' ("k_ref") and 'ref' (the + configured value). + + Raises + ------ + ValueError + If 'k_ref' is missing from base_growth_cfg. + """ + if "k_ref" not in base_growth_cfg: + raise ValueError( + "base_growth_data config must specify 'k_ref' (the reference " + "wt growth rate, hr^-1)." + ) + return pd.DataFrame({ + "parameter": ["k_ref"], + "ref": [float(base_growth_cfg["k_ref"])], + }) diff --git a/src/tfscreen/simulate/growth_parameters_output.py b/src/tfscreen/simulate/growth_parameters_output.py new file mode 100644 index 00000000..273e4433 --- /dev/null +++ b/src/tfscreen/simulate/growth_parameters_output.py @@ -0,0 +1,84 @@ +""" +Generate simulated ground-truth growth-model parameters (condition_growth). + +Mirrors ``tfs_sim_parameters.csv``'s genotype-level ground truth, but at the +per-condition level: the ``growth`` block of the simulate config directly +specifies the true condition_growth parameters (linear/power/saturation), +keyed by condition string. Those same condition strings are used, unchanged, +as ``condition_rep`` on the tfmodel inference side (see +``model_orchestrator._build_growth_tm``), so no further mapping is needed to +join this file against a fit's ``*_params_growth_{name}.csv`` outputs. + +Each growth model uses different parameter names in the YAML (``b``/``m`` +for linear, ``b``/``a``/``n`` for power, ``kmin``/``kmax`` for saturation -- +see ``simulate.growth.growth_linkage``) which must be renamed to match the +inference-side extract names (``growth_k``, ``growth_m``, ``growth_n``, +``growth_min``, ``growth_max`` respectively -- see +``generative/components/growth/*.py``'s ``get_extract_specs``) before this +ground truth can be joined against a fit's extracted parameters. The two +sides' formulas must stay in sync by hand (compare +``simulate/growth/growth_linkage.py`` against +``generative/components/growth/{linear,power,saturation}.py``); this module +is the single place that mapping is recorded. +""" + +import pandas as pd + + +_MODEL_KEY_MAP = { + "linear": {"b": "growth_k", "m": "growth_m"}, + "power": {"b": "growth_k", "a": "growth_m", "n": "growth_n"}, + "saturation": {"kmin": "growth_min", "kmax": "growth_max"}, +} + + +def generate_growth_parameters_df(growth_cfg): + """ + Generate the ground-truth condition_growth parameters DataFrame. + + Parameters + ---------- + growth_cfg : dict + The 'growth' top-level config block: a mapping from condition + string to a parameter dict. Each parameter dict may contain a + 'model' key ('linear', 'power', or 'saturation'; defaults to + 'linear' to match simulate.thermo_to_growth._apply_growth_params) + plus the model's own parameter keys. + + Returns + ------- + pandas.DataFrame + One row per condition. Columns: 'condition_rep' plus the union of + growth_k/growth_m/growth_n/growth_min/growth_max used by any + condition present (NaN where a given condition's model doesn't use + that parameter). + + Raises + ------ + ValueError + If a condition specifies an unrecognized 'model', or is missing one + of that model's required parameter keys. + """ + rows = [] + for condition, params in growth_cfg.items(): + params = dict(params) + model_name = params.pop("model", "linear") + if model_name not in _MODEL_KEY_MAP: + raise ValueError( + f"Unknown growth model '{model_name}' for condition " + f"'{condition}'. Available models: " + f"{sorted(_MODEL_KEY_MAP)}" + ) + + key_map = _MODEL_KEY_MAP[model_name] + row = {"condition_rep": condition} + for src_key, dst_key in key_map.items(): + if src_key not in params: + raise ValueError( + f"Growth condition '{condition}' (model '{model_name}') " + f"is missing required parameter '{src_key}'." + ) + row[dst_key] = float(params[src_key]) + rows.append(row) + + return pd.DataFrame(rows) diff --git a/src/tfscreen/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index 34c8cb7d..a3a61f78 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -7,7 +7,8 @@ from tfscreen.simulate import library_prediction, selection_experiment from tfscreen.simulate.binding_data import generate_binding_df from tfscreen.simulate.presplit_data import generate_presplit_df -from tfscreen.simulate.base_growth_data import generate_base_growth_df +from tfscreen.simulate.base_growth_data import generate_base_growth_df, generate_k_ref_df +from tfscreen.simulate.growth_parameters_output import generate_growth_parameters_df from tfscreen.process_raw import counts_to_lncfu from tfscreen.util.cli.generalized_main import generalized_main @@ -25,15 +26,18 @@ def run_simulation_from_config( Runs library_prediction once to establish ground-truth phenotypes, then simulates num_replicates independent experimental replicates using selection_experiment. Writes library, parameters, genotype_theta (long-form: - genotype/titrant_name/titrant_conc/theta), and analysis-ready growth CSV - files. If the config contains a 'binding_data' block, also writes a + genotype/titrant_name/titrant_conc/theta), growth, and growth_parameters + (per-condition condition_growth ground truth; see + tfscreen.simulate.growth_parameters_output.generate_growth_parameters_df) + CSV files. If the config contains a 'binding_data' block, also writes a simulated binding curve CSV (see tfscreen.simulate.binding_data.generate_binding_df). If it contains a 'base_growth_data' block, also writes a simulated direct growth-rate - calibration CSV (see - tfscreen.simulate.base_growth_data.generate_base_growth_df). If it - contains a 'presplit_data' block, also writes a simulated presplit CSV - (see tfscreen.simulate.presplit_data.generate_presplit_df). + calibration CSV and a single-row k_ref ground-truth CSV (see + tfscreen.simulate.base_growth_data.generate_base_growth_df and + .generate_k_ref_df). If it contains a 'presplit_data' block, also writes + a simulated presplit CSV (see + tfscreen.simulate.presplit_data.generate_presplit_df). Parameters ---------- @@ -59,13 +63,15 @@ def out_path(name): config_out = os.path.join(output_dir, f"{output_prefix}input-config.yaml") - output_names = ["library", "parameters", "genotype_theta", "growth"] + output_names = ["library", "parameters", "genotype_theta", "growth", + "growth_parameters"] if "binding_data" in cf: output_names.append("binding") if "presplit_data" in cf: output_names.append("presplit") if "base_growth_data" in cf: output_names.append("base_growth") + output_names.append("k_ref") existing = [out_path(n) for n in output_names if os.path.exists(out_path(n))] if os.path.exists(config_out): @@ -85,6 +91,7 @@ def out_path(name): # Ground-truth library and phenotypes (deterministic given the config) library_df, phenotype_df, genotype_theta_df, parameters_df, binding_theta_df = library_prediction(cf) + growth_parameters_df = generate_growth_parameters_df(cf["growth"]) # ------------------------------------------------------------------------- # Simulate independent replicates @@ -134,7 +141,8 @@ def out_path(name): parameters_df.to_csv(out_path("parameters"), index=False) genotype_theta_df.to_csv(out_path("genotype_theta"), index=False) growth_df.to_csv(out_path("growth"), index=False) - print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth'])}") + growth_parameters_df.to_csv(out_path("growth_parameters"), index=False) + print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth', 'growth_parameters'])}") if "binding_data" in cf: binding_df = generate_binding_df(cf["binding_data"], rng, binding_theta_df) @@ -146,6 +154,10 @@ def out_path(name): base_growth_df.to_csv(out_path("base_growth"), index=False) print(f"Wrote: {out_path('base_growth')}") + k_ref_df = generate_k_ref_df(cf["base_growth_data"]) + k_ref_df.to_csv(out_path("k_ref"), index=False) + print(f"Wrote: {out_path('k_ref')}") + if "presplit_data" in cf: print("\nGenerating presplit data...", flush=True) presplit_df = generate_presplit_df(combined_sample_df, diff --git a/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py b/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py index c7e4d88a..f676bb60 100644 --- a/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py +++ b/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py @@ -518,6 +518,159 @@ def _summarize_params(run_dir, out_prefix): _try_calibration(out_df, "ref", out_name[:-4], plot_label) +# Fit-side extract names for the condition_growth component (see +# generative/components/growth/{linear,power,saturation}.py's +# get_extract_specs and simulate/growth_parameters_output.py, which writes +# the matching ground-truth columns). +_GROWTH_PARAM_NAMES = ["growth_k", "growth_m", "growth_n", "growth_min", "growth_max"] + + +def _summarize_condition_growth_params(run_dir, out_prefix): + """Annotate *_params_growth_{name}.csv with ground-truth ref from tfs_sim_growth_parameters.csv. + + Scans run_dir for a ``*_sim_growth_parameters.csv`` file (written by + tfs-simulate; see tfscreen.simulate.growth_parameters_output). If + absent the function returns silently (real-data runs have no ground + truth). + + For each condition_growth parameter name present as a column in that + file (growth_k, growth_m, growth_n, growth_min, growth_max -- whichever + the configured growth model produces), the function looks for a + matching ``*_params_{name}.csv`` file, warns if it is absent, and + otherwise joins the two on ``condition_rep`` and writes the annotated + result to ``{out_prefix}_params_{name}.csv``. + """ + sim_path = _find_unique(run_dir, "_sim_growth_parameters.csv", + "sim growth parameters", warn_missing=False) + if sim_path is None: + return + + try: + growth_ref_df = pd.read_csv(sim_path) + except Exception as exc: + warnings.warn(f"Could not load growth parameters from {sim_path}: {exc}") + return + + if "condition_rep" not in growth_ref_df.columns: + warnings.warn( + f"Growth parameters file {sim_path} has no 'condition_rep' " + "column; skipping growth param summaries" + ) + return + + present_param_names = [c for c in _GROWTH_PARAM_NAMES if c in growth_ref_df.columns] + + for param_name in present_param_names: + if not glob.glob(os.path.join(run_dir, f"*_params_{param_name}.csv")): + warnings.warn(f"Expected *_params_{param_name}.csv in {run_dir} but none found") + + for param_name in present_param_names: + param_file = _find_unique(run_dir, f"_params_{param_name}.csv", + f"{param_name} params", warn_missing=False) + if param_file is None: + continue + + try: + params_df = pd.read_csv(param_file) + except Exception as exc: + warnings.warn(f"Could not read {param_file}: {exc}") + continue + + if "condition_rep" not in params_df.columns: + warnings.warn( + f"{os.path.basename(param_file)} has no 'condition_rep' " + "column; skipping" + ) + continue + + merged = params_df.merge( + growth_ref_df[["condition_rep", param_name]].rename( + columns={param_name: "ref"} + ), + on="condition_rep", + how="left", + ) + + out_name = f"{out_prefix}_params_{param_name}.csv" + try: + merged.to_csv(out_name, index=False) + print(f"Wrote parameter summary to {out_name}") + except Exception as exc: + warnings.warn(f"Could not write {out_name}: {exc}") + continue + + pdf_name = out_name.replace(".csv", ".pdf") + _try_plot_params_corr(merged, param_name, pdf_name) + _try_calibration(merged, "ref", out_name[:-4], param_name) + + +def _summarize_k_ref(run_dir, out_prefix): + """Annotate *_params_k_ref.csv with ground truth from tfs_sim_k_ref.csv. + + k_ref is a single global scalar (from base_growth_data calibration), not + genotype- or condition-indexed, so both the ground-truth file and the + fit's extracted file have exactly one row. Silently skips when the + ground-truth file is absent (real-data runs, or runs without + base_growth_data). No correlation plot is produced since a single point + can't usefully be plotted; only the annotated CSV (and a best-effort + calibration check) is written. + """ + sim_path = _find_unique(run_dir, "_sim_k_ref.csv", "sim k_ref", + warn_missing=False) + if sim_path is None: + return + + param_file = _find_unique(run_dir, "_params_k_ref.csv", "k_ref params", + warn_missing=False) + if param_file is None: + warnings.warn(f"Expected *_params_k_ref.csv in {run_dir} but none found") + return + + try: + ref_df = pd.read_csv(sim_path) + params_df = pd.read_csv(param_file) + except Exception as exc: + warnings.warn(f"Could not read k_ref files: {exc}") + return + + if "ref" not in ref_df.columns or len(ref_df) == 0: + warnings.warn(f"{sim_path} has no usable 'ref' value; skipping k_ref summary") + return + + merged = params_df.copy() + merged["ref"] = float(ref_df["ref"].iloc[0]) + + out_name = f"{out_prefix}_params_k_ref.csv" + try: + merged.to_csv(out_name, index=False) + print(f"Wrote parameter summary to {out_name}") + except Exception as exc: + warnings.warn(f"Could not write {out_name}: {exc}") + return + + _try_calibration(merged, "ref", out_name[:-4], "k_ref") + + +def _summarize_growth_params(run_dir, out_prefix): + """Annotate growth-model parameter files with simulated ground truth. + + Handles two independent, optionally-present ground-truth sources + written by tfs-simulate: + + - ``*_sim_growth_parameters.csv``: per-condition growth_k/growth_m/ + growth_n/growth_min/growth_max truth, joined against the matching + ``*_params_growth_{name}.csv`` on ``condition_rep``. + - ``*_sim_k_ref.csv``: the single global base_growth_data k_ref truth, + joined against ``*_params_k_ref.csv``. + + Either or both sources may be absent (real-data runs, or runs without + base_growth_data); each is silently skipped when its sim-side file + isn't found. + """ + _summarize_condition_growth_params(run_dir, out_prefix) + _summarize_k_ref(run_dir, out_prefix) + + def summarize_fit(run_dir, ref_theta_file=None, out_prefix=None): @@ -877,6 +1030,7 @@ def summarize_fit(run_dir, # --- Sim-parameter correlation CSVs --- _summarize_params(run_dir, out_prefix) + _summarize_growth_params(run_dir, out_prefix) return results diff --git a/tests/tfscreen/simulate/test_base_growth_data.py b/tests/tfscreen/simulate/test_base_growth_data.py index 96e35ba2..5f57ba14 100644 --- a/tests/tfscreen/simulate/test_base_growth_data.py +++ b/tests/tfscreen/simulate/test_base_growth_data.py @@ -4,7 +4,7 @@ import pandas as pd import pytest -from tfscreen.simulate.base_growth_data import generate_base_growth_df +from tfscreen.simulate.base_growth_data import generate_base_growth_df, generate_k_ref_df def _params_df(): @@ -117,3 +117,34 @@ def test_output_columns(): rng = np.random.default_rng(0) result = generate_base_growth_df(cfg, _params_df(), rng) assert set(result.columns) >= {"genotype", "rate", "rate_std", "rate_true"} + + +# --------------------------------------------------------------------------- +# generate_k_ref_df +# --------------------------------------------------------------------------- + +def test_k_ref_df_single_row_with_configured_value(): + cfg = {"k_ref": 0.025} + result = generate_k_ref_df(cfg) + assert len(result) == 1 + assert result.loc[0, "parameter"] == "k_ref" + assert result.loc[0, "ref"] == pytest.approx(0.025) + + +def test_k_ref_df_columns(): + cfg = {"k_ref": 0.03, "genotypes": ["wt", "A47V"]} + result = generate_k_ref_df(cfg) + assert set(result.columns) == {"parameter", "ref"} + + +def test_k_ref_df_missing_k_ref_raises(): + cfg = {"genotypes": ["wt"]} + with pytest.raises(ValueError, match="k_ref"): + generate_k_ref_df(cfg) + + +def test_k_ref_df_coerces_to_float(): + cfg = {"k_ref": "0.04"} + result = generate_k_ref_df(cfg) + assert result.loc[0, "ref"] == pytest.approx(0.04) + assert isinstance(result.loc[0, "ref"], float) diff --git a/tests/tfscreen/simulate/test_growth_parameters_output.py b/tests/tfscreen/simulate/test_growth_parameters_output.py new file mode 100644 index 00000000..53ede57d --- /dev/null +++ b/tests/tfscreen/simulate/test_growth_parameters_output.py @@ -0,0 +1,91 @@ +"""Tests for tfscreen.simulate.growth_parameters_output.generate_growth_parameters_df.""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.growth_parameters_output import generate_growth_parameters_df + + +def test_linear_model_maps_b_and_m(): + growth_cfg = { + "kanR+kan": {"model": "linear", "b": 0.005, "m": -0.01}, + } + result = generate_growth_parameters_df(growth_cfg).set_index("condition_rep") + assert result.loc["kanR+kan", "growth_k"] == pytest.approx(0.005) + assert result.loc["kanR+kan", "growth_m"] == pytest.approx(-0.01) + + +def test_linear_is_default_model_when_omitted(): + growth_cfg = {"kanR-kan": {"b": 0.02, "m": 0.001}} + result = generate_growth_parameters_df(growth_cfg).set_index("condition_rep") + assert result.loc["kanR-kan", "growth_k"] == pytest.approx(0.02) + assert result.loc["kanR-kan", "growth_m"] == pytest.approx(0.001) + + +def test_power_model_maps_b_a_n(): + growth_cfg = { + "M9+kan_hi": {"model": "power", "b": 0.001, "a": 0.04, "n": 2.0}, + } + result = generate_growth_parameters_df(growth_cfg).set_index("condition_rep") + assert result.loc["M9+kan_hi", "growth_k"] == pytest.approx(0.001) + assert result.loc["M9+kan_hi", "growth_m"] == pytest.approx(0.04) + assert result.loc["M9+kan_hi", "growth_n"] == pytest.approx(2.0) + + +def test_saturation_model_maps_kmin_kmax(): + growth_cfg = { + "M9+kan": {"model": "saturation", "kmin": 0.001, "kmax": 0.04}, + } + result = generate_growth_parameters_df(growth_cfg).set_index("condition_rep") + assert result.loc["M9+kan", "growth_min"] == pytest.approx(0.001) + assert result.loc["M9+kan", "growth_max"] == pytest.approx(0.04) + + +def test_multiple_conditions_one_row_each(): + growth_cfg = { + "kanR+kan": {"model": "linear", "b": 0.005, "m": -0.01}, + "kanR-kan": {"model": "linear", "b": 0.02, "m": 0.001}, + } + result = generate_growth_parameters_df(growth_cfg) + assert set(result["condition_rep"]) == {"kanR+kan", "kanR-kan"} + assert len(result) == 2 + + +def test_mixed_models_nan_fill_unused_columns(): + """A run mixing linear and saturation conditions produces NaN for the + columns that don't apply to a given condition's model.""" + growth_cfg = { + "linear_cond": {"model": "linear", "b": 0.005, "m": -0.01}, + "sat_cond": {"model": "saturation", "kmin": 0.001, "kmax": 0.04}, + } + result = generate_growth_parameters_df(growth_cfg).set_index("condition_rep") + assert result.loc["linear_cond", "growth_k"] == pytest.approx(0.005) + assert np.isnan(result.loc["linear_cond", "growth_min"]) + assert result.loc["sat_cond", "growth_min"] == pytest.approx(0.001) + assert np.isnan(result.loc["sat_cond", "growth_k"]) + + +def test_unknown_model_raises(): + growth_cfg = {"cond": {"model": "quadratic", "b": 1.0}} + with pytest.raises(ValueError, match="Unknown growth model"): + generate_growth_parameters_df(growth_cfg) + + +def test_missing_required_key_raises(): + growth_cfg = {"cond": {"model": "linear", "b": 0.005}} # missing 'm' + with pytest.raises(ValueError, match="missing required parameter"): + generate_growth_parameters_df(growth_cfg) + + +def test_empty_growth_cfg_returns_empty_df(): + result = generate_growth_parameters_df({}) + assert len(result) == 0 + + +def test_original_growth_cfg_not_mutated(): + """The 'model' key must not be popped from the caller's dict.""" + growth_cfg = {"cond": {"model": "linear", "b": 0.005, "m": -0.01}} + generate_growth_parameters_df(growth_cfg) + assert growth_cfg["cond"]["model"] == "linear" + assert "b" in growth_cfg["cond"] diff --git a/tests/tfscreen/simulate/test_simulate_cli.py b/tests/tfscreen/simulate/test_simulate_cli.py index f812d4f3..cfaac2d4 100644 --- a/tests/tfscreen/simulate/test_simulate_cli.py +++ b/tests/tfscreen/simulate/test_simulate_cli.py @@ -70,7 +70,7 @@ def patched_simulation(tmp_path): """Patch all I/O so run_simulation_from_config can run without real data.""" lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() - with patch("tfscreen.util.read_yaml", return_value={"seed": 99}) as mock_yaml, \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 99, "growth": {}}) as mock_yaml, \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", @@ -116,7 +116,7 @@ def test_writes_parameters_not_phenotype(tmp_path): def capture_csv(self_df, path, **kwargs): written_paths.append(str(path)) - with patch("tfscreen.util.read_yaml", return_value={"seed": 0}), \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", @@ -140,7 +140,7 @@ def test_output_file_names_include_expected_stems(tmp_path): def capture_csv(self_df, path, **kwargs): written_paths.append(str(path)) - with patch("tfscreen.util.read_yaml", return_value={"seed": 0}), \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", @@ -155,6 +155,63 @@ def capture_csv(self_df, path, **kwargs): assert stem in written, f"Expected '{stem}' CSV to be written" +# --------------------------------------------------------------------------- +# growth_parameters: always written, from cf['growth'] +# --------------------------------------------------------------------------- + +def test_growth_parameters_csv_always_written(tmp_path): + """growth_parameters CSV is written unconditionally (cf['growth'] is + always required, unlike the optional *_data blocks).""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written = {} + + def capture_csv(self_df, path, **kwargs): + written[str(path)] = self_df.copy() + + cfg = {"seed": 0, "growth": {"kanR+kan": {"model": "linear", "b": 0.005, "m": -0.01}}} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + matches = [p for p in written if "growth_parameters" in os.path.basename(p)] + assert len(matches) == 1 + result = written[matches[0]] + assert result.loc[0, "condition_rep"] == "kanR+kan" + assert result.loc[0, "growth_k"] == pytest.approx(0.005) + assert result.loc[0, "growth_m"] == pytest.approx(-0.01) + + +def test_growth_parameters_csv_written_for_real(tmp_path): + """Real (unmocked) to_csv write produces a readable growth_parameters.csv.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + cfg = {"seed": 0, "growth": {"M9+kan": {"model": "saturation", "kmin": 0.001, "kmax": 0.04}}} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df): + run_simulation_from_config("config.yaml", str(tmp_path)) + + growth_params_path = tmp_path / "tfs_sim_growth_parameters.csv" + assert growth_params_path.exists() + df = pd.read_csv(growth_params_path) + assert df.loc[0, "condition_rep"] == "M9+kan" + assert df.loc[0, "growth_min"] == pytest.approx(0.001) + assert df.loc[0, "growth_max"] == pytest.approx(0.04) + + # --------------------------------------------------------------------------- # base_growth_data: written only when configured, using parameters_df's dk_geno # --------------------------------------------------------------------------- @@ -168,7 +225,7 @@ def test_base_growth_not_written_without_config(tmp_path): def capture_csv(self_df, path, **kwargs): written_paths.append(str(path)) - with patch("tfscreen.util.read_yaml", return_value={"seed": 0}), \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", @@ -192,7 +249,7 @@ def test_base_growth_written_when_configured(tmp_path): def capture_csv(self_df, path, **kwargs): written[str(path)] = self_df.copy() - cfg = {"seed": 0, "base_growth_data": {"k_ref": 0.025}} + cfg = {"seed": 0, "growth": {}, "base_growth_data": {"k_ref": 0.025}} with patch("tfscreen.util.read_yaml", return_value=cfg), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", @@ -211,6 +268,62 @@ def capture_csv(self_df, path, **kwargs): assert float(result.loc[result["genotype"] == "wt", "rate"].iloc[0]) == pytest.approx(0.025) +# --------------------------------------------------------------------------- +# k_ref: written only alongside base_growth_data, echoing its k_ref value +# --------------------------------------------------------------------------- + +def test_k_ref_not_written_without_base_growth_config(tmp_path): + """No k_ref CSV is written when 'base_growth_data' is absent.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written_paths = [] + + def capture_csv(self_df, path, **kwargs): + written_paths.append(str(path)) + + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + basenames = "\n".join(os.path.basename(p) for p in written_paths) + assert "k_ref" not in basenames + + +def test_k_ref_written_when_base_growth_configured(tmp_path): + """A 'base_growth_data' block also produces a single-row k_ref CSV + echoing the configured k_ref value.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written = {} + + def capture_csv(self_df, path, **kwargs): + written[str(path)] = self_df.copy() + + cfg = {"seed": 0, "growth": {}, "base_growth_data": {"k_ref": 0.031}} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + k_ref_paths = [p for p in written if "k_ref" in os.path.basename(p)] + assert len(k_ref_paths) == 1 + result = written[k_ref_paths[0]] + assert result.loc[0, "parameter"] == "k_ref" + assert result.loc[0, "ref"] == pytest.approx(0.031) + + # --------------------------------------------------------------------------- # presplit_data: written only when configured # --------------------------------------------------------------------------- @@ -238,6 +351,7 @@ def test_run_simulation_writes_presplit_csv(tmp_path): cf = { "seed": 1, + "growth": {}, "cfu0": 1e8, "total_num_reads": 10_000_000, "prob_index_hop": None, @@ -275,7 +389,7 @@ def test_run_simulation_no_presplit_without_config(tmp_path): "counts": 1000, "ln_cfu_0": 10.0}]) growth_df = pd.DataFrame({"genotype": ["wt"], "ln_cfu": [10.0]}) - cf = {"seed": 1, "cfu0": 1e8, "total_num_reads": 1_000_000, + cf = {"seed": 1, "growth": {}, "cfu0": 1e8, "total_num_reads": 1_000_000, "prob_index_hop": None} with patch("tfscreen.util.read_yaml", return_value=cf), \ @@ -335,7 +449,7 @@ def test_writes_input_config_yaml(tmp_path): def capture_dump(data, fh, **kwargs): dumped["data"] = data - with patch("tfscreen.util.read_yaml", return_value={"seed": 5}), \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 5, "growth": {}}), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", @@ -357,7 +471,7 @@ def test_input_config_yaml_existence_check(tmp_path): existing_yaml = tmp_path / "tfs_sim_input-config.yaml" existing_yaml.write_text("seed: 0\n") - with patch("tfscreen.util.read_yaml", return_value={"seed": 0}), \ + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", return_value=(lib_df, pheno_df, theta_df, params_df, None)) as mock_lib: with pytest.raises(FileExistsError, match="input-config.yaml"): diff --git a/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py b/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py index f17612c6..21790cc0 100644 --- a/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py @@ -1674,6 +1674,245 @@ def test_summarize_fit_calls_summarize_params(self, run_dir): assert "ref" in df.columns +# --------------------------------------------------------------------------- +# _summarize_condition_growth_params / _summarize_k_ref / _summarize_growth_params +# --------------------------------------------------------------------------- + +from tfscreen.tfmodel.scripts.summarize_fit_cli import ( + _summarize_condition_growth_params, + _summarize_growth_params, + _summarize_k_ref, +) + + +class TestSummarizeConditionGrowthParams: + + def _write_sim_growth_params(self, path): + pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR-kan"], + "growth_k": [0.005, 0.02], + "growth_m": [-0.01, 0.001], + }).to_csv(path, index=False) + + def test_no_output_when_sim_growth_params_absent(self, tmp_path): + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + _summarize_condition_growth_params(str(tmp_path), out_prefix) + assert not any(f.name.startswith("tfs_summarize_params") + for f in (tmp_path / "summary").iterdir()) + + def test_growth_k_csv_written_with_ref(self, tmp_path): + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR-kan"], + "q0.5": [0.0048, 0.021], + }).to_csv(str(tmp_path / "run_params_growth_k.csv"), index=False) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + out_path = out_prefix + "_params_growth_k.csv" + assert os.path.exists(out_path) + df = pd.read_csv(out_path).set_index("condition_rep") + assert df.loc["kanR+kan", "ref"] == pytest.approx(0.005) + assert df.loc["kanR-kan", "ref"] == pytest.approx(0.02) + + def test_growth_m_csv_also_written(self, tmp_path): + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR-kan"], + "q0.5": [-0.009, 0.0012], + }).to_csv(str(tmp_path / "run_params_growth_m.csv"), index=False) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + out_path = out_prefix + "_params_growth_m.csv" + assert os.path.exists(out_path) + df = pd.read_csv(out_path).set_index("condition_rep") + assert df.loc["kanR+kan", "ref"] == pytest.approx(-0.01) + + def test_replicate_column_preserved_and_broadcast(self, tmp_path): + """When condition growth params are per-replicate, the same ref + broadcasts to every replicate sharing a condition_rep.""" + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR+kan"], + "replicate": [1, 2], + "q0.5": [0.0048, 0.0051], + }).to_csv(str(tmp_path / "run_params_growth_k.csv"), index=False) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + df = pd.read_csv(out_prefix + "_params_growth_k.csv") + assert list(df["ref"]) == pytest.approx([0.005, 0.005]) + assert "replicate" in df.columns + + def test_warns_when_expected_param_file_missing(self, tmp_path): + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + # deliberately omit *_params_growth_k.csv and *_params_growth_m.csv + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + assert any("growth_k" in str(x.message) for x in w) + assert any("growth_m" in str(x.message) for x in w) + + def test_only_present_columns_processed(self, tmp_path): + """A sim file with only growth_min/growth_max (saturation model) + does not look for growth_k/growth_m files.""" + pd.DataFrame({ + "condition_rep": ["M9+kan"], + "growth_min": [0.001], + "growth_max": [0.04], + }).to_csv(str(tmp_path / "run_sim_growth_parameters.csv"), index=False) + pd.DataFrame({ + "condition_rep": ["M9+kan"], + "q0.5": [0.0011], + }).to_csv(str(tmp_path / "run_params_growth_min.csv"), index=False) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + assert not any("growth_k" in str(x.message) for x in w) + assert os.path.exists(out_prefix + "_params_growth_min.csv") + + def test_pdf_written_alongside_csv(self, tmp_path): + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + pd.DataFrame({ + "condition_rep": ["kanR+kan", "kanR-kan"], + "q0.5": [0.0048, 0.021], + }).to_csv(str(tmp_path / "run_params_growth_k.csv"), index=False) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + assert os.path.exists(out_prefix + "_params_growth_k.pdf") + + def test_missing_condition_rep_column_in_params_file_warns(self, tmp_path): + self._write_sim_growth_params(str(tmp_path / "run_sim_growth_parameters.csv")) + pd.DataFrame({"genotype": ["wt"], "q0.5": [0.005]}).to_csv( + str(tmp_path / "run_params_growth_k.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_condition_growth_params(str(tmp_path), out_prefix) + assert any("condition_rep" in str(x.message) for x in w) + assert not os.path.exists(out_prefix + "_params_growth_k.csv") + + +class TestSummarizeKRef: + + def test_no_output_when_sim_k_ref_absent(self, tmp_path): + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + _summarize_k_ref(str(tmp_path), out_prefix) + assert not os.path.exists(out_prefix + "_params_k_ref.csv") + + def test_k_ref_csv_written_with_ref(self, tmp_path): + pd.DataFrame({"parameter": ["k_ref"], "ref": [0.025]}).to_csv( + str(tmp_path / "run_sim_k_ref.csv"), index=False + ) + pd.DataFrame({"parameter": ["k_ref"], "q0.5": [0.0248]}).to_csv( + str(tmp_path / "run_params_k_ref.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_k_ref(str(tmp_path), out_prefix) + out_path = out_prefix + "_params_k_ref.csv" + assert os.path.exists(out_path) + df = pd.read_csv(out_path) + assert df.loc[0, "ref"] == pytest.approx(0.025) + assert df.loc[0, "q0.5"] == pytest.approx(0.0248) + + def test_no_pdf_written_for_k_ref(self, tmp_path): + """A single point can't usefully be plotted; no correlation PDF.""" + pd.DataFrame({"parameter": ["k_ref"], "ref": [0.025]}).to_csv( + str(tmp_path / "run_sim_k_ref.csv"), index=False + ) + pd.DataFrame({"parameter": ["k_ref"], "q0.5": [0.0248]}).to_csv( + str(tmp_path / "run_params_k_ref.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_k_ref(str(tmp_path), out_prefix) + assert not os.path.exists(out_prefix + "_params_k_ref.pdf") + + def test_warns_when_params_k_ref_missing(self, tmp_path): + pd.DataFrame({"parameter": ["k_ref"], "ref": [0.025]}).to_csv( + str(tmp_path / "run_sim_k_ref.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_k_ref(str(tmp_path), out_prefix) + assert any("k_ref" in str(x.message) for x in w) + + def test_missing_ref_column_in_sim_file_warns(self, tmp_path): + pd.DataFrame({"parameter": ["k_ref"], "value": [0.025]}).to_csv( + str(tmp_path / "run_sim_k_ref.csv"), index=False + ) + pd.DataFrame({"parameter": ["k_ref"], "q0.5": [0.0248]}).to_csv( + str(tmp_path / "run_params_k_ref.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_k_ref(str(tmp_path), out_prefix) + assert any("ref" in str(x.message).lower() for x in w) + assert not os.path.exists(out_prefix + "_params_k_ref.csv") + + +class TestSummarizeGrowthParamsIntegration: + + def test_summarize_fit_calls_both_condition_and_k_ref(self, run_dir): + """summarize_fit invokes both growth-param summary paths end-to-end.""" + pd.DataFrame({ + "condition_rep": ["kanR+kan"], + "growth_k": [0.005], + }).to_csv(os.path.join(run_dir, "tfs_sim_growth_parameters.csv"), index=False) + pd.DataFrame({ + "condition_rep": ["kanR+kan"], + "q0.5": [0.0049], + }).to_csv(os.path.join(run_dir, "tfs_params_growth_k.csv"), index=False) + + pd.DataFrame({"parameter": ["k_ref"], "ref": [0.03]}).to_csv( + os.path.join(run_dir, "tfs_sim_k_ref.csv"), index=False + ) + pd.DataFrame({"parameter": ["k_ref"], "q0.5": [0.0298]}).to_csv( + os.path.join(run_dir, "tfs_params_k_ref.csv"), index=False + ) + + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + summarize_fit(run_dir) + + growth_k_csv = os.path.join(run_dir, "summary", "tfs_summarize_params_growth_k.csv") + k_ref_csv = os.path.join(run_dir, "summary", "tfs_summarize_params_k_ref.csv") + assert os.path.exists(growth_k_csv) + assert os.path.exists(k_ref_csv) + + def test_summarize_growth_params_no_crash_when_both_absent(self, tmp_path): + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + _summarize_growth_params(str(tmp_path), out_prefix) # must not raise + + # --------------------------------------------------------------------------- # _extract_quantile_data # --------------------------------------------------------------------------- From 3a6cdee2cd9d1d7386f358d41e5599ad1c9a5802 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 15:12:17 -0700 Subject: [PATCH 21/30] added script to balance ln_cfu0 for mut classes --- CLAUDE.md | 2 + docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- pyproject.toml | 1 + reports/flake.txt | 8 +- reports/junit/junit.xml | 2 +- .../simulate/scripts/report_cfu0_cli.py | 152 ++++++++++++++ .../tfscreen/simulate/test_report_cfu0_cli.py | 191 ++++++++++++++++++ 8 files changed, 354 insertions(+), 6 deletions(-) create mode 100644 src/tfscreen/simulate/scripts/report_cfu0_cli.py create mode 100644 tests/tfscreen/simulate/test_report_cfu0_cli.py diff --git a/CLAUDE.md b/CLAUDE.md index f5c8447e..b0acb7c5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -54,6 +54,7 @@ tfs-predict-theta # Predict operator occupancy tfs-cat-response # Fit categorical response curves tfs-diagnose-nan # Diagnose NaN issues in inference tfs-simulate # Simulate a full experiment +tfs-report-cfu0 # Report average ln_cfu0 by genotype class from a simulate config 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 @@ -249,6 +250,7 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/build_sample_dataframes.py` | Constructs sample/timepoint DataFrames from simulation config | | `simulate/selection_experiment.py` | Models the selection experiment (growth + sequencing) | | `simulate/scripts/simulate_cli.py` | `tfs-simulate` CLI entry point; runs `library_prediction` + `selection_experiment` across replicates and writes all output CSVs, delegating the optional `binding_data`/`presplit_data`/`base_growth_data` blocks to their respective generator modules above | +| `simulate/scripts/report_cfu0_cli.py` | `tfs-report-cfu0` CLI entry point; reuses `library_prediction` + `selection_experiment` (same pattern as `simulate_cli.py`) across `num_replicates` to report mean `ln_cfu_0` and surviving-genotype counts by class (`wt`/`spiked`/`single`/`double`), for tuning `transform_sizes`/`library_mixture`/`cfu0` against observed real-library values | | `simulate/run_simulation.py` | Simpler, non-CLI orchestrator (`run_simulation`); does not support `binding_data`/`presplit_data`/`base_growth_data` | ## YAML Standards diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 97afee55..397f274e 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.42%coverage96.42% \ No newline at end of file +coverage: 96.43%coverage96.43% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index f270cfd2..51f42da9 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3924tests3924 \ No newline at end of file +tests: 3932tests3932 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index edc2997f..b7408b03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,6 +84,7 @@ tfs-predict-theta = "tfscreen.tfmodel.scripts.predict_theta_cli:main" tfs-cat-response = "tfscreen.analysis.cat_response.scripts.cat_response_cli:main" tfs-diagnose-nan = "tfscreen.tfmodel.scripts.diagnose_nan_cli:main" tfs-simulate = "tfscreen.simulate.scripts.simulate_cli:main" +tfs-report-cfu0 = "tfscreen.simulate.scripts.report_cfu0_cli:main" tfs-setup-sim-grid = "tfscreen.simulate.scripts.setup_sim_grid_cli:main" tfs-setup-grid = "tfscreen.tfmodel.scripts.setup_grid_cli:main" tfs-summarize-grid = "tfscreen.tfmodel.scripts.summarize_grid_cli:main" diff --git a/reports/flake.txt b/reports/flake.txt index f9e71df7..c0aee514 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -5160,6 +5160,8 @@ ./tests/tfscreen/simulate/test_presplit_data.py:155:32: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_presplit_data.py:157:32: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_presplit_data.py:159:36: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_report_cfu0_cli.py:5:1: F401 'pytest' imported but unused +./tests/tfscreen/simulate/test_report_cfu0_cli.py:131:26: E741 ambiguous variable name 'l' ./tests/tfscreen/simulate/test_run_simulation.py:3:1: F401 'os' imported but unused ./tests/tfscreen/simulate/test_run_simulation.py:5:1: F401 'unittest.mock.MagicMock' imported but unused ./tests/tfscreen/simulate/test_run_simulation.py:7:1: F401 'tfscreen.util' imported but unused @@ -7677,8 +7679,8 @@ 2 E713 test for membership should be 'not in' 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def -20 E741 ambiguous variable name 'l' -229 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +21 E741 ambiguous variable name 'l' +230 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 42 F841 local variable 'e' is assigned to but never used @@ -7686,4 +7688,4 @@ 85 W292 no newline at end of file 1583 W293 blank line contains whitespace 30 W391 blank line at end of file -7640 +7642 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 8af0115f..eb9aade3 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/simulate/scripts/report_cfu0_cli.py b/src/tfscreen/simulate/scripts/report_cfu0_cli.py new file mode 100644 index 00000000..a74b9afe --- /dev/null +++ b/src/tfscreen/simulate/scripts/report_cfu0_cli.py @@ -0,0 +1,152 @@ +import numpy as np +import pandas as pd + +import tfscreen +from tfscreen.simulate import library_prediction, selection_experiment +from tfscreen.util.cli.generalized_main import generalized_main + +_CLASS_ORDER = ["wt", "spiked", "single", "double", "other"] + + +def _classify_genotypes(library_df): + """ + Map each unique genotype in library_df to a class. + + Classes (in priority order): 'wt' (genotype == "wt"), 'spiked' (any row + for this genotype has library_origin == "spiked"), 'single'/'double' + (one/two "/"-separated mutations), 'other' (anything else, e.g. triple + mutants). + + Parameters + ---------- + library_df : pandas.DataFrame + Must have "genotype" and "library_origin" columns. Should be the + un-expanded library_df returned by library_prediction (one row per + genotype per library_origin it was actually drawn from). + + Returns + ------- + dict + Maps genotype (str) -> class (str). + """ + + origins_by_geno = library_df.groupby("genotype", observed=True)["library_origin"].apply(set) + + def classify(g): + if g == "wt": + return "wt" + if "spiked" in origins_by_geno.get(g, set()): + return "spiked" + num_muts = g.count("/") + 1 + if num_muts == 1: + return "single" + if num_muts == 2: + return "double" + return "other" + + return {g: classify(g) for g in origins_by_geno.index} + + +def report_cfu0(config_file, num_replicates=5, seed=None): + """ + Report average ln_cfu0 by genotype class from a simulate config. + + Runs library_prediction once to get ground-truth phenotypes, then runs + selection_experiment num_replicates times (mirroring tfs-simulate's + replicate loop, each with an independent seed) to sample independent + transformation draws. Genotypes are grouped into four classes -- wt, + spiked (non-wt), single (non-spiked), double (non-spiked) -- and, for + each class, this prints the number of genotypes present in the library, + the mean (across replicates) number of genotypes that survive + transformation (nonzero cfu0), and the mean/std of ln_cfu0 pooled across + all replicates. Results are printed to stdout. + + Parameters + ---------- + config_file : str + Path to the YAML simulate configuration file. + num_replicates : int + Number of independent simulated transformation replicates to average + over. Default 5. + seed : int, optional + Random seed. Overrides the seed in the config file when provided. + """ + + cf = tfscreen.util.read_yaml(config_file) + if seed is not None: + cf["seed"] = seed + + base_seed = cf.get("seed", None) + + library_df, phenotype_df, genotype_theta_df, parameters_df, binding_theta_df = \ + library_prediction(cf) + + geno_class = _classify_genotypes(library_df) + n_in_library = pd.Series(geno_class).value_counts() + + all_rows = [] + for rep in range(1, num_replicates + 1): + print(f"--- Replicate {rep} of {num_replicates} ---", flush=True) + + # Give each replicate a distinct (but reproducible) random seed, same + # convention as tfs-simulate. + rep_cf = dict(cf) + rep_cf["seed"] = ( + base_seed * num_replicates + rep if base_seed is not None else None + ) + + rep_phenotype_df = phenotype_df.copy() + rep_phenotype_df["replicate"] = rep + + sample_df_rep, counts_df_rep = selection_experiment( + rep_cf, library_df, rep_phenotype_df + ) + + # ln_cfu_0 is constant across all samples for a given (genotype, + # replicate, library) -- it is set by transformation, not growth -- + # so recover replicate/library from sample_df and dedupe down to one + # row per independent transformation draw. + merged = pd.merge( + counts_df_rep, + sample_df_rep[["sample", "replicate", "library"]], + on="sample", + how="left", + ) + deduped = merged.drop_duplicates(subset=["genotype", "replicate", "library"]) + all_rows.append(deduped[["genotype", "replicate", "library", "ln_cfu_0"]]) + + combined = pd.concat(all_rows, ignore_index=True) + combined["genotype"] = combined["genotype"].astype(str) + combined["class"] = combined["genotype"].map(geno_class) + + print() + header = (f"{'class':<8} {'n_library':>10} {'mean_n_observed':>16} " + f"{'mean_ln_cfu0':>14} {'std_ln_cfu0':>12}") + print(header) + print("-" * len(header)) + + for cls in _CLASS_ORDER: + cls_rows = combined[combined["class"] == cls] + if cls_rows.empty and cls not in n_in_library.index: + continue + + n_lib = int(n_in_library.get(cls, 0)) + + finite = cls_rows[np.isfinite(cls_rows["ln_cfu_0"])] + + n_observed_per_rep = finite.groupby("replicate")["genotype"].nunique() + mean_n_observed = ( + n_observed_per_rep + .reindex(range(1, num_replicates + 1), fill_value=0) + .mean() + ) + + mean_ln_cfu0 = finite["ln_cfu_0"].mean() if not finite.empty else float("nan") + std_ln_cfu0 = finite["ln_cfu_0"].std() if not finite.empty else float("nan") + + print(f"{cls:<8} {n_lib:>10} {mean_n_observed:>16.1f} " + f"{mean_ln_cfu0:>14.2f} {std_ln_cfu0:>12.2f}") + + +def main(): + return generalized_main(report_cfu0, manual_arg_types={"seed": int}) diff --git a/tests/tfscreen/simulate/test_report_cfu0_cli.py b/tests/tfscreen/simulate/test_report_cfu0_cli.py new file mode 100644 index 00000000..d1d4edb9 --- /dev/null +++ b/tests/tfscreen/simulate/test_report_cfu0_cli.py @@ -0,0 +1,191 @@ +"""Tests for tfs-report-cfu0 CLI (report_cfu0).""" + +import numpy as np +import pandas as pd +import pytest +from unittest.mock import patch + +from tfscreen.simulate.scripts.report_cfu0_cli import ( + report_cfu0, + _classify_genotypes, +) +from tfscreen.util.cli.generalized_main import generalized_main + + +# --------------------------------------------------------------------------- +# _classify_genotypes +# --------------------------------------------------------------------------- + +def test_classify_genotypes_basic_classes(): + library_df = pd.DataFrame({ + "genotype": ["wt", "wt", "A1V", "A1V/B2C", "C3D", "wt"], + "library_origin": ["single-1", "double-1-2", "single-1", "double-1-2", + "spiked", "spiked"], + }) + result = _classify_genotypes(library_df) + assert result["wt"] == "wt" + assert result["A1V"] == "single" + assert result["A1V/B2C"] == "double" + assert result["C3D"] == "spiked" + + +def test_classify_genotypes_wt_beats_spiked(): + """A literal 'wt' genotype is always classified 'wt', even if it also + appears under a 'spiked' library_origin.""" + library_df = pd.DataFrame({ + "genotype": ["wt", "wt"], + "library_origin": ["single-1", "spiked"], + }) + result = _classify_genotypes(library_df) + assert result["wt"] == "wt" + + +def test_classify_genotypes_triple_mutant_is_other(): + library_df = pd.DataFrame({ + "genotype": ["A1V/B2C/D3E"], + "library_origin": ["double-1-2"], + }) + result = _classify_genotypes(library_df) + assert result["A1V/B2C/D3E"] == "other" + + +# --------------------------------------------------------------------------- +# report_cfu0 +# --------------------------------------------------------------------------- + +def _make_library_and_phenotype(): + library_df = pd.DataFrame({ + "genotype": ["wt", "A1V", "A1V/B2C", "C3D"], + "library_origin": ["single-1", "single-1", "double-1-2", "spiked"], + }) + phenotype_df = pd.DataFrame({"genotype": ["wt", "A1V", "A1V/B2C", "C3D"]}) + theta_df = pd.DataFrame({"genotype": ["wt", "A1V", "A1V/B2C", "C3D"]}) + params_df = pd.DataFrame({ + "genotype": ["wt", "A1V", "A1V/B2C", "C3D"], + "dk_geno": [0.0, 0.0, 0.0, 0.0], + "activity": [1.0, 1.0, 1.0, 1.0], + }) + return library_df, phenotype_df, theta_df, params_df + + +def _make_selection_experiment_result(rep): + """Fake one replicate's (sample_df, counts_df), with a distinct ln_cfu_0 + per genotype so we can check pooling/averaging.""" + sample_df = pd.DataFrame( + [{"sample": 0, "replicate": rep, "library": "kanR"}], + index=[0], + ) + counts_df = pd.DataFrame([ + {"sample": 0, "genotype": "wt", "ln_cfu_0": 14.0, "counts": 100}, + {"sample": 0, "genotype": "A1V", "ln_cfu_0": 8.0, "counts": 100}, + {"sample": 0, "genotype": "A1V/B2C", "ln_cfu_0": 1.4, "counts": 100}, + {"sample": 0, "genotype": "C3D", "ln_cfu_0": -np.inf, "counts": 0}, + ]) + return sample_df, counts_df + + +def test_report_cfu0_prints_expected_classes(capsys): + library_df, phenotype_df, theta_df, params_df = _make_library_and_phenotype() + + call_count = {"n": 0} + + def fake_selection_experiment(cf, lib_df, pheno_df): + call_count["n"] += 1 + rep = pheno_df["replicate"].iloc[0] + return _make_selection_experiment_result(rep) + + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.library_prediction", + return_value=(library_df, phenotype_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.selection_experiment", + side_effect=fake_selection_experiment): + report_cfu0("config.yaml", num_replicates=2) + + assert call_count["n"] == 2 + + out = capsys.readouterr().out + assert "wt" in out + assert "single" in out + assert "double" in out + assert "spiked" in out + + +def test_report_cfu0_excludes_infinite_ln_cfu0_from_mean(capsys): + """C3D never survives transformation (-inf ln_cfu_0 in every replicate); + its class ('spiked') should report mean_n_observed == 0 and no crash from + averaging -inf.""" + library_df, phenotype_df, theta_df, params_df = _make_library_and_phenotype() + + def fake_selection_experiment(cf, lib_df, pheno_df): + rep = pheno_df["replicate"].iloc[0] + return _make_selection_experiment_result(rep) + + with patch("tfscreen.util.read_yaml", return_value={"seed": 0, "growth": {}}), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.library_prediction", + return_value=(library_df, phenotype_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.selection_experiment", + side_effect=fake_selection_experiment): + report_cfu0("config.yaml", num_replicates=3) + + out = capsys.readouterr().out + spiked_line = [l for l in out.splitlines() if l.startswith("spiked")][0] + fields = spiked_line.split() + # class, n_library, mean_n_observed, mean_ln_cfu0, std_ln_cfu0 + assert fields[0] == "spiked" + assert fields[1] == "1" + assert fields[2] == "0.0" + assert fields[3] == "nan" + + +def test_report_cfu0_seed_overrides_config(): + library_df, phenotype_df, theta_df, params_df = _make_library_and_phenotype() + + captured_seeds = [] + + def fake_selection_experiment(cf, lib_df, pheno_df): + captured_seeds.append(cf["seed"]) + rep = pheno_df["replicate"].iloc[0] + return _make_selection_experiment_result(rep) + + with patch("tfscreen.util.read_yaml", return_value={"seed": 99, "growth": {}}), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.library_prediction", + return_value=(library_df, phenotype_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.report_cfu0_cli.selection_experiment", + side_effect=fake_selection_experiment): + report_cfu0("config.yaml", num_replicates=2, seed=7) + + # base_seed becomes 7 (override), then rep seed = base_seed*num_replicates+rep + assert captured_seeds == [7 * 2 + 1, 7 * 2 + 2] + + +# --------------------------------------------------------------------------- +# --seed CLI argument +# --------------------------------------------------------------------------- + +def test_seed_cli_parsed_as_int(): + captured = {} + + def fake_run(config_file, num_replicates=5, seed=None): + captured["seed"] = seed + + generalized_main( + fake_run, + argv=["config.yaml", "--seed", "42"], + manual_arg_types={"seed": int}, + ) + assert captured["seed"] == 42 + assert isinstance(captured["seed"], int) + + +def test_seed_cli_defaults_to_none(): + captured = {} + + def fake_run(config_file, num_replicates=5, seed=None): + captured["seed"] = seed + + generalized_main( + fake_run, + argv=["config.yaml"], + manual_arg_types={"seed": int}, + ) + assert captured["seed"] is None From 19018b3400d9de72683152ba347df46ee45d2007 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 15:51:42 -0700 Subject: [PATCH 22/30] added new data input docs --- docs/source/analysis.rst | 5 +- docs/source/index.rst | 5 + docs/source/model-inputs.rst | 237 +++++++++++++++++++++++++++++++++++ 3 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 docs/source/model-inputs.rst diff --git a/docs/source/analysis.rst b/docs/source/analysis.rst index b9c25da4..e9949892 100644 --- a/docs/source/analysis.rst +++ b/docs/source/analysis.rst @@ -26,7 +26,10 @@ model components, and writes three configuration files: * ``{out_prefix}_guesses.csv`` — initial-value guesses for array parameters ``binding_df`` (direct binding measurements) is the only required argument. -``growth_df`` is optional; omitting it configures a binding-only model. +``growth_df`` is optional; omitting it configures a binding-only model. See +:doc:`model-inputs` for what each input contributes to the fit, how much +data is useful, and the exact file format for ``binding_df``, ``growth_df``, +``base_growth_df``, ``presplit_df``, and ``transformation_lambda``. .. code-block:: bash diff --git a/docs/source/index.rst b/docs/source/index.rst index ad036cab..18efbd57 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,6 +11,7 @@ tfscreen quickstart simulation process-raw + model-inputs analysis summarize-fit grid @@ -46,6 +47,10 @@ Raw Data Processing ------------------- `tfscreen` includes utilities to convert raw sequencing data into quantitative inputs for analysis. See the :doc:`process-raw` page for more details. +Model Input Data +----------------- +The hierarchical model accepts binding, growth, base-growth, pre-split, and congression-calibration data. See the :doc:`model-inputs` page for what each contributes, how much is useful, and how to pass it in. + Analysis -------- `tfscreen` provides robust statistical tools, including Bayesian hierarchical models, to extract biochemical parameters from screen data. See the :doc:`analysis` page for more details. diff --git a/docs/source/model-inputs.rst b/docs/source/model-inputs.rst new file mode 100644 index 00000000..f278ff6d --- /dev/null +++ b/docs/source/model-inputs.rst @@ -0,0 +1,237 @@ +================= +Model Input Data +================= + +``tfs-configure-model`` (see :doc:`analysis`, Step 1) accepts up to five +pieces of experimental input. Only ``binding_df`` is strictly required; +everything else is optional and adds additional constraints to the +model. This page describes what each input contributes to the fit, the +rough amount of data that is useful in practice, and how it is passed in. + +.. list-table:: + :header-rows: 1 + :widths: 20 15 65 + + * - Input + - Required? + - What it anchors + * - ``binding_df`` + - Yes + - Absolute scale/shape of *θ*, independent of growth + * - ``growth_df`` + - No (binding-only model if omitted) + - ln_cfu\ :sub:`0`, dk_geno, activity, and *θ* jointly, via growth rate + * - ``base_growth_df`` + - No + - The condition-growth baseline / dk_geno identifiability confound + * - ``presplit_df`` + - No + - ln_cfu\ :sub:`0` directly, from pre-split sequencing counts + * - ``transformation_lambda`` + - No (required by some ``transformation_model`` choices) + - The congression-correction prior + +Binding Data (``binding_df``) +============================== + +**Role** + +Direct, low-throughput measurements of operator occupancy (*θ*) as a +function of titrant concentration, independent of any growth-rate +observation. Because it measures *θ* directly rather than through the +growth likelihood, binding data anchors the absolute scale and shape of +the occupancy curve — resolving degeneracies (e.g. between *θ* and +activity *A*) that growth data alone cannot separate. It is the only +required input to ``tfs-configure-model``: with ``growth_df`` omitted, a +binding-only model is configured that infers *θ* from ``binding_df`` +alone. + +**Scale** + +Binding curves are comparatively expensive to collect, so useful fits +typically rely on **dozens** of measured genotype/titrant curves (e.g. a +handful of calibration genotypes each measured across ~5-10 titrant +concentrations) rather than a full library. Because growth data typically +outnumber binding rows by several orders of magnitude, the binding +log-likelihood is upweighted by ``binding_weight`` (auto-computed as +``N_growth_rows / N_binding_rows`` unless overridden) so each binding +observation carries a comparable gradient contribution to the average +growth observation. + +**Format** + +A CSV (or ``pd.DataFrame``) with one row per (genotype, titrant_name, +titrant_conc) measurement: + +.. list-table:: + :header-rows: 1 + :widths: 25 75 + + * - Column + - Meaning + * - ``genotype`` + - Genotype string (``wt``, ``M42I``, ``M42I/K84L``, ...) + * - ``titrant_name`` + - Name of the titrant (matches ``growth_df`` naming when both are used) + * - ``titrant_conc`` + - Titrant concentration (float) + * - ``theta_obs`` + - Measured fractional occupancy, in [0, 1] + * - ``theta_std`` + - Standard deviation / uncertainty of ``theta_obs`` + +Passed as the required positional argument: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv + +Growth Data (``growth_df``) +============================== + +**Role** + +High-throughput growth-rate observations (``ln_cfu`` over time, per +genotype/replicate/condition), produced by ``tfs-process-counts`` or +``tfs-simulate``. This is the primary data source: it is what makes the +approach *high-throughput*, and it jointly identifies ln_cfu\ :sub:`0`, +``dk_geno`` (pleiotropic growth effect), activity, and *θ* through the +growth likelihood +``ln_cfu = ln_cfu0 + (k_pre + dk_geno + m_pre·A·θ)·t_pre + (k_sel + dk_geno + m_sel·A·θ)·t_sel``. +Omitting it configures a binding-only model (see above). + +**Scale** + +Growth data is cheap per-genotype relative to binding data, since a +single sequencing run reports abundances for the whole library +simultaneously. Useful fits typically involve **hundreds of thousands** +of rows — the product of library size (thousands of genotypes), +replicates, conditions, titrant concentrations, and timepoints. + +**Format** + +A CSV with exactly the schema produced by ``tfs-process-counts`` / +``tfs-simulate``; see :doc:`process-raw` for the full column +specification (``genotype``, ``library``, ``replicate``, +``condition_pre``, ``condition_sel``, ``titrant_name``, ``titrant_conc``, +``t_pre``, ``t_sel``, ``ln_cfu``, ``ln_cfu_std``). + +Passed via the optional flag: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv + +base_growth Data (``base_growth_df``) +======================================== + +**Role** + +Direct, reference-condition growth-rate measurements for a small subset +of genotypes (``wt`` at minimum). The ``condition_growth`` components' +per-condition baseline (*k*) and the per-genotype pleiotropic effect +(``dk_geno``) are only jointly identified up to an additive constant — +``k += C, dk_geno -= C`` leaves the growth likelihood unchanged. Because +``dk_geno`` is fixed to 0 for ``wt``, a direct measurement of wt's growth +rate anchors the new ``k_ref`` scalar via +``rate_obs ~ Normal(k_ref + dk_geno, rate_std)``, resolving this +identifiability confound. See the **Per-condition growth priors** section +of ``CLAUDE.md`` for the full mechanism (this is the complementary, +insufficient-alone anchor; per-condition priors pinned during +``tfs-prefit-calibration`` are the primary fix). + +**Scale** + +Small. ``wt`` is required after filtering against ``growth_df``; beyond +that, ``base_growth_df`` may cover anywhere from just ``wt`` up to a +handful of additional genotypes. Multiple rows for the same genotype are +combined via inverse-variance weighting. + +**Format** + +.. list-table:: + :header-rows: 1 + :widths: 25 75 + + * - Column + - Meaning + * - ``genotype`` + - Genotype string; rows not present in ``growth_df`` are dropped + * - ``rate`` + - Measured reference-condition growth rate + * - ``rate_std`` + - Standard deviation of ``rate``. **Must be strictly positive** — a + value of 0 (e.g. from an unset ``noise`` in simulated data) causes + a division-by-zero that surfaces as a NaN-prior crash the first + time the model is traced (at ``tfs-prefit-calibration`` or + ``tfs-fit-model``, not at ``tfs-configure-model`` time). + +Passed via the optional flag: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv \ + --base_growth_df base_growth.csv + +Pre-split Data (``presplit_df``) +=================================== + +**Role** + +Sequencing-derived abundance measurements taken *before* the library is +divided into separate selection conditions (t = -t_pre). Genotypes it +covers get a direct constraint on their initial population +(ln_cfu\ :sub:`0`) instead of relying solely on the extrapolation implicit +in the growth-rate fit. + +**Scale** + +Ideally the whole library, since it is collected from a single pooled +sample at one timepoint (cheap relative to a full growth time-course). +Genotypes present in ``growth_df`` but absent from ``presplit_df`` are +not an error — they are kept and their ln_cfu\ :sub:`0` is masked out of +this constraint. + +**Format** + +Produced by ``tfs-process-presplit``; see :doc:`process-raw` for the full +column specification (``library``, ``replicate``, ``condition_pre``, +``genotype``, ``ln_cfu``, ``ln_cfu_std``). + +Passed via the optional flag: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv \ + --presplit_df presplit.csv + +transformation_lambda +======================== + +**Role** + +Not a data file — a single experimentally measured ``(mean, std)`` pair +describing plasmid congression (multiple plasmids entering one cell +during transformation), in linear space (e.g. ``(0.36, 0.05)``). It is +used to moment-match a LogNormal prior for the transformation model's +lambda parameter, replacing the manual step of hand-editing the priors +and guesses CSVs with rescaled log-space values. See +:ref:`model-components`'s Transformation Correction section for what the +``empirical``/``logit_norm``/``single`` models each do with it. + +**Scale** + +A single measurement (one mean, one uncertainty) from an independent +congression-rate experiment — not a per-genotype or per-row dataset. + +**Format** + +Passed directly as two floats via ``--transformation_lambda``, required +when ``--transformation_model`` is ``empirical`` or ``logit_norm``, and +forbidden (must be omitted) when it is ``single``: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv \ + --transformation_model empirical \ + --transformation_lambda 0.36 0.05 From 36e41773ac4fadbf867c35ddb20bf84898128f55 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 15:58:43 -0700 Subject: [PATCH 23/30] doc/readme/docstring consistency update --- docs/source/analysis.rst | 3 +- docs/source/ligandmpnn-features.rst | 132 +++++++++++------- scripts/generate_struct_ensemble.py | 2 +- .../tfmodel/scripts/configure_model_cli.py | 15 +- 4 files changed, 95 insertions(+), 57 deletions(-) diff --git a/docs/source/analysis.rst b/docs/source/analysis.rst index e9949892..bbf1fabc 100644 --- a/docs/source/analysis.rst +++ b/docs/source/analysis.rst @@ -44,7 +44,7 @@ Key component flags (see :ref:`model-components` for the full list): * ``--activity_model`` — per-genotype TF activity prior (default: ``horseshoe_geno``) * ``--theta_model`` — operator occupancy parameterisation (default: ``hill_geno``) * ``--dk_geno_model`` — pleiotropic growth-effect prior (default: ``hierarchical_geno``) -* ``--transformation_model`` — multi-plasmid congression correction (default: ``empirical``) +* ``--transformation_model`` — multi-plasmid congression correction (default: ``single``, i.e. no correction) Step 2: Pre-fit Calibration (``tfs-prefit-calibration``) --------------------------------------------------------- @@ -302,6 +302,7 @@ occupancy (*dk_geno*). * **hierarchical_geno** (default) — per-genotype effects drawn from a global prior * **fixed** — no genotype-specific pleiotropic effects +* **pinned** — genotype-specific effects pinned to externally supplied values Activity (``--activity_model``) --------------------------------- diff --git a/docs/source/ligandmpnn-features.rst b/docs/source/ligandmpnn-features.rst index b99046e5..1469cf82 100644 --- a/docs/source/ligandmpnn-features.rst +++ b/docs/source/ligandmpnn-features.rst @@ -2,11 +2,14 @@ LigandMPNN Features =================== -Some tfscreen theta components (e.g. ``thermo.O2_C4_K3_U0_a.PnnC``) use per-position +Some tfscreen theta components (the ``PnnC`` prior variants, e.g. +``thermo.O2_C4_K3_U0_a.PnnC``, ``thermo.O2_C4_K3_U1_a.PnnC``, +``thermo.O2_C12_K5_U0_a.PnnC``, ``thermo.O2_C12_K5_U1_a.PnnC``) use per-residue log-probability features from `LigandMPNN -`_ as structural inputs. These +`_, together with a Cα contact-distance +map, as structural inputs to a neural-network-informed ΔΔG prior. These features are computed once — outside the main tfscreen environment — and -stored in an NPZ file that is read at analysis time. +stored in an HDF5 file that is read at analysis time. .. warning:: @@ -23,12 +26,12 @@ Overview The feature generation pipeline is a two-step, two-environment workflow: -1. **LigandMPNN environment** — run ``tfs-generate-ligandmpnn-features`` to - score each PDB structure and write an NPZ feature file. -2. **tfscreen environment** — run the hierarchical model as usual; point the - relevant theta component at the NPZ file via the run config YAML. +1. **LigandMPNN environment** — run ``scripts/generate_struct_ensemble.py`` to + score each PDB structure and write an HDF5 feature file. +2. **tfscreen environment** — run the hierarchical model as usual, pointing + ``--thermo_data`` at the HDF5 file. -The NPZ file is a permanent, reusable artifact. You only need to regenerate +The HDF5 file is a permanent, reusable artifact. You only need to regenerate it if you change the input PDB files or the LigandMPNN model weights. Installation @@ -40,13 +43,12 @@ environment (LigandMPNN requires Python 3.11 and specific PyTorch pinning). **Do not install tfscreen** in that environment — the two packages have incompatible NumPy and JAX dependencies. -The feature generator is a standalone script that requires only ``numpy`` and -``PyYAML``, both of which are already available in any environment that can -run LigandMPNN. Copy or clone the tfscreen repository and run the script -directly:: +The feature generator additionally requires ``h5py``, ``PyYAML``, and +``scipy`` on top of what LigandMPNN itself needs. Copy or clone the tfscreen +repository and run the script directly:: conda activate ligandmpnn_env - python /path/to/tfscreen/scripts/generate_ligandmpnn_features.py ... + python /path/to/tfscreen/scripts/generate_struct_ensemble.py ... Preparing Inputs ---------------- @@ -54,22 +56,28 @@ Preparing Inputs structures YAML ^^^^^^^^^^^^^^^ -Create a YAML file that maps short structure names to PDB file paths. The -names must match what the downstream theta component expects. For -``lac_dimer_nn_mut`` the required keys are ``H``, ``HD``, ``L``, and ``LE2``, -representing the four thermodynamic states: +Create a YAML file with a top-level ``structures:`` mapping from short +structure names to PDB file paths, plus ``n_chains_bearing_mut`` (the number +of chains that carry each mutation: ``1`` for a monomer, ``2`` for a +homodimer). The structure names must match what the downstream theta +component expects. For the four-state (``O2_C4_*``) topologies the required +keys are ``H``, ``HD``, ``L``, and ``LE2``, representing the four +thermodynamic states: .. code-block:: yaml - H: /path/to/H_apo.pdb - HD: /path/to/HD_dna_bound.pdb - L: /path/to/L_allosteric.pdb - LE2: /path/to/LE2_iptg_bound.pdb + n_chains_bearing_mut: 2 + structures: + H: /path/to/H_apo.pdb + HD: /path/to/HD_dna_bound.pdb + L: /path/to/L_allosteric.pdb + LE2: /path/to/LE2_iptg_bound.pdb Each PDB must contain the full protein chain(s) in the conformation appropriate for that state. LigandMPNN scores every amino acid position in the PDB, so make sure the chain contains only the residues you intend -to score. +to score. All chains across all PDB files must share the same residue +numbering scheme (the script does not verify this). PDB residue numbering ^^^^^^^^^^^^^^^^^^^^^ @@ -77,16 +85,15 @@ PDB residue numbering Mutation labels used by the theta component follow the convention ``{wt_aa}{PDB_resnum}{mut_aa}`` (e.g. ``A42G``). The residue numbers must match the ``ATOM`` record numbers in the PDB files — not a zero-based index. -Verify that your PDB files use consistent numbering across all four -structures. +Verify that your PDB files use consistent numbering across all structures. Running the Feature Generator ------------------------------ +------------------------------ Activate the LigandMPNN environment, then run:: - python /path/to/tfscreen/scripts/generate_ligandmpnn_features.py structures.yaml \ - --out features.npz \ + python /path/to/tfscreen/scripts/generate_struct_ensemble.py structures.yaml \ + --out ensemble.h5 \ --ligandmpnn_dir /path/to/LigandMPNN \ [--model_type ligand_mpnn] \ [--checkpoint /path/to/weights.pt] \ @@ -96,11 +103,11 @@ Activate the LigandMPNN environment, then run:: **Required arguments** ``structures.yaml`` - Path to the YAML file mapping structure names to PDB paths (see above). + Path to the YAML file mapping structure names to PDB paths, plus + ``n_chains_bearing_mut`` (see above). -``--out features.npz`` - Output file. A single NPZ is written containing one array per structure - name and one residue-number index array per structure. +``--out ensemble.h5`` + Output HDF5 file. ``--ligandmpnn_dir`` Path to the root of the LigandMPNN repository (the directory that @@ -125,25 +132,52 @@ Activate the LigandMPNN environment, then run:: ``--seed`` Random seed passed to LigandMPNN. Default: ``42``. -NPZ file contents -^^^^^^^^^^^^^^^^^ +A companion provenance YAML (recording the input structures, LigandMPNN +settings, and generation timestamp) is written alongside the HDF5 file. -For each structure name ``{name}`` the NPZ contains: +HDF5 file contents +^^^^^^^^^^^^^^^^^^^ -``{name}`` - ``float32`` array of shape ``(L, 20)``: mean log P(AA | structure, - context) averaged over all decoding-order batches. Columns follow the - LigandMPNN / ProteinMPNN alphabet ``ACDEFGHIKLMNPQRSTVWY`` (indices 0–19). - -``{name}_residue_nums`` - ``int32`` array of shape ``(L,)``: PDB residue numbers for each row, - used to look up positions by mutation label. +``structure_names`` + Dataset of structure names, in the order they appear in the input YAML. -Using the NPZ in a Run Config ------------------------------ +For each structure name ``{name}`` the file contains a group with: -Point the ``ligandmpnn_features`` field in your run config YAML at the NPZ -file. The exact field name depends on the theta component; for -``lac_dimer_nn_mut`` it is typically set under the theta component block. -Refer to the component's ``get_hyperparameters()`` for the full list of -required config keys. +``{name}/logP`` + ``float32`` array of shape ``(L, 20)``: mean log P(AA | structure, + context), averaged across chains and over all decoding-order batches. + Columns follow the LigandMPNN / ProteinMPNN alphabet + ``ACDEFGHIKLMNPQRSTVWY`` (indices 0–19). + +``{name}/residue_nums`` + ``int32`` array of shape ``(L,)``: PDB residue numbers for each row + (sorted, unique), used to look up positions by mutation label. + +``{name}/dist_matrix`` + ``float32`` array of shape ``(L, L)``: minimum Cα–Cα distance in Å + across all chain-pair combinations, indexed the same way as + ``residue_nums``. Used to build distance-dependent contact features for + pairwise epistasis terms. + +``{name}/n_chains_bearing_mut`` + ``int32`` scalar: the ``n_chains_bearing_mut`` value from the input YAML. + +Using the HDF5 File in a Run Config +------------------------------------ + +Pass the HDF5 file to ``tfs-configure-model`` via ``--thermo_data`` when +selecting a ``PnnC`` theta component: + +.. code-block:: bash + + tfs-configure-model binding.csv --growth_df growth.csv \ + --theta_model thermo.O2_C4_K3_U0_a.PnnC \ + --thermo_data ensemble.h5 + +The path is saved into ``tfs_configure_config.yaml`` as the top-level +``thermo_data`` key and read by ``tfscreen.tfmodel.generative.components.theta.thermo.io.load_struct_ensemble`` +at model-build time; you do not need to edit the config by hand. See +``configure_model_cli.py``'s ``thermo_data`` docstring for the full set of +registry keys and their structure-name requirements (``PddG`` models instead +take a hand-supplied ΔΔG CSV via the same flag — see +``load_ddG_prior_csv``). diff --git a/scripts/generate_struct_ensemble.py b/scripts/generate_struct_ensemble.py index 654fc207..1bed94cd 100644 --- a/scripts/generate_struct_ensemble.py +++ b/scripts/generate_struct_ensemble.py @@ -35,7 +35,7 @@ Usage ----- python generate_struct_ensemble.py structures.yaml \\ - --out ensemble.npz \\ + --out ensemble.h5 \\ --ligandmpnn_dir /path/to/LigandMPNN \\ [--model_type ligand_mpnn] \\ [--checkpoint /path/to/weights.pt] \\ diff --git a/src/tfscreen/tfmodel/scripts/configure_model_cli.py b/src/tfscreen/tfmodel/scripts/configure_model_cli.py index 87004862..760b3df6 100644 --- a/src/tfscreen/tfmodel/scripts/configure_model_cli.py +++ b/src/tfscreen/tfmodel/scripts/configure_model_cli.py @@ -122,7 +122,8 @@ def configure_model(binding_df, dk_geno_model : str, optional Model to use to describe dk_geno, the pleiotropic effect of a genotype on growth, independent of occupancy. Allowed values are - 'hierarchical_geno' (default) or 'fixed'. + 'hierarchical_geno' (default), 'fixed', or 'pinned' (dk_geno fixed to + externally supplied per-genotype values for a subset of genotypes). activity_model : str, optional Model to use to describe activity, a scalar multiplied against occupancy that defines how strongly a genotype alters transcription @@ -178,11 +179,13 @@ def configure_model(binding_df, thermo_data : str, optional Path to the structural/thermodynamic data file. Required when ``theta_model`` is a thermo-based model; ignored otherwise. For - ``*_lnK_nn_prior`` models this must be the HDF5 file produced by - ``scripts/generate_struct_ensemble.py``. For ``*_lnK_ddG_prior`` - models this must be a CSV file with a ``mut`` column and one column per - structure (``H``, ``HO``, ``L``, ``LO``, ``HE2``, ``LE2``) containing - pre-computed ΔΔG prior means. + ``PnnC`` models this must be the HDF5 file produced by + ``scripts/generate_struct_ensemble.py``. For ``PddG`` models this + must be a CSV file with a ``mut`` column and one column per + structure containing pre-computed ΔΔG prior means; the required + structure columns depend on the topology -- ``O2_C4_*`` models use + (``H``, ``HD``, ``L``, ``LE2``) while ``O2_C12_*`` models use + (``H``, ``HO``, ``L``, ``LO``, ``HE2``, ``LE2``). batch_size : int, optional Mini-batch size for SVI. Defaults to 1024. Set to None to use the full dataset as a single batch. From ce25d7357247bf5ac9466ba685127acaef1d5f03 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Sun, 5 Jul 2026 21:52:45 -0700 Subject: [PATCH 24/30] fixed faulty simulate tile mixing code --- docs/badges/tests-badge.svg | 2 +- .../simulate-and-analyze/simulate_config.yaml | 12 +- examples/simulate/simulate_config.yaml | 15 +- reports/flake.txt | 365 +++++++++--------- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/selection_experiment.py | 11 +- src/tfscreen/tfmodel/analysis/batch_sizing.py | 2 +- .../simulate/test_selection_experiment.py | 37 +- 8 files changed, 242 insertions(+), 204 deletions(-) diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 51f42da9..e1a0dd73 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3932tests3932 \ No newline at end of file +tests: 3933tests3933 \ No newline at end of file diff --git a/examples/simulate-and-analyze/simulate_config.yaml b/examples/simulate-and-analyze/simulate_config.yaml index fe30f93f..22479161 100644 --- a/examples/simulate-and-analyze/simulate_config.yaml +++ b/examples/simulate-and-analyze/simulate_config.yaml @@ -159,21 +159,21 @@ activity_mut_scale: 0.0 # 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 + single-1: 10_000 + single-2: 10_000 + double-1-2: 1_000_000 spiked: 1000 # Mixing ratio of tile combos in the pooled library. Only the ratio matters. library_mixture: single-1: 100 single-2: 100 - double-1-2: 1000 - spiked: 100 + double-1-2: 5 + spiked: 4 # Sigma of the log-normal used to draw initial genotype frequencies. 0 = flat # distribution; 1–2 is realistic for a typical transformation. -lib_assembly_skew_sigma: 1.5 +lib_assembly_skew_sigma: 1.25 # Each bacterium receives a number of plasmids drawn from a zero-truncated # Poisson with this lambda. Set to 0 or null for exactly one plasmid per cell. diff --git a/examples/simulate/simulate_config.yaml b/examples/simulate/simulate_config.yaml index 108cc407..a6a2f7c1 100644 --- a/examples/simulate/simulate_config.yaml +++ b/examples/simulate/simulate_config.yaml @@ -201,21 +201,22 @@ activity_mut_scale: 0.0 # 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 + single-1: 10_000 + single-2: 10_000 + double-1-2: 1_000_000 + spiked: 1000 # Mixing ratio of tile combos in the pooled library. Only the ratio matters. library_mixture: single-1: 100 single-2: 100 - double-1-2: 1000 - spiked: 1 + double-1-2: 5 + spiked: 4 # Sigma of the log-normal used to draw initial genotype frequencies. 0 = flat # distribution; 1–2 is realistic for a typical transformation. -lib_assembly_skew_sigma: 1.5 +lib_assembly_skew_sigma: 1.25 + # Each bacterium receives a number of plasmids drawn from a zero-truncated # Poisson with this lambda. Set to 0 or null for exactly one plasmid per cell. diff --git a/reports/flake.txt b/reports/flake.txt index c0aee514..1343e026 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1353,101 +1353,101 @@ ./src/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace ./src/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' ./src/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:678:50: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:678:52: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:680:75: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:682:44: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:683:46: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:684:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:685:67: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:735:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:752:79: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:758:29: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:800:43: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:806:74: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:807:18: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:813:79: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:815:33: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:820:80: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:825:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:831:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:842:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:885:73: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:890:76: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:907:25: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1015:26: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1015:36: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1015:44: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1015:52: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1015:60: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1023:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1024:32: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1032:42: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1041:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1042:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1044:63: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1052:51: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1059:28: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1061:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1062:24: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1069:79: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1074:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1075:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1077:36: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1079:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1089:128: E501 line too long (145 > 127 characters) -./src/tfscreen/simulate/selection_experiment.py:1090:128: E501 line too long (145 > 127 characters) -./src/tfscreen/simulate/selection_experiment.py:1094:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1095:72: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1099:34: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1106:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1108:20: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1108:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1109:20: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1111:32: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1112:38: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1124:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1132:41: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1139:49: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1141:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1146:36: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1147:37: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1147:45: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1147:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1147:61: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1152:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:1187:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1208:57: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1209:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1212:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1212:39: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1217:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1223:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1226:19: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1234:33: E261 at least two spaces before inline comment -./src/tfscreen/simulate/selection_experiment.py:1235:49: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1236:37: E231 missing whitespace after ':' -./src/tfscreen/simulate/selection_experiment.py:1238:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1239:76: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1241:19: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1243:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1251:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1252:43: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1256:41: E127 continuation line over-indented for visual indent -./src/tfscreen/simulate/selection_experiment.py:1259:49: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1283:71: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1291:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1292:76: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1297:11: F541 f-string is missing placeholders -./src/tfscreen/simulate/selection_experiment.py:1302:38: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1319:6: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/simulate/selection_experiment.py:1326:51: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1327:48: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1328:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1329:33: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1332:1: W391 blank line at end of file +./src/tfscreen/simulate/selection_experiment.py:685:43: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:685:45: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:687:75: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:689:44: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:690:46: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:691:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:692:67: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:742:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:759:79: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:765:29: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:807:43: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:813:74: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:814:18: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:820:79: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:822:33: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:827:80: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:832:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:838:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:849:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:892:73: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:897:76: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:914:25: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1022:26: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1022:36: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1022:44: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1022:52: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1022:60: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1030:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1031:32: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1039:42: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1048:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1049:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1051:63: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1057:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1059:51: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1066:28: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1068:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1069:24: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1076:79: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1081:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1082:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1084:36: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1086:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1090:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1096:128: E501 line too long (145 > 127 characters) +./src/tfscreen/simulate/selection_experiment.py:1097:128: E501 line too long (145 > 127 characters) +./src/tfscreen/simulate/selection_experiment.py:1101:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1102:72: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1106:34: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1113:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1115:20: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1115:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1116:20: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1118:32: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1119:38: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1131:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1139:41: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1146:49: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1148:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1153:36: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1154:37: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1154:45: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1154:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1154:61: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1159:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:1194:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1215:57: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1216:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1219:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1219:39: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1224:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1230:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1233:19: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1241:33: E261 at least two spaces before inline comment +./src/tfscreen/simulate/selection_experiment.py:1242:49: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1243:37: E231 missing whitespace after ':' +./src/tfscreen/simulate/selection_experiment.py:1245:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1246:76: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1248:19: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1250:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1258:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1259:43: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1263:41: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/selection_experiment.py:1266:49: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1290:71: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1298:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1299:76: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1304:11: F541 f-string is missing placeholders +./src/tfscreen/simulate/selection_experiment.py:1309:38: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1326:6: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/simulate/selection_experiment.py:1333:51: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1334:48: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1335:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1336:33: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1339:1: W391 blank line at end of file ./src/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) ./src/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent @@ -3565,9 +3565,6 @@ ./src/tfscreen/tfmodel/model_orchestrator.py:1834:27: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/model_orchestrator.py:1835:28: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/model_orchestrator.py:1836:31: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:222:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:223:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:224:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:225:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:226:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:227:22: E128 continuation line under-indented for visual indent @@ -3587,19 +3584,22 @@ ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:241:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:242:22: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:243:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:257:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:259:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:260:58: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:261:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:262:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:263:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:244:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:245:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:246:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:260:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:262:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:263:58: E231 missing whitespace after ':' ./src/tfscreen/tfmodel/scripts/configure_model_cli.py:264:60: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:265:59: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:266:63: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:267:70: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:268:55: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:269:70: E231 missing whitespace after ':' -./src/tfscreen/tfmodel/scripts/configure_model_cli.py:271:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:265:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:266:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:267:60: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:268:59: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:269:63: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:270:70: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:271:55: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:272:70: E231 missing whitespace after ':' +./src/tfscreen/tfmodel/scripts/configure_model_cli.py:274:1: E305 expected 2 blank lines after class or function definition, found 1 ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E114 indentation is not a multiple of 4 (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:97:6: E116 unexpected indentation (comment) ./src/tfscreen/tfmodel/scripts/fit_model_cli.py:120:27: E231 missing whitespace after ',' @@ -5260,84 +5260,83 @@ ./tests/tfscreen/simulate/test_selection_experiment.py:514:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:517:25: E261 at least two spaces before inline comment ./tests/tfscreen/simulate/test_selection_experiment.py:528:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:533:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:550:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:553:20: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:554:20: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:555:20: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:569:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:576:47: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:582:20: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:583:20: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:581:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:584:20: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:592:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:595:9: F811 redefinition of unused 'gmean' from line 6 -./tests/tfscreen/simulate/test_selection_experiment.py:603:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:607:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:614:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:621:59: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:585:20: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:586:20: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:600:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:607:47: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:613:20: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:614:20: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:615:20: E261 at least two spaces before inline comment ./tests/tfscreen/simulate/test_selection_experiment.py:623:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:640:41: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:654:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:662:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:678:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:686:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:626:9: F811 redefinition of unused 'gmean' from line 6 +./tests/tfscreen/simulate/test_selection_experiment.py:634:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:638:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:645:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:652:59: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:654:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:671:41: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:685:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_selection_experiment.py:693:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:701:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:712:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:713:48: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:714:48: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:720:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:723:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:731:43: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:746:31: E201 whitespace after '[' -./tests/tfscreen/simulate/test_selection_experiment.py:747:54: E202 whitespace before ']' -./tests/tfscreen/simulate/test_selection_experiment.py:748:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:752:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:754:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:755:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:764:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:766:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:770:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:778:63: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:779:75: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:780:77: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:789:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:794:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:709:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:717:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:724:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:732:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:743:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:744:48: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:745:48: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:751:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:754:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:762:43: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:777:31: E201 whitespace after '[' +./tests/tfscreen/simulate/test_selection_experiment.py:778:54: E202 whitespace before ']' +./tests/tfscreen/simulate/test_selection_experiment.py:779:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:783:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:785:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:786:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:795:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:797:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:803:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:808:25: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:814:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:818:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:820:45: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:821:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:822:48: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:801:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:809:63: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:810:75: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:811:77: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:820:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:825:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:833:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:838:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:842:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:848:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:828:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:834:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:839:25: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:845:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:849:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:851:45: W291 trailing whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:852:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:855:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:858:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:862:37: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:853:48: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:856:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:864:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:869:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:873:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:879:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:883:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:888:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:891:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:896:41: E261 at least two spaces before inline comment -./tests/tfscreen/simulate/test_selection_experiment.py:916:1: E302 expected 2 blank lines, found 1 -./tests/tfscreen/simulate/test_selection_experiment.py:1147:12: F841 local variable 'k_sel' is assigned to but never used -./tests/tfscreen/simulate/test_selection_experiment.py:1162:29: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_selection_experiment.py:1164:29: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_selection_experiment.py:1186:20: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_selection_experiment.py:1201:14: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_selection_experiment.py:1204:14: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_selection_experiment.py:1242:69: W291 trailing whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:1254:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:1265:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:1269:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:1272:1: W293 blank line contains whitespace -./tests/tfscreen/simulate/test_selection_experiment.py:1322:18: W292 no newline at end of file +./tests/tfscreen/simulate/test_selection_experiment.py:886:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:889:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:893:37: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:914:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:919:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:922:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:927:41: E261 at least two spaces before inline comment +./tests/tfscreen/simulate/test_selection_experiment.py:947:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_selection_experiment.py:1178:12: F841 local variable 'k_sel' is assigned to but never used +./tests/tfscreen/simulate/test_selection_experiment.py:1193:29: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_selection_experiment.py:1195:29: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_selection_experiment.py:1217:20: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_selection_experiment.py:1232:14: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_selection_experiment.py:1235:14: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_selection_experiment.py:1273:69: W291 trailing whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:1285:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:1296:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:1300:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:1303:1: W293 blank line contains whitespace +./tests/tfscreen/simulate/test_selection_experiment.py:1353:18: W292 no newline at end of file ./tests/tfscreen/simulate/test_simulate_cli.py:333:11: E221 multiple spaces before operator ./tests/tfscreen/simulate/test_simulate_cli.py:337:32: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_simulate_cli.py:380:11: E221 multiple spaces before operator @@ -7686,6 +7685,6 @@ 42 F841 local variable 'e' is assigned to but never used 620 W291 trailing whitespace 85 W292 no newline at end of file -1583 W293 blank line contains whitespace +1582 W293 blank line contains whitespace 30 W391 blank line at end of file -7642 +7641 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index eb9aade3..c3cd4f2b 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/simulate/selection_experiment.py b/src/tfscreen/simulate/selection_experiment.py index 5a1a8b0c..7856d579 100644 --- a/src/tfscreen/simulate/selection_experiment.py +++ b/src/tfscreen/simulate/selection_experiment.py @@ -674,8 +674,15 @@ def _sim_transform_and_mix( all_trans.append(trans) all_trans_mask.append(tr_mask) - w = library_mixture[lib_key] - all_weights.append(np.full(trans.shape[0],w,dtype=float)) + # Normalize by the number of transformants drawn for this origin so + # that its total contribution to the pooled library is exactly + # library_mixture[lib_key], independent of transform_sizes[lib_key]. + # Without this, an origin's pool share becomes + # library_mixture[lib_key] * transform_sizes[lib_key], entangling the + # two config values. + n_cells = trans.shape[0] + w = library_mixture[lib_key] / n_cells if n_cells > 0 else 0.0 + all_weights.append(np.full(n_cells,w,dtype=float)) # This is vstack that accounts for the fact that these transformations # might have different numbers of plasmids diff --git a/src/tfscreen/tfmodel/analysis/batch_sizing.py b/src/tfscreen/tfmodel/analysis/batch_sizing.py index 8592fed5..b070f3d6 100644 --- a/src/tfscreen/tfmodel/analysis/batch_sizing.py +++ b/src/tfscreen/tfmodel/analysis/batch_sizing.py @@ -21,7 +21,7 @@ # Fraction of total device memory to treat as usable budget, leaving # headroom for the host process, other tensors already resident, and the # unmodeled overhead above. -_DEFAULT_SAFETY_FRACTION = 0.7 +_DEFAULT_SAFETY_FRACTION = 0.6 def _dtype_itemsize(): diff --git a/tests/tfscreen/simulate/test_selection_experiment.py b/tests/tfscreen/simulate/test_selection_experiment.py index bf34168e..1bebdf2b 100644 --- a/tests/tfscreen/simulate/test_selection_experiment.py +++ b/tests/tfscreen/simulate/test_selection_experiment.py @@ -526,14 +526,45 @@ def test_sim_transform_and_mix(mocker, base_library_df: pd.DataFrame, assert transformants == "mocked_array" assert mask == "mocked_array" - weights_libA = np.full(2, 0.6) - weights_libB = np.full(3, 0.4) + # Each origin's total weight must equal library_mixture[origin], + # independent of how many cells (transform_sizes) it was split across. + weights_libA = np.full(2, 0.6 / 2) + weights_libB = np.full(3, 0.4 / 3) expected_weights = np.concatenate([weights_libA, weights_libB]) expected_probs = expected_weights / np.sum(expected_weights) - + np.testing.assert_allclose(probs, expected_probs) +def test_sim_transform_and_mix_invariant_to_transform_sizes(rng: Generator): + """ + An origin's total contribution to the pooled library must depend only on + library_mixture, not on transform_sizes -- regression test for a bug + where per-cell weights weren't normalized by the number of transformants + drawn, letting transform_sizes leak into the mixing ratio. + """ + df = pd.DataFrame({ + "library_origin": ["A"] * 5 + ["B"] * 5, + "genotype": [f"A{i}" for i in range(5)] + [f"B{i}" for i in range(5)], + }) + df["probs"] = 0.2 + lib_origin_dict = dict(list(df.groupby("library_origin"))) + + library_mixture = {"A": 1.0, "B": 1.0} + + for transform_sizes in ( + {"A": 1000, "B": 1000}, + {"A": 1000, "B": 10000}, + {"A": 1000, "B": 100000}, + ): + _, _, probs = _sim_transform_and_mix( + lib_origin_dict, transform_sizes, library_mixture, None, rng + ) + n_a = transform_sizes["A"] + np.testing.assert_allclose(probs[:n_a].sum(), 0.5, atol=1e-9) + np.testing.assert_allclose(probs[n_a:].sum(), 0.5, atol=1e-9) + + # ---------------------------------------------------------------------------- # test _sim_growth # ---------------------------------------------------------------------------- From 04f87ec1470c4b324ddfc5ab064e271ae6f68030 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Mon, 6 Jul 2026 08:50:14 -0700 Subject: [PATCH 25/30] added poisson lam to summarize outputs --- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 24 +++---- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/scripts/simulate_cli.py | 13 ++-- .../simulate/transformation_lam_output.py | 44 ++++++++++++ .../tfmodel/scripts/summarize_fit_cli.py | 50 +++++++++++++ tests/tfscreen/simulate/test_simulate_cli.py | 68 ++++++++++++++++++ .../test_transformation_lam_output.py | 44 ++++++++++++ .../tfmodel/scripts/test_summarize_fit_cli.py | 71 +++++++++++++++++++ 9 files changed, 300 insertions(+), 18 deletions(-) create mode 100644 src/tfscreen/simulate/transformation_lam_output.py create mode 100644 tests/tfscreen/simulate/test_transformation_lam_output.py diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index e1a0dd73..e915cd9b 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3933tests3933 \ No newline at end of file +tests: 3947tests3947 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index 1343e026..c8ef31dd 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1309,8 +1309,8 @@ ./src/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./src/tfscreen/simulate/scripts/simulate_cli.py:16:1: C901 'run_simulation_from_config' is too complex (12) -./src/tfscreen/simulate/scripts/simulate_cli.py:145:128: E501 line too long (131 > 127 characters) +./src/tfscreen/simulate/scripts/simulate_cli.py:17:1: C901 'run_simulation_from_config' is too complex (12) +./src/tfscreen/simulate/scripts/simulate_cli.py:150:128: E501 line too long (153 > 127 characters) ./src/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' @@ -3647,7 +3647,7 @@ ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:413:1: C901 '_summarize_params' is too complex (23) ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:528:1: C901 '_summarize_condition_growth_params' is too complex (14) -./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:674:1: C901 'summarize_fit' is too complex (59) +./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:723:1: C901 'summarize_fit' is too complex (59) ./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) ./src/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 @@ -5337,13 +5337,13 @@ ./tests/tfscreen/simulate/test_selection_experiment.py:1300:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1303:1: W293 blank line contains whitespace ./tests/tfscreen/simulate/test_selection_experiment.py:1353:18: W292 no newline at end of file -./tests/tfscreen/simulate/test_simulate_cli.py:333:11: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_simulate_cli.py:337:32: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:380:11: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_simulate_cli.py:385:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:387:31: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:389:33: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_simulate_cli.py:445:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused +./tests/tfscreen/simulate/test_simulate_cli.py:401:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:405:32: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:448:11: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_simulate_cli.py:453:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:455:31: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:457:33: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_simulate_cli.py:513:5: F401 'tfscreen.simulate.scripts.simulate_cli as cli_mod' imported but unused ./tests/tfscreen/simulate/test_thermo_to_growth.py:28:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:32:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_thermo_to_growth.py:41:1: E302 expected 2 blank lines, found 1 @@ -7121,7 +7121,7 @@ ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1237:1: E402 module level import not at top of file ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1419:14: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1681:1: E402 module level import not at top of file -./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1990:21: E221 multiple spaces before operator +./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:2061: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/tensors/test_batch.py:3:1: F401 'numpy as np' imported but unused @@ -7672,7 +7672,7 @@ 29 E306 expected 1 blank line before a nested definition, found 0 1 E401 multiple imports on one line 38 E402 module level import not at top of file -87 E501 line too long (131 > 127 characters) +87 E501 line too long (153 > 127 characters) 46 E701 multiple statements on one line (colon) 5 E712 comparison to True should be 'if cond is True:' or 'if cond:' 2 E713 test for membership should be 'not in' diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index c3cd4f2b..a0250b96 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/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index a3a61f78..7f437396 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -9,6 +9,7 @@ from tfscreen.simulate.presplit_data import generate_presplit_df from tfscreen.simulate.base_growth_data import generate_base_growth_df, generate_k_ref_df from tfscreen.simulate.growth_parameters_output import generate_growth_parameters_df +from tfscreen.simulate.transformation_lam_output import generate_transformation_lam_df from tfscreen.process_raw import counts_to_lncfu from tfscreen.util.cli.generalized_main import generalized_main @@ -26,9 +27,11 @@ def run_simulation_from_config( Runs library_prediction once to establish ground-truth phenotypes, then simulates num_replicates independent experimental replicates using selection_experiment. Writes library, parameters, genotype_theta (long-form: - genotype/titrant_name/titrant_conc/theta), growth, and growth_parameters + genotype/titrant_name/titrant_conc/theta), growth, growth_parameters (per-condition condition_growth ground truth; see - tfscreen.simulate.growth_parameters_output.generate_growth_parameters_df) + tfscreen.simulate.growth_parameters_output.generate_growth_parameters_df), + and transformation_lam (single-row congression Poisson-rate ground truth; + see tfscreen.simulate.transformation_lam_output.generate_transformation_lam_df) CSV files. If the config contains a 'binding_data' block, also writes a simulated binding curve CSV (see tfscreen.simulate.binding_data.generate_binding_df). If it contains a @@ -64,7 +67,7 @@ def out_path(name): config_out = os.path.join(output_dir, f"{output_prefix}input-config.yaml") output_names = ["library", "parameters", "genotype_theta", "growth", - "growth_parameters"] + "growth_parameters", "transformation_lam"] if "binding_data" in cf: output_names.append("binding") if "presplit_data" in cf: @@ -92,6 +95,7 @@ def out_path(name): library_df, phenotype_df, genotype_theta_df, parameters_df, binding_theta_df = library_prediction(cf) growth_parameters_df = generate_growth_parameters_df(cf["growth"]) + transformation_lam_df = generate_transformation_lam_df(cf) # ------------------------------------------------------------------------- # Simulate independent replicates @@ -142,7 +146,8 @@ def out_path(name): genotype_theta_df.to_csv(out_path("genotype_theta"), index=False) growth_df.to_csv(out_path("growth"), index=False) growth_parameters_df.to_csv(out_path("growth_parameters"), index=False) - print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth', 'growth_parameters'])}") + transformation_lam_df.to_csv(out_path("transformation_lam"), index=False) + print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth', 'growth_parameters', 'transformation_lam'])}") if "binding_data" in cf: binding_df = generate_binding_df(cf["binding_data"], rng, binding_theta_df) diff --git a/src/tfscreen/simulate/transformation_lam_output.py b/src/tfscreen/simulate/transformation_lam_output.py new file mode 100644 index 00000000..01e05b0a --- /dev/null +++ b/src/tfscreen/simulate/transformation_lam_output.py @@ -0,0 +1,44 @@ +""" +Generate the ground-truth congression Poisson-rate (lambda) echo. + +``transformation_poisson_lambda`` is a top-level simulate-config scalar +(number of plasmids/cell during transformation, drawn from a zero-truncated +Poisson; see ``simulate.selection_experiment``). It has a fit-side analog: +the ``transformation`` component category's ``empirical``/``logit_norm`` +variants both sample a global congression rate (see +``generative/components/transformation/_congression.py``) and extract it as +``lam`` (see those modules' ``get_extract_specs``, which writes +``*_params_lam.csv``). This mirrors ``base_growth_data.generate_k_ref_df``: +a single global scalar, not genotype- or condition-indexed, echoed to its +own single-row ground-truth file. +""" + +import pandas as pd + + +def generate_transformation_lam_df(cf): + """ + Generate a one-row ground-truth DataFrame for the global lambda scalar. + + Parameters + ---------- + cf : dict + The full simulate config. May contain 'transformation_poisson_lambda' + (a top-level key; see selection_experiment.py's SIMULATE_KNOWN_KEYS / + _check_dict_number(..., allow_none=True)). Unlike + generate_k_ref_df's required base_growth_data.k_ref, this key is + read with .get() since it is always semantically present (defaulting + to None) rather than required. + + Returns + ------- + pandas.DataFrame + Single row with columns 'parameter' ("lam") and 'ref' (the + configured value). None or an absent key means "exactly one plasmid + per cell" (see selection_experiment.py's + ``transformation_poisson_lambda is None or == 0`` check), echoed + here as ``ref=0.0``. + """ + lam = cf.get("transformation_poisson_lambda") + ref = float(lam) if lam else 0.0 + return pd.DataFrame({"parameter": ["lam"], "ref": [ref]}) diff --git a/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py b/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py index f676bb60..07e796fe 100644 --- a/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py +++ b/src/tfscreen/tfmodel/scripts/summarize_fit_cli.py @@ -651,6 +651,55 @@ def _summarize_k_ref(run_dir, out_prefix): _try_calibration(merged, "ref", out_name[:-4], "k_ref") +def _summarize_transformation_lam(run_dir, out_prefix): + """Annotate *_params_lam.csv with ground truth from tfs_sim_transformation_lam.csv. + + lam is a single global scalar (the transformation component's congression + Poisson-rate parameter), not genotype- or condition-indexed, so both the + ground-truth file and the fit's extracted file have exactly one row. + Silently skips when the ground-truth file is absent (real-data runs). + Warns (but does not raise) when the ground-truth file exists but the fit + config's transformation component didn't extract a 'lam' (e.g. + transformation: single, which has no such site). No correlation plot is + produced since a single point can't usefully be plotted; only the + annotated CSV (and a best-effort calibration check) is written. + """ + sim_path = _find_unique(run_dir, "_sim_transformation_lam.csv", + "sim transformation lam", warn_missing=False) + if sim_path is None: + return + + param_file = _find_unique(run_dir, "_params_lam.csv", "transformation lam params", + warn_missing=False) + if param_file is None: + warnings.warn(f"Expected *_params_lam.csv in {run_dir} but none found") + return + + try: + ref_df = pd.read_csv(sim_path) + params_df = pd.read_csv(param_file) + except Exception as exc: + warnings.warn(f"Could not read transformation lam files: {exc}") + return + + if "ref" not in ref_df.columns or len(ref_df) == 0: + warnings.warn(f"{sim_path} has no usable 'ref' value; skipping transformation lam summary") + return + + merged = params_df.copy() + merged["ref"] = float(ref_df["ref"].iloc[0]) + + out_name = f"{out_prefix}_params_lam.csv" + try: + merged.to_csv(out_name, index=False) + print(f"Wrote parameter summary to {out_name}") + except Exception as exc: + warnings.warn(f"Could not write {out_name}: {exc}") + return + + _try_calibration(merged, "ref", out_name[:-4], "transformation_lam") + + def _summarize_growth_params(run_dir, out_prefix): """Annotate growth-model parameter files with simulated ground truth. @@ -1031,6 +1080,7 @@ def summarize_fit(run_dir, # --- Sim-parameter correlation CSVs --- _summarize_params(run_dir, out_prefix) _summarize_growth_params(run_dir, out_prefix) + _summarize_transformation_lam(run_dir, out_prefix) return results diff --git a/tests/tfscreen/simulate/test_simulate_cli.py b/tests/tfscreen/simulate/test_simulate_cli.py index cfaac2d4..add4365c 100644 --- a/tests/tfscreen/simulate/test_simulate_cli.py +++ b/tests/tfscreen/simulate/test_simulate_cli.py @@ -212,6 +212,74 @@ def test_growth_parameters_csv_written_for_real(tmp_path): assert df.loc[0, "growth_max"] == pytest.approx(0.04) +# --------------------------------------------------------------------------- +# transformation_lam: always written, from cf['transformation_poisson_lambda'] +# --------------------------------------------------------------------------- + +def test_transformation_lam_csv_always_written(tmp_path): + """transformation_lam CSV is written unconditionally, mirroring + growth_parameters (transformation_poisson_lambda is a top-level, + always-present-but-possibly-None config key, not an optional *_data + block).""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + written = {} + + def capture_csv(self_df, path, **kwargs): + written[str(path)] = self_df.copy() + + cfg = {"seed": 0, "growth": {}, "transformation_poisson_lambda": 1.5} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df), \ + patch.object(pd.DataFrame, "to_csv", capture_csv): + run_simulation_from_config("config.yaml", str(tmp_path)) + + matches = [p for p in written if "transformation_lam" in os.path.basename(p)] + assert len(matches) == 1 + result = written[matches[0]] + assert result.loc[0, "parameter"] == "lam" + assert result.loc[0, "ref"] == pytest.approx(1.5) + + +def test_transformation_lam_csv_written_for_real(tmp_path): + """Real (unmocked) to_csv write produces a readable transformation_lam.csv.""" + lib_df, pheno_df, theta_df, params_df, sample_df, counts_df, growth_df = _make_mock_dfs() + + cfg = {"seed": 0, "growth": {}, "transformation_poisson_lambda": None} + + with patch("tfscreen.util.read_yaml", return_value=cfg), \ + patch("tfscreen.simulate.scripts.simulate_cli.library_prediction", + return_value=(lib_df, pheno_df, theta_df, params_df, None)), \ + patch("tfscreen.simulate.scripts.simulate_cli.selection_experiment", + return_value=(sample_df, counts_df)), \ + patch("tfscreen.simulate.scripts.simulate_cli.counts_to_lncfu", + return_value=growth_df): + run_simulation_from_config("config.yaml", str(tmp_path)) + + lam_path = tmp_path / "tfs_sim_transformation_lam.csv" + assert lam_path.exists() + df = pd.read_csv(lam_path) + assert df.loc[0, "parameter"] == "lam" + assert df.loc[0, "ref"] == pytest.approx(0.0) + + +def test_transformation_lam_participates_in_existence_guard(tmp_path): + """Pre-existing transformation_lam CSV triggers the same FileExistsError + guard as the other always-written outputs.""" + (tmp_path / "tfs_sim_transformation_lam.csv").write_text("parameter,ref\nlam,1.5\n") + + cfg = {"seed": 0, "growth": {}, "transformation_poisson_lambda": 1.5} + with patch("tfscreen.util.read_yaml", return_value=cfg): + with pytest.raises(FileExistsError, match="transformation_lam"): + run_simulation_from_config("config.yaml", str(tmp_path)) + + # --------------------------------------------------------------------------- # base_growth_data: written only when configured, using parameters_df's dk_geno # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/simulate/test_transformation_lam_output.py b/tests/tfscreen/simulate/test_transformation_lam_output.py new file mode 100644 index 00000000..ae116e1b --- /dev/null +++ b/tests/tfscreen/simulate/test_transformation_lam_output.py @@ -0,0 +1,44 @@ +"""Tests for tfscreen.simulate.transformation_lam_output.generate_transformation_lam_df.""" + +import pytest + +from tfscreen.simulate.transformation_lam_output import generate_transformation_lam_df + + +def test_configured_float_value(): + cf = {"transformation_poisson_lambda": 1.5} + result = generate_transformation_lam_df(cf) + assert len(result) == 1 + assert result.loc[0, "parameter"] == "lam" + assert result.loc[0, "ref"] == pytest.approx(1.5) + + +def test_none_value_gives_zero_ref(): + cf = {"transformation_poisson_lambda": None} + result = generate_transformation_lam_df(cf) + assert result.loc[0, "ref"] == pytest.approx(0.0) + + +def test_zero_value_gives_zero_ref(): + cf = {"transformation_poisson_lambda": 0} + result = generate_transformation_lam_df(cf) + assert result.loc[0, "ref"] == pytest.approx(0.0) + + +def test_missing_key_gives_zero_ref(): + cf = {} + result = generate_transformation_lam_df(cf) + assert result.loc[0, "ref"] == pytest.approx(0.0) + + +def test_string_coercible_value(): + cf = {"transformation_poisson_lambda": "2.5"} + result = generate_transformation_lam_df(cf) + assert result.loc[0, "ref"] == pytest.approx(2.5) + assert isinstance(result.loc[0, "ref"], float) + + +def test_output_columns(): + cf = {"transformation_poisson_lambda": 1.5} + result = generate_transformation_lam_df(cf) + assert set(result.columns) == {"parameter", "ref"} diff --git a/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py b/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py index 21790cc0..5a83ccd9 100644 --- a/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py @@ -1682,6 +1682,7 @@ def test_summarize_fit_calls_summarize_params(self, run_dir): _summarize_condition_growth_params, _summarize_growth_params, _summarize_k_ref, + _summarize_transformation_lam, ) @@ -1878,6 +1879,76 @@ def test_missing_ref_column_in_sim_file_warns(self, tmp_path): assert not os.path.exists(out_prefix + "_params_k_ref.csv") +class TestSummarizeTransformationLam: + + def test_no_output_when_sim_transformation_lam_absent(self, tmp_path): + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + _summarize_transformation_lam(str(tmp_path), out_prefix) + assert not os.path.exists(out_prefix + "_params_lam.csv") + + def test_lam_csv_written_with_ref(self, tmp_path): + pd.DataFrame({"parameter": ["lam"], "ref": [1.5]}).to_csv( + str(tmp_path / "run_sim_transformation_lam.csv"), index=False + ) + pd.DataFrame({"parameter": ["lam"], "q0.5": [1.48]}).to_csv( + str(tmp_path / "run_params_lam.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_transformation_lam(str(tmp_path), out_prefix) + out_path = out_prefix + "_params_lam.csv" + assert os.path.exists(out_path) + df = pd.read_csv(out_path) + assert df.loc[0, "ref"] == pytest.approx(1.5) + assert df.loc[0, "q0.5"] == pytest.approx(1.48) + + def test_no_pdf_written_for_transformation_lam(self, tmp_path): + """A single point can't usefully be plotted; no correlation PDF.""" + pd.DataFrame({"parameter": ["lam"], "ref": [1.5]}).to_csv( + str(tmp_path / "run_sim_transformation_lam.csv"), index=False + ) + pd.DataFrame({"parameter": ["lam"], "q0.5": [1.48]}).to_csv( + str(tmp_path / "run_params_lam.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + _summarize_transformation_lam(str(tmp_path), out_prefix) + assert not os.path.exists(out_prefix + "_params_lam.pdf") + + def test_warns_when_params_lam_missing(self, tmp_path): + """Sim ground truth exists but the fit config's transformation + component didn't extract a 'lam' (e.g. transformation: single).""" + pd.DataFrame({"parameter": ["lam"], "ref": [1.5]}).to_csv( + str(tmp_path / "run_sim_transformation_lam.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_transformation_lam(str(tmp_path), out_prefix) + assert any("lam" in str(x.message) for x in w) + + def test_missing_ref_column_in_sim_file_warns(self, tmp_path): + pd.DataFrame({"parameter": ["lam"], "value": [1.5]}).to_csv( + str(tmp_path / "run_sim_transformation_lam.csv"), index=False + ) + pd.DataFrame({"parameter": ["lam"], "q0.5": [1.48]}).to_csv( + str(tmp_path / "run_params_lam.csv"), index=False + ) + out_prefix = str(tmp_path / "summary" / "tfs_summarize") + os.makedirs(os.path.dirname(out_prefix), exist_ok=True) + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + _summarize_transformation_lam(str(tmp_path), out_prefix) + assert any("ref" in str(x.message).lower() for x in w) + assert not os.path.exists(out_prefix + "_params_lam.csv") + + class TestSummarizeGrowthParamsIntegration: def test_summarize_fit_calls_both_condition_and_k_ref(self, run_dir): From 6a6c67b2025c33eeb0221b82e5e485282db18945 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Mon, 6 Jul 2026 10:54:51 -0700 Subject: [PATCH 26/30] updated grid calculator --- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 8 +- reports/junit/junit.xml | 2 +- .../tfmodel/scripts/setup_grid_cli.py | 7 +- .../tfmodel/scripts/summarize_grid_cli.py | 29 ----- .../tfmodel/scripts/test_setup_grid_cli.py | 85 +++++++++++++++ .../scripts/test_summarize_grid_cli.py | 103 ------------------ 8 files changed, 97 insertions(+), 141 deletions(-) diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 397f274e..59ca86f6 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.43%coverage96.43% \ No newline at end of file +coverage: 96.21%coverage96.21% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index e915cd9b..2ad8984b 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3947tests3947 \ No newline at end of file +tests: 3943tests3943 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index c8ef31dd..a29e68f6 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -3641,7 +3641,7 @@ ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:893:1: C901 '_apply_guesses_updates' is too complex (12) ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1045:1: E303 too many blank lines (3) ./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1049:1: E302 expected 2 blank lines, found 3 -./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:160:1: C901 'setup_grid' is too complex (17) +./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:163:1: C901 'setup_grid' is too complex (17) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:154:1: C901 '_read_all_losses' is too complex (11) @@ -3649,7 +3649,7 @@ ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:528:1: C901 '_summarize_condition_growth_params' is too complex (14) ./src/tfscreen/tfmodel/scripts/summarize_fit_cli.py:723:1: C901 'summarize_fit' is too complex (59) ./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:47:30: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:76:1: C901 'summarize_grid' is too complex (14) +./src/tfscreen/tfmodel/scripts/summarize_grid_cli.py:57:1: C901 'summarize_grid' is too complex (11) ./src/tfscreen/tfmodel/tensors/batch.py:5:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/tensors/batch.py:44:59: E231 missing whitespace after ',' ./src/tfscreen/tfmodel/tensors/batch.py:46:47: E231 missing whitespace after ',' @@ -7122,8 +7122,8 @@ ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1419:14: E221 multiple spaces before operator ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:1681:1: E402 module level import not at top of file ./tests/tfscreen/tfmodel/scripts/test_summarize_fit_cli.py:2061: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/scripts/test_summarize_grid_cli.py:78:9: F841 local variable 'data' is assigned to but never used +./tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py:182:91: E712 comparison to True should be 'if cond is True:' or 'if cond:' ./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 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index a0250b96..237a4603 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/tfmodel/scripts/setup_grid_cli.py b/src/tfscreen/tfmodel/scripts/setup_grid_cli.py index cf03ca6c..e607b39a 100644 --- a/src/tfscreen/tfmodel/scripts/setup_grid_cli.py +++ b/src/tfscreen/tfmodel/scripts/setup_grid_cli.py @@ -24,7 +24,7 @@ variants: - theta_model: hill_mut epistasis: true - - theta_model: hill + - theta_model: hill_geno epistasis: false template: # variables injected into the Jinja2 template only @@ -81,10 +81,13 @@ "theta_rescale", "theta_growth_noise", "theta_binding_noise", + "growth_noise", }) # configure_model arguments that are file paths and need abs→rel rewriting. -_PATH_KEYS = frozenset({"binding_df", "growth_df", "thermo_data"}) +_PATH_KEYS = frozenset({ + "binding_df", "growth_df", "presplit_df", "base_growth_df", "thermo_data", +}) # Fixed output prefix used inside every per-combination run. _CONFIGURE_OUT_PREFIX = "tfs_configure" diff --git a/src/tfscreen/tfmodel/scripts/summarize_grid_cli.py b/src/tfscreen/tfmodel/scripts/summarize_grid_cli.py index e6f1cc51..8e21d0e5 100644 --- a/src/tfscreen/tfmodel/scripts/summarize_grid_cli.py +++ b/src/tfscreen/tfmodel/scripts/summarize_grid_cli.py @@ -54,25 +54,6 @@ def _flatten_fit_summary(data): return flat -def _flatten_calib_stats(data): - """Flatten a calib_stats JSON dict into a flat dict for a CSV row. - - Every key is prefixed with ``calib_`` to distinguish calibration - statistics from fit-summary statistics in the same row. - - Parameters - ---------- - data : dict - Parsed contents of a ``*_calib_stats.json`` file. - - Returns - ------- - dict - Flat mapping of column name → value. - """ - return {f"calib_{k}": v for k, v in data.items()} - - def summarize_grid(grid_dir, out_prefix=None): """ Summarize a model grid created by tfs-setup-grid. @@ -138,16 +119,6 @@ def summarize_grid(grid_dir, out_prefix=None): except Exception: pass # malformed JSON — leave columns absent for this run - # Merge calibration statistics if present. - matches = sorted(glob.glob(os.path.join(subdir, "*_calib_stats.json"))) - if matches: - try: - with open(matches[0]) as fh: - calib_data = json.load(fh) - row.update(_flatten_calib_stats(calib_data)) - except Exception: - pass # malformed JSON — leave columns absent for this run - rows.append(row) if not rows: diff --git a/tests/tfscreen/tfmodel/scripts/test_setup_grid_cli.py b/tests/tfscreen/tfmodel/scripts/test_setup_grid_cli.py index 4734035b..eb573e8d 100644 --- a/tests/tfscreen/tfmodel/scripts/test_setup_grid_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_setup_grid_cli.py @@ -4,11 +4,20 @@ import yaml +import inspect + from tfscreen.util.grid_utils import ( relativize_config_paths as _relativize_config_paths, relativize_node as _relativize_node, relativize_template_vars as _relativize_template_vars, ) +from tfscreen.tfmodel.scripts.setup_grid_cli import ( + _cm_kwargs, + _resolve_cm_paths, + _COMPONENT_AXES, + _PATH_KEYS, +) +from tfscreen.tfmodel.scripts.configure_model_cli import configure_model # --------------------------------------------------------------------------- @@ -198,3 +207,79 @@ def test_relativize_template_vars_non_string_passthrough(tmp_path): tmpl_vars = {"seed": 0, "flag": True, "ratio": 1.5, "none_val": None} result = _relativize_template_vars(tmpl_vars, grid_yaml_dir, subdir) assert result == tmpl_vars + + +# --------------------------------------------------------------------------- +# _cm_kwargs — component-axis → configure_model parameter translation +# --------------------------------------------------------------------------- + +def test_cm_kwargs_adds_model_suffix_to_axes(): + """Registry-axis keys gain a ``_model`` suffix; other keys pass through.""" + out = _cm_kwargs({ + "condition_growth": "linear", + "growth_noise": "normal_kt", # regression: was missing from _COMPONENT_AXES + "epistasis": True, # non-axis: forwarded unchanged + "binding_df": "b.csv", # non-axis: forwarded unchanged + }) + assert out == { + "condition_growth_model": "linear", + "growth_noise_model": "normal_kt", + "epistasis": True, + "binding_df": "b.csv", + } + + +# --------------------------------------------------------------------------- +# _resolve_cm_paths — relative path resolution for file-path arguments +# --------------------------------------------------------------------------- + +def test_resolve_cm_paths_resolves_all_df_args(tmp_path): + """presplit_df/base_growth_df (regression) and the other df args resolve to abs.""" + base = str(tmp_path) + cm_vars = { + "binding_df": "b.csv", + "growth_df": "g.csv", + "presplit_df": "p.csv", + "base_growth_df": "bg.csv", + "theta_model": "hill_mut", # not a path: untouched + } + out = _resolve_cm_paths(cm_vars, base) + for key in ("binding_df", "growth_df", "presplit_df", "base_growth_df"): + assert out[key] == os.path.normpath(os.path.join(base, cm_vars[key])) + assert os.path.isabs(out[key]) + assert out["theta_model"] == "hill_mut" + + +def test_resolve_cm_paths_leaves_absolute_unchanged(tmp_path): + """An already-absolute path argument is not rewritten.""" + abs_p = os.path.join(str(tmp_path), "b.csv") + out = _resolve_cm_paths({"base_growth_df": abs_p}, "/some/other/dir") + assert out["base_growth_df"] == abs_p + + +# --------------------------------------------------------------------------- +# Drift guards against the configure_model signature +# --------------------------------------------------------------------------- + +def test_component_axes_cover_all_model_params(): + """Every ``*_model`` param of configure_model must have a _COMPONENT_AXES entry. + + Guards against adding a new swappable component to configure_model without + teaching tfs-setup-grid how to forward it (the ``growth_noise`` drift). + """ + params = inspect.signature(configure_model).parameters + model_axes = {p[:-len("_model")] for p in params if p.endswith("_model")} + missing = model_axes - _COMPONENT_AXES + assert not missing, f"_COMPONENT_AXES missing configure_model axes: {sorted(missing)}" + + +def test_path_keys_cover_all_df_params(): + """Every ``*_df`` path param of configure_model must be in _PATH_KEYS. + + Guards against adding a new data-file argument (e.g. presplit_df, + base_growth_df) without wiring its relative-path resolution. + """ + params = inspect.signature(configure_model).parameters + df_params = {p for p in params if p.endswith("_df")} + missing = df_params - _PATH_KEYS + assert not missing, f"_PATH_KEYS missing configure_model df args: {sorted(missing)}" diff --git a/tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py b/tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py index c8b75f90..464d6bc7 100644 --- a/tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_summarize_grid_cli.py @@ -9,7 +9,6 @@ import pytest from tfscreen.tfmodel.scripts.summarize_grid_cli import ( - _flatten_calib_stats, _flatten_fit_summary, summarize_grid, ) @@ -267,105 +266,3 @@ def test_multiple_runs_all_have_fit_summary(self, tmp_path): assert len(df) == 3 rmse_vals = sorted(df["theta_training_rmse"].tolist()) assert rmse_vals == pytest.approx([0.03, 0.07, 0.12]) - - -# --------------------------------------------------------------------------- -# _flatten_calib_stats -# --------------------------------------------------------------------------- - -CALIB_STATS = { - "pct_success": 1.0, "rmse": 0.08, "normalized_rmse": 0.12, - "pearson_r": 0.93, "spearman_r": 0.92, "r_squared": 0.86, - "mean_error": 0.002, "coverage_prob": 0.94, - "residual_corr": 0.01, "residual_corr_p_value": 0.5, - "bp_p_value": 0.4, "n_params": 12, "n_obs": 300, -} - - -class TestFlattenCalibStats: - - def test_all_keys_prefixed(self): - flat = _flatten_calib_stats(CALIB_STATS) - for key in CALIB_STATS: - assert f"calib_{key}" in flat - - def test_values_preserved(self): - flat = _flatten_calib_stats(CALIB_STATS) - assert flat["calib_rmse"] == pytest.approx(0.08) - assert flat["calib_n_params"] == 12 - assert flat["calib_pearson_r"] == pytest.approx(0.93) - - def test_empty_dict(self): - assert _flatten_calib_stats({}) == {} - - def test_no_unprefixed_keys(self): - flat = _flatten_calib_stats(CALIB_STATS) - assert all(k.startswith("calib_") for k in flat) - - -# --------------------------------------------------------------------------- -# summarize_grid — calib stats ingestion -# --------------------------------------------------------------------------- - -def _make_calib_stats(subdir, rmse=0.08, filename="tfs_calib_stats.json"): - data = dict(CALIB_STATS) - data["rmse"] = rmse - with open(os.path.join(str(subdir), filename), "w") as fh: - json.dump(data, fh) - return data - - -class TestSummarizeGridCalibStats: - - def test_calib_columns_present(self, tmp_path): - sub = tmp_path / "run_0001" - sub.mkdir() - _make_combo(str(sub)) - _make_calib_stats(sub) - df = summarize_grid(str(tmp_path), out_prefix=str(tmp_path / "out")) - assert "calib_rmse" in df.columns - assert "calib_n_params" in df.columns - assert "calib_pearson_r" in df.columns - - def test_calib_values_correct(self, tmp_path): - sub = tmp_path / "run_0001" - sub.mkdir() - _make_combo(str(sub)) - _make_calib_stats(sub, rmse=0.11) - df = summarize_grid(str(tmp_path), out_prefix=str(tmp_path / "out")) - assert df.loc[0, "calib_rmse"] == pytest.approx(0.11) - assert df.loc[0, "calib_n_params"] == 12 - - def test_run_without_calib_stats_gets_nan(self, tmp_path): - sub1 = tmp_path / "run_0001" - sub2 = tmp_path / "run_0002" - sub1.mkdir() - sub2.mkdir() - _make_combo(str(sub1)) - _make_calib_stats(sub1, rmse=0.06) - _make_combo(str(sub2)) - df = summarize_grid(str(tmp_path), out_prefix=str(tmp_path / "out")) - row1 = df[df["run"] == "run_0001"].iloc[0] - row2 = df[df["run"] == "run_0002"].iloc[0] - assert row1["calib_rmse"] == pytest.approx(0.06) - assert pd.isna(row2["calib_rmse"]) - - def test_calib_and_fit_summary_coexist(self, tmp_path): - sub = tmp_path / "run_0001" - sub.mkdir() - _make_combo(str(sub)) - _make_fit_summary(str(sub), training_rmse=0.05) - _make_calib_stats(sub, rmse=0.09) - df = summarize_grid(str(tmp_path), out_prefix=str(tmp_path / "out")) - assert df.loc[0, "theta_training_rmse"] == pytest.approx(0.05) - assert df.loc[0, "calib_rmse"] == pytest.approx(0.09) - - def test_malformed_calib_json_skipped_gracefully(self, tmp_path): - sub = tmp_path / "run_0001" - sub.mkdir() - _make_combo(str(sub)) - with open(os.path.join(str(sub), "tfs_calib_stats.json"), "w") as fh: - fh.write("{ not valid json }") - df = summarize_grid(str(tmp_path), out_prefix=str(tmp_path / "out")) - assert len(df) == 1 - assert "calib_rmse" not in df.columns or pd.isna(df.loc[0, "calib_rmse"]) From 3aaa4c525f378721d7e8e74d77ccdb28496c681c Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Tue, 7 Jul 2026 12:45:15 -0700 Subject: [PATCH 27/30] added dk_geno pinning to calibration --- CLAUDE.md | 2 + docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 150 +++++++------- reports/junit/junit.xml | 2 +- src/tfscreen/tfmodel/configuration_io.py | 7 + .../generative/components/growth/linear.py | 45 ++++- .../tfmodel/scripts/prefit_calibration_cli.py | 157 +++++++++++++-- .../components/growth/test_linear.py | 68 +++++++ .../scripts/test_prefit_calibration_cli.py | 188 ++++++++++++++++++ .../tfmodel/test_configuration_io_helpers.py | 30 +++ 11 files changed, 547 insertions(+), 106 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index b0acb7c5..95cd8f86 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -151,6 +151,8 @@ Mechanism, spanning three files: Net flow: `configure` (scalar) → `prefit` (per-condition `k_loc` indexed rows + tight scalar `k_scale`) → `fit` (loads per-condition priors that hold the baselines, closing the slide). This is the primary mechanism; the `base_growth_data`/`k_ref` anchor (below) is complementary but insufficient alone because `k_ref` is itself free to slide. +**Hard clamp on `m` (`tfs-prefit-calibration --pin_m`).** A soft Normal prior on the slope `m` — however tight — is only a KL penalty in SVI, and the growth likelihood over many observations can override it (empirically m walked ~5σ off even a 0.0005-scale pin). `linear`'s `ModelPriors.m_pinned` (bool, static) makes `m` a `deterministic` site clamped to its per-condition `m_loc` instead of a sampled site (guide drops the `m` variational params); `--pin_m` sets `condition_growth.m_pinned=1` in the priors CSV. `m` is safe to clamp because its calibration MAP loc is unbiased (dk_geno is uncorrelated with θ). **`k` is intentionally never clamped this way**: it carries real per-experiment tube-noise variance (`tube_noise_sigma`; mirrored by `k_scale_floor`) and sits in the additive k/dk_geno slide, so it keeps a floored soft prior — pin its loc, not its scale. + ### Key Abstractions **`TensorManager`** (`tfmodel/tensors/tensor_manager.py`): Handles ragged tensors. Genotypes have different numbers of observations; this class pads and indexes into JAX-compatible arrays. diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 59ca86f6..24227765 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.21%coverage96.21% \ No newline at end of file +coverage: 96.22%coverage96.22% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 2ad8984b..29944313 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3943tests3943 \ No newline at end of file +tests: 3955tests3955 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index a29e68f6..b010e7dc 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1509,30 +1509,31 @@ ./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 -./src/tfscreen/tfmodel/configuration_io.py:116:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:245:1: C901 'write_configuration' is too complex (37) -./src/tfscreen/tfmodel/configuration_io.py:327:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:330:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:332:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:333:40: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:68:1: C901 '_update_dataclass' is too complex (11) +./src/tfscreen/tfmodel/configuration_io.py:123:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/configuration_io.py:252:1: C901 'write_configuration' is too complex (37) +./src/tfscreen/tfmodel/configuration_io.py:334:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:337:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/configuration_io.py:339:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:340:31: E713 test for membership should be 'not in' -./src/tfscreen/tfmodel/configuration_io.py:346:18: W291 trailing whitespace -./src/tfscreen/tfmodel/configuration_io.py:362:33: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/configuration_io.py:374:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:410:1: E305 expected 2 blank lines after class or function definition, found 1 -./src/tfscreen/tfmodel/configuration_io.py:410:1: E402 module level import not at top of file -./src/tfscreen/tfmodel/configuration_io.py:412:1: C901 'read_configuration' is too complex (18) -./src/tfscreen/tfmodel/configuration_io.py:412:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/configuration_io.py:449:128: E501 line too long (139 > 127 characters) -./src/tfscreen/tfmodel/configuration_io.py:460:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:461:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:462:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:463:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:464:22: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/configuration_io.py:470:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:495:1: W293 blank line contains whitespace -./src/tfscreen/tfmodel/configuration_io.py:500:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:340:40: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:346:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:347:31: E713 test for membership should be 'not in' +./src/tfscreen/tfmodel/configuration_io.py:353:18: W291 trailing whitespace +./src/tfscreen/tfmodel/configuration_io.py:369:33: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/configuration_io.py:381:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:417:1: E305 expected 2 blank lines after class or function definition, found 1 +./src/tfscreen/tfmodel/configuration_io.py:417:1: E402 module level import not at top of file +./src/tfscreen/tfmodel/configuration_io.py:419:1: C901 'read_configuration' is too complex (18) +./src/tfscreen/tfmodel/configuration_io.py:419:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/tfmodel/configuration_io.py:456:128: E501 line too long (139 > 127 characters) +./src/tfscreen/tfmodel/configuration_io.py:467:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:468:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:469:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:470:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:471:22: E128 continuation line under-indented for visual indent +./src/tfscreen/tfmodel/configuration_io.py:477:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:502:1: W293 blank line contains whitespace +./src/tfscreen/tfmodel/configuration_io.py:507:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:12:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:27:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/data_class.py:28:5: E303 too many blank lines (2) @@ -1759,21 +1760,21 @@ ./src/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:1: W293 blank line contains whitespace ./src/tfscreen/tfmodel/generative/components/dk_geno/hierarchical_geno.py:374:5: W292 no newline at end of file ./src/tfscreen/tfmodel/generative/components/growth/linear.py:28:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/tfmodel/generative/components/growth/linear.py:97:13: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:254:40: E261 at least two spaces before inline comment -./src/tfscreen/tfmodel/generative/components/growth/linear.py:277:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:291:16: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:297:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:299:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:300:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:301:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:302:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:303:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:304:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:305:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:306:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:307:10: E221 multiple spaces before operator -./src/tfscreen/tfmodel/generative/components/growth/linear.py:330:12: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:107:13: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:280:40: E261 at least two spaces before inline comment +./src/tfscreen/tfmodel/generative/components/growth/linear.py:304:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:318:16: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:324:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:326:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:327:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:328:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:329:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:330:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:331:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:332:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:333:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:334:10: E221 multiple spaces before operator +./src/tfscreen/tfmodel/generative/components/growth/linear.py:357:12: E221 multiple spaces before operator ./src/tfscreen/tfmodel/generative/components/growth/power.py:25:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/growth/saturation.py:23:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/tfmodel/generative/components/growth_transition/baranyi.py:133:30: E261 at least two spaces before inline comment @@ -3624,23 +3625,20 @@ ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:124:27: E128 continuation line under-indented for visual indent ./src/tfscreen/tfmodel/scripts/predict_growth_cli.py:139:5: F841 local variable 'binding_set' is assigned to but never used ./src/tfscreen/tfmodel/scripts/predict_theta_cli.py:12:1: C901 'predict_theta' is too complex (11) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:116:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:117:23: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:208:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:209:11: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:214:20: E221 multiple spaces before operator -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:296:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:297:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:298:24: E128 continuation line under-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:301:1: C901 '_inject_calibration_priors' is too complex (21) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:560:1: C901 '_build_csv_updates' is too complex (12) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:629:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:630:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:631:35: E127 continuation line over-indented for visual indent -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:807:1: C901 '_apply_priors_updates' is too complex (13) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:893:1: C901 '_apply_guesses_updates' is too complex (12) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1045:1: E303 too many blank lines (3) -./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1049:1: E302 expected 2 blank lines, found 3 +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:129:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:130:23: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:221:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:222:11: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:227:20: E221 multiple spaces before operator +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:405:1: C901 '_inject_calibration_priors' is too complex (21) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:664:1: C901 '_build_csv_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:733:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:734:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:735:35: E127 continuation line over-indented for visual indent +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:911:1: C901 '_apply_priors_updates' is too complex (13) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:997:1: C901 '_apply_guesses_updates' is too complex (12) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1149:1: E303 too many blank lines (3) +./src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py:1153:1: E302 expected 2 blank lines, found 3 ./src/tfscreen/tfmodel/scripts/setup_grid_cli.py:163:1: C901 'setup_grid' is too complex (17) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:40:1: C901 'subset_genotypes' is too complex (23) ./src/tfscreen/tfmodel/scripts/subset_genotypes_cli.py:93:5: F841 local variable 'all_genotypes' is assigned to but never used @@ -7080,7 +7078,6 @@ ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:13:1: F401 'shutil' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:14:1: F401 'sys' imported but unused ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:22:1: F401 'jax' imported but unused -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1033:29: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1034:29: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1035:29: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1036:29: E128 continuation line under-indented for visual indent @@ -7089,23 +7086,24 @@ ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1039:29: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1040:29: E128 continuation line under-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1041:29: E128 continuation line under-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1559:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1565:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1571:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1578:47: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1586:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1592:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1600:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1606:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1612:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1619:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1626:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1640:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1654:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1666:128: E501 line too long (136 > 127 characters) -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1849:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1868:14: E127 continuation line over-indented for visual indent -./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1883:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1042:29: E128 continuation line under-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1747:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1753:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1759:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1766:47: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1774:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1780:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1788:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1794:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1800:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1807:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1814:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1828:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1842:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:1854:128: E501 line too long (136 > 127 characters) +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:2037:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:2056:14: E127 continuation line over-indented for visual indent +./tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py:2071:14: E127 continuation line over-indented for visual indent ./tests/tfscreen/tfmodel/scripts/test_sample_posterior_cli.py:5:1: F401 'unittest.mock.call' imported but unused ./tests/tfscreen/tfmodel/scripts/test_sample_prior_cli.py:3:1: F401 'pytest' imported but unused ./tests/tfscreen/tfmodel/scripts/test_subset_genotypes_cli.py:84:31: E741 ambiguous variable name 'l' @@ -7639,7 +7637,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) +51 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) @@ -7648,7 +7646,7 @@ 2 E124 closing bracket does not match visual indentation 6 E125 continuation line with same indent as next logical line 210 E127 continuation line over-indented for visual indent -94 E128 continuation line under-indented for visual indent +91 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' 28 E202 whitespace before ']' @@ -7687,4 +7685,4 @@ 85 W292 no newline at end of file 1582 W293 blank line contains whitespace 30 W391 blank line at end of file -7641 +7639 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 237a4603..a9eab136 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/tfmodel/configuration_io.py b/src/tfscreen/tfmodel/configuration_io.py index 678937ed..f0128db0 100644 --- a/src/tfscreen/tfmodel/configuration_io.py +++ b/src/tfscreen/tfmodel/configuration_io.py @@ -100,6 +100,13 @@ def _update_dataclass(dc, prefix, flat_dict): merged = dict(attr_val) merged.update(sub) updates[field_name] = merged + elif isinstance(attr_val, tuple): + # Static structural tuples (e.g. condition_growth.m_is_selection) + # are re-derived at construction and serialised by + # _extract_scalars as a *string* (e.g. "(True, False)"). Never + # overwrite the correctly-typed tuple with that string — keep + # the freshly-built value. + continue elif full_key in flat_dict: new_val = flat_dict[full_key] if isinstance(attr_val, int) and not isinstance(attr_val, bool): diff --git a/src/tfscreen/tfmodel/generative/components/growth/linear.py b/src/tfscreen/tfmodel/generative/components/growth/linear.py index 5c47d567..468b64ad 100644 --- a/src/tfscreen/tfmodel/generative/components/growth/linear.py +++ b/src/tfscreen/tfmodel/generative/components/growth/linear.py @@ -59,6 +59,15 @@ class ModelPriors: conditions, ``False`` for control ('-') conditions. ``None`` disables the per-condition logic and uses ``m_scale`` for all conditions (backward-compatible default). + m_pinned : bool + When ``True``, the per-condition slope m is *clamped* to ``m_loc`` + (a ``deterministic`` site) instead of sampled, so the growth + likelihood cannot inflate it away from the calibration-pinned value. + A soft Normal prior — however tight — is only a KL penalty in SVI and + the likelihood over many observations can override it; this is a hard + clamp. ``k`` is intentionally never clamped this way: it carries real + per-experiment (tube-noise) variance and sits in the additive + k/dk_geno slide, so it keeps a floored soft prior. Default ``False``. """ k_loc: float k_scale: float @@ -67,6 +76,7 @@ class ModelPriors: m_scale_minus: float m_scale_plus: float m_is_selection: tuple = field(pytree_node=False, default=None) + m_pinned: bool = field(pytree_node=False, default=False) # --------------------------------------------------------------------------- @@ -163,11 +173,20 @@ def define_model(name: str, k_scale_arr = jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)) m_loc_arr = jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,)) + m_pinned = bool(priors.m_pinned) + with pyro.plate(f"{name}_condition_parameters", num_cr) as idx: growth_k = pyro.sample(f"{name}_k", dist.Normal(k_loc_arr[idx], k_scale_arr[idx])) - growth_m = pyro.sample(f"{name}_m", - dist.Normal(m_loc_arr[idx], m_scale_arr[idx])) + if not m_pinned: + growth_m = pyro.sample(f"{name}_m", + dist.Normal(m_loc_arr[idx], m_scale_arr[idx])) + + if m_pinned: + # Hard clamp: hold m at its per-condition loc (deterministic) rather + # than sampling it. Registered as a site so extraction / posterior + # sampling still find "{name}_m". + growth_m = pyro.deterministic(f"{name}_m", m_loc_arr) k_pre = growth_k[data.map_condition_pre] m_pre = growth_m[data.map_condition_pre] @@ -186,22 +205,29 @@ def guide(name: str, Maintains per-condition variational parameters for k and m. """ num_cr = data.num_condition_rep + m_pinned = bool(priors.m_pinned) k_locs = pyro.param(f"{name}_k_locs", jnp.broadcast_to(jnp.asarray(priors.k_loc, dtype=float), (num_cr,))) k_scales = pyro.param(f"{name}_k_scales", jnp.broadcast_to(jnp.asarray(priors.k_scale, dtype=float), (num_cr,)), constraint=dist.constraints.positive) - m_locs = pyro.param(f"{name}_m_locs", - jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,))) - m_scales = pyro.param(f"{name}_m_scales", - jnp.broadcast_to(jnp.asarray(priors.m_scale, dtype=float), (num_cr,)), - constraint=dist.constraints.positive) + if not m_pinned: + m_locs = pyro.param(f"{name}_m_locs", + jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,))) + m_scales = pyro.param(f"{name}_m_scales", + jnp.broadcast_to(jnp.asarray(priors.m_scale, dtype=float), (num_cr,)), + constraint=dist.constraints.positive) with pyro.plate(f"{name}_condition_parameters", data.num_condition_rep) as idx: growth_k = pyro.sample(f"{name}_k", dist.Normal(k_locs[..., idx], k_scales[..., idx])) - growth_m = pyro.sample(f"{name}_m", - dist.Normal(m_locs[..., idx], m_scales[..., idx])) + if not m_pinned: + growth_m = pyro.sample(f"{name}_m", + dist.Normal(m_locs[..., idx], m_scales[..., idx])) + + if m_pinned: + # Clamped in the model (deterministic); no variational site here. + growth_m = jnp.broadcast_to(jnp.asarray(priors.m_loc, dtype=float), (num_cr,)) k_pre = growth_k[data.map_condition_pre] m_pre = growth_m[data.map_condition_pre] @@ -253,6 +279,7 @@ def get_hyperparameters(): parameters["m_scale"] = 0.01 # used when m_is_selection is None parameters["m_scale_minus"] = 0.001 # tight prior for '-' control conditions parameters["m_scale_plus"] = 0.01 # normal prior for '+' selection conditions + parameters["m_pinned"] = False # hard-clamp m to m_loc when True return parameters diff --git a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py index 4c7b1fae..0025ce27 100644 --- a/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py +++ b/src/tfscreen/tfmodel/scripts/prefit_calibration_cli.py @@ -13,12 +13,24 @@ prior locs (degenerate, no learning) - ``dk_geno`` → ``fixed`` (all zeros; eliminates the WT-anchor bias that arises when mutants have non-zero mean - pleiotropic effects), *unless* the production - config already selects ``dk_geno: "pinned"``, in - which case the calibration model keeps - ``"pinned"`` (and its pins file) so genotypes - with independently known dk_geno retain their - real value instead of being zeroed out too. + pleiotropic effects), *unless* either: + (a) the production config already selects + ``dk_geno: "pinned"``, in which case the + calibration model keeps ``"pinned"`` (and its + pins file) so genotypes with independently known + dk_geno retain their real value; or + (b) a ``base_growth_df`` is available, in which + case its measured reference-condition growth + rates are turned into per-genotype dk_geno pins + (``dk_geno_g = rate_g - rate_wt``) and the + calibration model uses ``"pinned"`` with those + values. This feeds the MAP the *real* dk_geno + for the calibration mutants instead of a + known-false 0 -- strictly more correct, though + empirically it does not by itself move the + per-condition ``k_loc`` (wt, with dk_geno=0 in + every dk_geno component, already anchors the + shared ``k``). - ``ln_cfu0`` → ``hierarchical`` with hyperparams *pinned* - ``transformation`` → ``single`` (no learning) - ``theta_*_noise`` → ``zero`` (no learning) @@ -46,6 +58,7 @@ import os import shutil import sys +import tempfile import numpy as np import pandas as pd @@ -252,6 +265,66 @@ def _compute_theta_values(orchestrator_cal, binding_df_cal): # Calibration model construction # --------------------------------------------------------------------------- +def _dk_geno_pins_from_base_growth(base_growth_df, growth_df): + """ + Derive per-genotype dk_geno pins from measured reference-condition + growth rates. + + ``base_growth_df`` holds direct growth-rate measurements ``rate`` for wt + plus the calibration genotypes, where ``rate = k_ref + dk_geno`` (dk_geno + is 0 for wt by convention). Subtracting wt's rate cancels the shared + ``k_ref`` and yields each genotype's real pleiotropic effect:: + + dk_geno_g = rate_g - rate_wt + + Multiple rows per genotype are inverse-variance combined first, via + ``model_orchestrator._read_base_growth_df`` (mirroring the inference + side), so each genotype contributes a single ``rate``. That helper also + validates required columns and guarantees a wt row is present. + + Parameters + ---------- + base_growth_df : pd.DataFrame or str + Base growth-rate data (or a path to it); columns ``genotype``, + ``rate``, ``rate_std``. + growth_df : pd.DataFrame + The calibration growth DataFrame; used to determine the valid set of + genotypes (rows for genotypes absent here are dropped). + + Returns + ------- + dict[str, float] + ``{genotype: dk_geno}``; wt maps to exactly 0.0. + """ + from tfscreen.tfmodel.model_orchestrator import _read_base_growth_df + + combined = _read_base_growth_df(base_growth_df, growth_df) + rate_by_geno = dict(zip(combined["genotype"].astype(str), + combined["rate"].astype(float))) + rate_wt = rate_by_geno["wt"] + return {g: (0.0 if g == "wt" else r - rate_wt) + for g, r in rate_by_geno.items()} + + +def _write_dk_geno_pins_file(pins): + """ + Write a ``{genotype: dk_geno}`` mapping to a temporary CSV in the shape + ``dk_geno.pinned.read_dk_geno_pins`` / + ``ModelOrchestrator(dk_geno_pins_file=...)`` expect (columns ``genotype``, + ``dk_geno``), returning its path. + + The caller is responsible for deleting the file once the calibration + ``ModelOrchestrator`` has consumed it (the pins are read into + ``_dk_geno_values`` at construction time, so the file is not needed + afterwards). + """ + fd, path = tempfile.mkstemp(prefix="tfs_prefit_", suffix="_dk_geno_pins.csv") + os.close(fd) + pd.DataFrame({"genotype": list(pins.keys()), + "dk_geno": list(pins.values())}).to_csv(path, index=False) + return path + + def _build_calibration_model(orchestrator_prod, growth_df_cal, binding_df_cal): """ Construct the calibration ``ModelOrchestrator`` with hardcoded calibration @@ -280,22 +353,53 @@ def _build_calibration_model(orchestrator_prod, growth_df_cal, binding_df_cal): # dk_geno: the calibration MAP must not *learn* dk_geno from # calibration-only data (that reintroduces the WT-anchor bias this - # pre-fit exists to avoid). Default: force to "fixed" (all zero), like - # every other overridden component. Exception: if the production config - # pins specific genotypes' dk_geno via "pinned", carry that choice (and - # its pins file) into the calibration model too, so those genotypes keep - # their real, independently-known dk_geno during the linking-function - # fit instead of being zeroed out along with everything else. - if settings.get("dk_geno") != "pinned": + # pre-fit exists to avoid). But zeroing dk_geno for calibration mutants + # that genuinely have a non-zero pleiotropic effect is also wrong -- it + # feeds the MAP a known-false value. When base_growth measures those + # mutants' reference-condition growth we can supply the *real* dk_geno + # instead of a false 0. + # + # - Production already "pinned": carry that choice (and its pins file) + # through unchanged; those genotypes keep their independently-known + # dk_geno. + # - base_growth_df available: convert its measured reference-condition + # growth rates into KNOWN dk_geno pins (rate_g - rate_wt) and pin them. + # - Otherwise: force "fixed" (all zero), like every other overridden + # component. + # + # NOTE: empirically this does *not* by itself de-bias the per-condition + # k_loc on the sims tested so far (out11) -- wt, whose dk_geno is 0 in + # every dk_geno component, already anchors the shared per-condition k, so + # the mutants' dk value has no leverage on it. The pin is kept because it + # is strictly more correct (real dk_geno vs a false 0) and harmless (no k + # regression), not because it moves k_loc. + temp_pins_path = None + if settings.get("dk_geno") == "pinned": + pass + elif settings.get("base_growth_df") is not None: + pins = _dk_geno_pins_from_base_growth(settings["base_growth_df"], + growth_df_cal) + temp_pins_path = _write_dk_geno_pins_file(pins) + settings["dk_geno"] = "pinned" + settings["dk_geno_pins_file"] = temp_pins_path + else: settings["dk_geno"] = "fixed" settings.pop("dk_geno_pins_file", None) batch_size = settings.pop("batch_size", None) - return ModelOrchestrator(growth_df_cal, - binding_df_cal, - batch_size=batch_size, - **settings) + try: + orchestrator_cal = ModelOrchestrator(growth_df_cal, + binding_df_cal, + batch_size=batch_size, + **settings) + finally: + # The pins file is consumed at construction (baked into + # _dk_geno_values); remove the temporary now so it doesn't linger. + if temp_pins_path is not None and os.path.exists(temp_pins_path): + os.remove(temp_pins_path) + + return orchestrator_cal def _inject_calibration_priors(orchestrator_cal, orchestrator_prod, theta_values): @@ -1066,7 +1170,8 @@ def run_prefit_calibration(config_file, m_scale_floor=_DEFAULT_M_SCALE_FLOOR, k_scale_ceiling=_DEFAULT_K_SCALE_CEILING, m_scale_ceiling=_DEFAULT_M_SCALE_CEILING, - hessian_chunk_size=64): + hessian_chunk_size=64, + pin_m=False): """ Run the calibration pre-fit and update the production priors / guesses CSVs in place. @@ -1157,6 +1262,13 @@ def run_prefit_calibration(config_file, hessian_chunk_size : int, optional Number of Hessian rows computed per device batch (default 64). Reduce if device runs out of memory during Hessian computation. + pin_m : bool, optional + When set, hard-clamp the production model's per-condition slope m to + its calibration MAP loc by writing ``condition_growth.m_pinned`` into + the priors CSV (default False). Use this instead of an ultra-tight + m_scale when you want m held exactly at the calibration value — a soft + prior can be overridden by the growth likelihood. Only affects m; k + keeps its floored soft prior. Returns ------- @@ -1256,6 +1368,15 @@ def run_prefit_calibration(config_file, guess_updates.update(hessian_guess_updates) prior_updates.update(hessian_prior_updates) + # Hard-clamp m: with pin_m, condition_growth's slope m is held at its + # per-condition MAP loc (a deterministic site) instead of sampled with a + # soft prior. A soft Normal prior — even at a tiny scale — is only a KL + # penalty in SVI and the growth likelihood can override it (see linear.py + # ModelPriors.m_pinned). k is intentionally NOT clamped (tube-noise + # variance + the additive k/dk_geno slide), so this only sets m_pinned. + if pin_m: + prior_updates[_csv_row_name("condition_growth", "m_pinned")] = 1.0 + # Labels ordered as the per-condition MAP arrays, so the per-condition # prior loc rows can be name-joined back to the production condition order. cond_rep_labels = _condition_rep_labels(orchestrator_cal) diff --git a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py index 875b779e..84de4525 100644 --- a/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py +++ b/tests/tfscreen/tfmodel/generative/components/growth/test_linear.py @@ -322,6 +322,74 @@ def test_model_and_guide_have_compatible_sample_sites(mock_data): ) +# --- m_pinned (hard clamp) tests --- + +def test_define_model_m_pinned_clamps_to_m_loc(mock_data): + """With m_pinned, m is a deterministic site equal to m_loc; k still sampled.""" + name = "pin" + m_loc = jnp.array([0.1, 0.2, 0.3]) + priors = get_priors().replace(m_loc=m_loc, m_pinned=True) + + with seed(rng_seed=0): + model_trace = trace(define_model).get_trace( + name=name, data=mock_data, priors=priors + ) + + assert model_trace[f"{name}_m"]["type"] == "deterministic" + assert model_trace[f"{name}_k"]["type"] == "sample" + np.testing.assert_allclose( + np.asarray(model_trace[f"{name}_m"]["value"]), np.asarray(m_loc) + ) + + # The clamped value propagates through the condition mapping. + with seed(rng_seed=0): + params = define_model(name=name, data=mock_data, priors=priors) + np.testing.assert_allclose( + np.asarray(params.m_sel), np.asarray(m_loc[mock_data.map_condition_sel]) + ) + + +def test_guide_m_pinned_registers_no_m_params(mock_data): + """With m_pinned, the guide drops m's variational params and sample site.""" + name = "pin" + priors = get_priors().replace(m_loc=jnp.array([0.1, 0.2, 0.3]), m_pinned=True) + + with seed(rng_seed=0): + guide_trace = trace(guide).get_trace( + name=name, data=mock_data, priors=priors + ) + + assert f"{name}_k_locs" in guide_trace # k still variational + assert f"{name}_m_locs" not in guide_trace + assert f"{name}_m_scales" not in guide_trace + assert f"{name}_m" not in guide_trace + + +def test_model_guide_compatible_when_m_pinned(mock_data): + """Model and guide must still agree on sample sites when m is clamped.""" + name = "pin" + priors = get_priors().replace(m_loc=jnp.array([0.1, 0.2, 0.3]), m_pinned=True) + + with seed(rng_seed=0): + model_trace = trace(define_model).get_trace( + name=name, data=mock_data, priors=priors + ) + with seed(rng_seed=0): + guide_trace = trace(guide).get_trace( + name=name, data=mock_data, priors=priors + ) + + model_samples = { + n for n, s in model_trace.items() + if s["type"] == "sample" and not s.get("is_observed", False) + } + guide_samples = {n for n, s in guide_trace.items() if s["type"] == "sample"} + + assert model_samples == guide_samples + assert f"{name}_m" not in model_samples # m is no longer sampled + assert f"{name}_k" in model_samples # k still is + + # --------------------------------------------------------------------------- # _parse_condition_label # --------------------------------------------------------------------------- diff --git a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py index d5205d3f..a81f95ba 100644 --- a/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py +++ b/tests/tfscreen/tfmodel/scripts/test_prefit_calibration_cli.py @@ -34,6 +34,7 @@ _build_hessian_scale_updates, _compute_theta_values, _csv_row_name, + _dk_geno_pins_from_base_growth, _drop_presplit_backed_ln_cfu0_sites, _identify_field_mapping, _inject_calibration_priors, @@ -1050,6 +1051,193 @@ def test_does_not_mutate_production_settings(self): assert orchestrator_prod.settings == original_settings + def _base_growth_settings(self): + return { + "theta": "categorical_geno", + "activity": "horseshoe_geno", + "dk_geno": "hierarchical_geno", # production value; not "pinned" + "ln_cfu0": "fixed", + "transformation": "logit_norm", + "theta_growth_noise": "beta", + "theta_binding_noise": "beta", + "condition_growth": "linear", + "growth_transition": "instant", + "batch_size": None, + "spiked_genotypes": None, + "base_growth_df": pd.DataFrame({ + "genotype": ["wt", "M42I", "H74A", "K84L"], + "rate": [0.0107, 0.0087, 0.0072, 0.0090], + "rate_std": [0.0005, 0.0005, 0.0005, 0.0005], + }), + } + + def _cal_growth_df(self): + # Every base_growth genotype must appear in the calibration growth df, + # or _read_base_growth_df would drop it (wt must survive). + return pd.DataFrame({ + "genotype": ["wt", "M42I", "H74A", "K84L"], + "titrant_name": ["IPTG"] * 4, + "titrant_conc": [0.0] * 4, + "ln_cfu": [1.0, 2.0, 3.0, 4.0], + }) + + def test_base_growth_present_pins_dk_geno_from_rate_minus_wt(self): + """ + When a base_growth_df is available (and production isn't already + "pinned"), the calibration model must use dk_geno="pinned" with pins + equal to rate_g - rate_wt, instead of zeroing dk_geno via "fixed". + """ + orchestrator_prod = MagicMock() + orchestrator_prod.settings = self._base_growth_settings() + + captured = {} + + def _fake_gm(*args, **kwargs): + captured["kwargs"] = kwargs + pins_path = kwargs.get("dk_geno_pins_file") + # Read the pins file while it still exists (deleted after ctor). + if pins_path and os.path.exists(pins_path): + captured["pins_df"] = pd.read_csv(pins_path) + return MagicMock() + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator", + side_effect=_fake_gm, + ): + _build_calibration_model( + orchestrator_prod, self._cal_growth_df(), pd.DataFrame() + ) + + kwargs = captured["kwargs"] + assert kwargs["dk_geno"] == "pinned" + pins_path = kwargs["dk_geno_pins_file"] + assert pins_path is not None + + pins_df = captured["pins_df"] + pins = dict(zip(pins_df["genotype"].astype(str), + pins_df["dk_geno"].astype(float))) + assert pins["wt"] == pytest.approx(0.0) + assert pins["M42I"] == pytest.approx(0.0087 - 0.0107) + assert pins["H74A"] == pytest.approx(0.0072 - 0.0107) + assert pins["K84L"] == pytest.approx(0.0090 - 0.0107) + + def test_temp_pins_file_removed_after_construction(self): + """The temporary pins CSV must not linger after the ctor consumes it.""" + orchestrator_prod = MagicMock() + orchestrator_prod.settings = self._base_growth_settings() + + seen = {} + + def _fake_gm(*args, **kwargs): + seen["path"] = kwargs.get("dk_geno_pins_file") + return MagicMock() + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator", + side_effect=_fake_gm, + ): + _build_calibration_model( + orchestrator_prod, self._cal_growth_df(), pd.DataFrame() + ) + + assert seen["path"] is not None + assert not os.path.exists(seen["path"]) + + def test_production_pinned_takes_precedence_over_base_growth(self): + """ + If production already pins dk_geno, that carries through unchanged even + when a base_growth_df is present -- the explicit pins file wins. + """ + orchestrator_prod = MagicMock() + settings = self._base_growth_settings() + settings["dk_geno"] = "pinned" + settings["dk_geno_pins_file"] = "explicit_pins.csv" + orchestrator_prod.settings = settings + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator" + ) as MockGM: + MockGM.return_value = MagicMock() + _build_calibration_model( + orchestrator_prod, self._cal_growth_df(), pd.DataFrame() + ) + + kwargs = MockGM.call_args.kwargs + assert kwargs["dk_geno"] == "pinned" + assert kwargs["dk_geno_pins_file"] == "explicit_pins.csv" + + def test_no_base_growth_still_forces_fixed(self): + """Absent base_growth_df (and not production-pinned) → fixed(0).""" + orchestrator_prod = MagicMock() + settings = self._base_growth_settings() + settings["base_growth_df"] = None + orchestrator_prod.settings = settings + + with patch( + "tfscreen.tfmodel.scripts" + ".prefit_calibration_cli.ModelOrchestrator" + ) as MockGM: + MockGM.return_value = MagicMock() + _build_calibration_model( + orchestrator_prod, self._cal_growth_df(), pd.DataFrame() + ) + + kwargs = MockGM.call_args.kwargs + assert kwargs["dk_geno"] == "fixed" + assert "dk_geno_pins_file" not in kwargs + + +# --------------------------------------------------------------------------- +# _dk_geno_pins_from_base_growth +# --------------------------------------------------------------------------- + +class TestDkGenoPinsFromBaseGrowth: + + def _growth_df(self): + return pd.DataFrame({ + "genotype": ["wt", "M42I", "H74A", "K84L"], + "titrant_name": ["IPTG"] * 4, + "titrant_conc": [0.0] * 4, + "ln_cfu": [1.0, 2.0, 3.0, 4.0], + }) + + def test_pins_are_rate_minus_wt(self): + base_growth_df = pd.DataFrame({ + "genotype": ["wt", "M42I", "H74A", "K84L"], + "rate": [0.0107, 0.0087, 0.0072, 0.0090], + "rate_std": [0.0005, 0.0005, 0.0005, 0.0005], + }) + pins = _dk_geno_pins_from_base_growth(base_growth_df, self._growth_df()) + assert pins["wt"] == pytest.approx(0.0) + assert pins["M42I"] == pytest.approx(0.0087 - 0.0107) + assert pins["H74A"] == pytest.approx(0.0072 - 0.0107) + assert pins["K84L"] == pytest.approx(0.0090 - 0.0107) + + def test_wt_pin_is_exactly_zero(self): + base_growth_df = pd.DataFrame({ + "genotype": ["wt", "M42I"], + "rate": [0.0107, 0.0087], + "rate_std": [0.0005, 0.0005], + }) + pins = _dk_geno_pins_from_base_growth(base_growth_df, self._growth_df()) + assert pins["wt"] == 0.0 + + def test_inverse_variance_weighting_multiple_rows(self): + # Two wt rows (combine to ~0.0107) and one M42I row. The tighter-std + # wt row dominates the inverse-variance-weighted combination. + base_growth_df = pd.DataFrame({ + "genotype": ["wt", "wt", "M42I"], + "rate": [0.0100, 0.0108, 0.0087], + "rate_std": [0.01, 0.0005, 0.0005], + }) + pins = _dk_geno_pins_from_base_growth(base_growth_df, self._growth_df()) + # Combined wt rate is very close to the tight 0.0108 measurement. + assert pins["wt"] == 0.0 + assert pins["M42I"] == pytest.approx(0.0087 - 0.0108, abs=1e-4) + # --------------------------------------------------------------------------- # _inject_calibration_priors — end-to-end pin / copy behaviour diff --git a/tests/tfscreen/tfmodel/test_configuration_io_helpers.py b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py index 9848c373..64626398 100644 --- a/tests/tfscreen/tfmodel/test_configuration_io_helpers.py +++ b/tests/tfscreen/tfmodel/test_configuration_io_helpers.py @@ -18,6 +18,10 @@ _extract_prior_arrays, _assemble_condition_array, _read_priors_flat, + _update_dataclass, +) +from tfscreen.tfmodel.generative.components.growth.linear import ( + get_priors as _linear_get_priors, ) @@ -357,3 +361,29 @@ def test_extract_then_read_preserves_array(self): }) flat = _read_priors_flat(df, cond_rep_map) assert np.allclose(np.asarray(flat[key]), [0.011, 0.021, 0.029]) + + +class TestUpdateDataclassStaticFields: + """_update_dataclass must not corrupt static tuple fields, and must apply + scalar (incl. bool-as-float) overrides.""" + + def test_tuple_field_not_overwritten_by_csv_string(self): + # m_is_selection is serialised by _extract_scalars as a string; the + # freshly-derived tuple must survive the round-trip unchanged. + priors = _linear_get_priors(is_selection=[True, False, True]) + assert priors.m_is_selection == (True, False, True) + + flat = { + "m_is_selection": "(True, False, True)", # the corrupting string + "m_scale_plus": 0.5, # a real scalar override + } + updated = _update_dataclass(priors, "", flat) + + assert updated.m_is_selection == (True, False, True) # tuple preserved + assert updated.m_scale_plus == 0.5 # scalar applied + + def test_m_pinned_bool_roundtrips_truthy(self): + priors = _linear_get_priors() + assert not priors.m_pinned + updated = _update_dataclass(priors, "", {"m_pinned": 1.0}) + assert bool(updated.m_pinned) From cc6c018f81881b9f8f254973bd4d548b61e0249f Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Wed, 8 Jul 2026 12:11:43 -0700 Subject: [PATCH 28/30] more granular simulation control, parameter clamping --- CLAUDE.md | 22 +- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- .../simulate-and-analyze/simulate_config.yaml | 16 +- examples/simulate/simulate_config.yaml | 13 +- reports/flake.txt | 27 +- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/binding_data.py | 30 +- src/tfscreen/simulate/library_prediction.py | 312 ++++++++++-------- src/tfscreen/simulate/sample_theta.py | 15 +- src/tfscreen/simulate/scripts/simulate_cli.py | 29 +- .../simulate/test_library_prediction.py | 49 +-- 12 files changed, 310 insertions(+), 209 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 95cd8f86..a07d49b9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -186,18 +186,23 @@ The core calculation happens in `thermo_to_growth` (`simulate/thermo_to_growth.p ### Binding data and calibration genotypes -The optional `binding_data` YAML block configures calibration genotypes for which measured binding curves are available. It has two sub-paths that can coexist: +The optional `binding_data` YAML block configures calibration genotypes for which measured binding curves are available. Top-level keys `titrant_name`, `titrant_conc`, `noise` describe the (shared) binding assay. Two sub-blocks select which genotypes are measured, each with a `choose_by` (`stratified` | `random` | *params-file path*) and, for non-file modes, a `num`: -**Path 1: Simulated genotypes** (`binding_data.genotypes` list) -- `wt` gets its natural unperturbed prior-predictive reference curve. -- Non-wt entries are drawn via a stratified (greedy maximin) algorithm across binding concentrations, ensuring diverse coverage. -- The selected theta values at *growth* concentrations are injected via `theta_gc_override` so that the simulated growth data is consistent with the binding data. +**`spiked_binding`** — clean, monoclonal (congression-free) controls; **pool = `spiked_seqs`**. +- `choose_by: ` — the named genotypes get the file's Hill params as their true phenotype (see the measured-params bullets below). `num` is forbidden with a file. +- `choose_by: stratified|random` — assign diverse (greedy-maximin) / random prior-predictive theta curves to `num` spiked genotypes (default all); `wt` keeps its natural reference. Their theta at *growth* concentrations is injected via `theta_gc_override` so growth matches binding. -**Path 2: Measured Hill parameters** (`binding_data.genotype_params_file`) +**`library_binding`** — in-library controls drawn from the **bulk** (congression-affected growth); **pool = library genotypes NOT in `spiked_seqs`**. Omit to disable. +- These are regime-matched to the bulk: on the fit side they are simply extra `binding_df` rows and, because they are *not* in `--spiked`, they get `congression_mask=True` automatically. No fit-side change. +- **Pre/post-sim split** (`simulate/library_binding_data.py::generate_library_binding_df`): the `file` path injects the genotypes' phenotype *pre-sim* (in `library_prediction`, via the same override machinery), but the binding *measurement* — and, for `stratified`/`random`, the *selection* — happen **post-growth-sim** so selection is restricted to genotypes that actually survived with growth data (guaranteeing `num` usable anchors). `file`-specified genotypes that don't survive are **warned** and dropped. `simulate_cli.py` writes the selected set to `tfs_sim_library_binding.csv`. + +**Validation** (`library_prediction._validate_binding_config`, fail-fast): `spiked_binding` file genotypes must be ⊆ `spiked_seqs`; `library_binding` file genotypes must be disjoint from `spiked_seqs`; `num` + a file is an error; a file requires a Hill theta component; `spiked_binding.num` ∈ `[1, num_spiked]`; `library_binding` stratified/random requires `num`. + +**Measured Hill parameters** (a `choose_by` *params file*, either block): - Reads a CSV with columns `genotype, theta_low, theta_high, log_hill_K, hill_n`. - Only supported for Hill-based theta components (`hill_geno`, `hill_mut`). - **`theta_low` and `theta_high` are clamped to `[1e-4, 1-1e-4]` at read time** with a `UserWarning`. This is critical: a value of e.g. `1.000004` (a common float-rounding artefact) maps to `logit ≈ +16`, making all per-mutation deltas ~13–15 σ under the `HalfNormal(1)` prior on delta scales and preventing inference from recovering reasonable theta values. -- For `hill_mut`: the function `build_theta_gc_override_hill_mut` assembles theta for **all library genotypes** (not just the measured ones) by additively combining per-mutation logit-space deltas. The WT reference is taken from `SimPriors` defaults. Multi-mutant genotypes not directly measured in the CSV are assembled from single-mutant deltas; directly-measured multi-mutants use their CSV values directly. +- For `hill_mut`: `build_theta_gc_override_hill_mut` assembles theta for **all library genotypes** (not just the measured ones) by additively combining per-mutation logit-space deltas. The WT reference is taken from `SimPriors` defaults. Multi-mutant genotypes not directly measured in the CSV are assembled from single-mutant deltas; directly-measured multi-mutants use their CSV values directly. - Measured genotypes override any earlier simulated-path values in `theta_gc_override`. ### Base growth-rate calibration data @@ -243,7 +248,8 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/library_prediction.py` | Top-level orchestrator; assembles override dicts and calls `thermo_to_growth` | | `simulate/thermo_to_growth.py` | Prior-predictive sampling, theta injection, growth calculation, parameters_df assembly | | `simulate/binding_params.py` | CSV reading (with theta clipping), per-component override builders, binding theta assemblers | -| `simulate/binding_data.py` | Generates simulated observed binding curve data (`binding_data.genotypes` path; `generate_binding_df`) | +| `simulate/binding_data.py` | Noise-injects the pre-sim `binding_theta_df` (spiked binding genotypes) into an observed binding CSV; `generate_binding_df` | +| `simulate/library_binding_data.py` | Post-sim generator for `binding_data.library_binding` (in-library, congression-affected binding genotypes; survivor-restricted selection); `generate_library_binding_df` | | `simulate/base_growth_data.py` | Generates simulated direct growth-rate calibration data (`base_growth_data` YAML block) and the single-row `k_ref` ground-truth echo | | `simulate/growth_parameters_output.py` | Generates per-condition `condition_growth` ground truth (`tfs_sim_growth_parameters.csv`) from the `growth` YAML block | | `simulate/presplit_data.py` | Generates simulated pre-split (t = -t_pre) data (`presplit_data` YAML block; `generate_presplit_df`) | diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 24227765..c24babeb 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.22%coverage96.22% \ No newline at end of file +coverage: 96.12%coverage96.12% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 29944313..f5f600e0 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3955tests3955 \ No newline at end of file +tests: 3970tests3970 \ No newline at end of file diff --git a/examples/simulate-and-analyze/simulate_config.yaml b/examples/simulate-and-analyze/simulate_config.yaml index 22479161..895c2024 100644 --- a/examples/simulate-and-analyze/simulate_config.yaml +++ b/examples/simulate-and-analyze/simulate_config.yaml @@ -237,10 +237,24 @@ seed: 12345 # curves. binding_data: - genotype_params_file: hill_params.csv + # The binding assay (shared by both genotype sets). titrant_name: iptg titrant_conc: [0, 0.0001, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1.0] noise: 0.001 + # Clean, monoclonal (congression-free) controls. Pool = spiked_seqs. + # choose_by: | stratified | random + # num: optional [1, num_spiked], default all (forbidden with a file) + spiked_binding: + choose_by: hill_params.csv + + # In-library controls, drawn from the bulk (congression-affected growth). + # Pool = library genotypes NOT in spiked_seqs. Omit to disable. + # choose_by: stratified | random | + # num: required for stratified/random (forbidden with a file) + # library_binding: + # num: 20 + # choose_by: stratified + presplit_data: noise: 0.00 diff --git a/examples/simulate/simulate_config.yaml b/examples/simulate/simulate_config.yaml index a6a2f7c1..78c193de 100644 --- a/examples/simulate/simulate_config.yaml +++ b/examples/simulate/simulate_config.yaml @@ -286,12 +286,19 @@ seed: null # curves. titrant_name must match e_name in observable_calc_kwargs. # # 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 +# # Clean, monoclonal controls (pool = spiked_seqs). +# # choose_by: | stratified | random ; num optional (no file) +# spiked_binding: +# choose_by: stratified +# num: 4 +# # In-library controls from the bulk (congression-affected). Pool = non-spiked. +# # choose_by: stratified | random | ; num required (no file) +# library_binding: +# num: 20 +# choose_by: stratified # --------------------------------------------------------------------------- # Base growth-rate calibration data (optional) diff --git a/reports/flake.txt b/reports/flake.txt index b010e7dc..e62ebaef 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1237,11 +1237,9 @@ ./src/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file -./src/tfscreen/simulate/library_prediction.py:28:1: C901 'library_prediction' is too complex (14) -./src/tfscreen/simulate/library_prediction.py:28:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/library_prediction.py:29:43: E252 missing whitespace around parameter equals -./src/tfscreen/simulate/library_prediction.py:29:44: E252 missing whitespace around parameter equals -./src/tfscreen/simulate/library_prediction.py:123:9: F841 local variable 'binding_noise' is assigned to but never used +./src/tfscreen/simulate/library_prediction.py:34:1: C901 '_validate_binding_config' is too complex (13) +./src/tfscreen/simulate/library_prediction.py:170:43: E252 missing whitespace around parameter equals +./src/tfscreen/simulate/library_prediction.py:170:44: E252 missing whitespace around parameter equals ./src/tfscreen/simulate/presplit_data.py:55:15: E221 multiple spaces before operator ./src/tfscreen/simulate/presplit_data.py:56:17: E221 multiple spaces before operator ./src/tfscreen/simulate/presplit_data.py:57:16: E221 multiple spaces before operator @@ -1307,10 +1305,11 @@ ./src/tfscreen/simulate/sample_theta.py:175:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:176:30: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/sample_theta.py:177:30: E127 continuation line over-indented for visual indent -./src/tfscreen/simulate/sample_theta.py:270:19: E221 multiple spaces before operator +./src/tfscreen/simulate/sample_theta.py:178:30: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/sample_theta.py:271:19: E221 multiple spaces before operator ./src/tfscreen/simulate/scripts/setup_sim_grid_cli.py:101:1: C901 'setup_sim_grid' is too complex (17) -./src/tfscreen/simulate/scripts/simulate_cli.py:17:1: C901 'run_simulation_from_config' is too complex (12) -./src/tfscreen/simulate/scripts/simulate_cli.py:150:128: E501 line too long (153 > 127 characters) +./src/tfscreen/simulate/scripts/simulate_cli.py:18:1: C901 'run_simulation_from_config' is too complex (15) +./src/tfscreen/simulate/scripts/simulate_cli.py:153:128: E501 line too long (153 > 127 characters) ./src/tfscreen/simulate/selection_experiment.py:42:38: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:43:37: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' @@ -5140,8 +5139,8 @@ ./tests/tfscreen/simulate/test_build_sample_dataframes.py:128:55: W292 no newline at end of file ./tests/tfscreen/simulate/test_growth_parameters_output.py:4:1: F401 'pandas as pd' imported but unused ./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 +./tests/tfscreen/simulate/test_library_prediction.py:293:5: F401 'numpy as np' imported but unused +./tests/tfscreen/simulate/test_library_prediction.py:441:16: E272 multiple spaces before keyword ./tests/tfscreen/simulate/test_presplit_data.py:71:36: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_presplit_data.py:83:42: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/test_presplit_data.py:84:42: E127 continuation line over-indented for visual indent @@ -7645,7 +7644,7 @@ 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 -210 E127 continuation line over-indented for visual indent +211 E127 continuation line over-indented for visual indent 91 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' @@ -7664,7 +7663,7 @@ 2 E266 too many leading '#' for block comment 149 E272 multiple spaces before keyword 1 E301 expected 1 blank line, found 0 -781 E302 expected 2 blank lines, found 1 +780 E302 expected 2 blank lines, found 1 50 E303 too many blank lines (2) 19 E305 expected 2 blank lines after class or function definition, found 1 29 E306 expected 1 blank line before a nested definition, found 0 @@ -7680,9 +7679,9 @@ 230 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 -42 F841 local variable 'e' is assigned to but never used +41 F841 local variable 'e' is assigned to but never used 620 W291 trailing whitespace 85 W292 no newline at end of file 1582 W293 blank line contains whitespace 30 W391 blank line at end of file -7639 +7638 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index a9eab136..d7e7b8a2 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/simulate/binding_data.py b/src/tfscreen/simulate/binding_data.py index 14d57478..eea1b89f 100644 --- a/src/tfscreen/simulate/binding_data.py +++ b/src/tfscreen/simulate/binding_data.py @@ -1,10 +1,15 @@ """ -Generate simulated observed binding curve data (binding_data.genotypes path). +Generate simulated observed binding curve data for the SPIKED binding genotypes. -Uses pre-computed (stratified) theta values from library_prediction and adds -Gaussian noise to produce observed theta values for a "measured" binding -curve CSV -- the mirror image of generate_base_growth_df, which does the same -noise-injection for direct growth-rate calibration data. +Noise-injects the pre-computed ``binding_theta_df`` that ``library_prediction`` +builds for the ``binding_data.spiked_binding`` block (clean, monoclonal, +congression-free controls) into a "measured" binding curve CSV -- the mirror +image of generate_base_growth_df, which does the same noise-injection for direct +growth-rate calibration data. + +The IN-LIBRARY (congression-affected) binding genotypes are handled separately, +post-growth-sim, by ``library_binding_data.generate_library_binding_df``; the +two results are concatenated in ``simulate/scripts/simulate_cli.py``. """ import numpy as np @@ -15,19 +20,22 @@ def generate_binding_df(binding_cfg, rng, binding_theta_df): """ - Generate simulated binding curve data for specific genotypes. + Generate simulated binding curve data for the spiked binding genotypes. - Uses pre-computed (stratified) theta values from library_prediction and - adds Gaussian noise to produce observed theta values. + Uses the pre-computed theta values ``library_prediction`` built for the + ``spiked_binding`` block and adds Gaussian noise to produce observed theta. Parameters ---------- binding_cfg : dict - The 'binding_data' sub-dict from the config. Must contain: - genotypes : list of genotype strings + The ``binding_data`` config dict. Reads the top-level (assay-wide) + keys: titrant_name: str, name of the titrant (e.g. 'iptg') titrant_conc: list of concentrations (mM) - noise : float, sigma for Gaussian noise on theta_obs + noise : float, sigma for Gaussian noise on theta_obs (default 0) + An optional ``genotypes`` list restricts the output to those genotypes; + when absent (the normal case under the spiked_binding schema) every + genotype in ``binding_theta_df`` is emitted. rng : numpy.random.Generator binding_theta_df : pandas.DataFrame Pre-computed binding theta from library_prediction. Must contain diff --git a/src/tfscreen/simulate/library_prediction.py b/src/tfscreen/simulate/library_prediction.py index 1197bc90..660ee300 100644 --- a/src/tfscreen/simulate/library_prediction.py +++ b/src/tfscreen/simulate/library_prediction.py @@ -25,6 +25,147 @@ from typing import Any, Dict, Union from pathlib import Path + +def _is_file_choice(choose_by): + """A ``choose_by`` value is a params file when it is not a builtin keyword.""" + return choose_by not in ("stratified", "random") + + +def _validate_binding_config(binding_cfg, spiked_names, theta_component): + """Fail-fast validation of the binding_data spiked_binding/library_binding blocks.""" + spiked_set = set(spiked_names) + for block, must_be_spiked in (("spiked_binding", True), + ("library_binding", False)): + cfg = binding_cfg.get(block) + if cfg is None: + continue + choose_by = cfg.get("choose_by") + if choose_by is None: + raise ValueError(f"binding_data.{block} requires a 'choose_by' key.") + if _is_file_choice(choose_by): + if "num" in cfg: + raise ValueError( + f"binding_data.{block}: 'num' is incompatible with a choose_by " + f"file ('{choose_by}') -- the file defines the genotype set.") + if theta_component not in _BINDING_PARAMS_SUPPORTED: + raise ValueError( + f"binding_data.{block}: a choose_by file requires a Hill theta " + f"component {sorted(_BINDING_PARAMS_SUPPORTED)}; got " + f"'{theta_component}'.") + file_genos = set(standardize_genotypes( + list(read_binding_genotype_params(choose_by).keys()))) + if must_be_spiked: + bad = file_genos - spiked_set + if bad: + raise ValueError( + f"binding_data.spiked_binding genotypes must be spiked (in " + f"spiked_seqs); not spiked: {sorted(bad)}") + else: + bad = file_genos & spiked_set + if bad: + raise ValueError( + f"binding_data.library_binding genotypes must NOT be spiked " + f"(they must carry congression); spiked: {sorted(bad)}") + elif block == "spiked_binding": + num = cfg.get("num") + if num is not None and not (1 <= int(num) <= len(spiked_names)): + raise ValueError( + f"binding_data.spiked_binding.num must be in " + f"[1, {len(spiked_names)}]; got {num}.") + else: # library_binding stratified/random + if cfg.get("num") is None: + raise ValueError( + f"binding_data.library_binding requires 'num' for choose_by " + f"'{choose_by}'.") + + +def _measured_params_override(params_file, cf, sim_data, library_df, rng, + binding_concs, titrant_name): + """Build theta overrides + noise-free binding rows from a measured Hill-params file. + + Returns ``(theta_gc_override, theta_params_override, binding_rows)``. Shared + by spiked_binding (file) and library_binding (file); callers that measure the + binding post-sim simply ignore ``binding_rows``. + """ + theta_component = cf['theta_component'] + from tfscreen.tfmodel.generative.registry import model_registry + theta_module = model_registry["theta"][theta_component] + sim_params = theta_module.get_sim_hyperparameters() + if cf.get('theta_sim_priors'): + sim_params.update(cf['theta_sim_priors']) + sim_priors = theta_module.SimPriors(**sim_params) + wt_params = _wt_params_from_sim_priors(sim_priors) + + params_dict = read_binding_genotype_params(params_file) + log_conc_growth = np.array(sim_data.log_titrant_conc) + + if theta_component == "hill_geno": + gc_over, p_over = build_theta_gc_override_hill_geno( + params_dict, log_conc_growth, wt_params) + else: # hill_mut + gc_over, p_over = build_theta_gc_override_hill_mut( + params_dict=params_dict, + library_genotypes=library_df["genotype"].tolist(), + sim_data=sim_data, sim_priors=sim_priors, + log_conc=log_conc_growth, rng=rng) + + measured_binding_df = build_binding_theta_from_params( + params_dict=params_dict, binding_concs=binding_concs, + titrant_name=titrant_name, noise=0.0, rng=rng, wt_params=wt_params) + return gc_over, p_over, measured_binding_df.to_dict("records") + + +def _spiked_stratified_binding(binding_genotypes, cf, sample_df, binding_sample_df, + theta_rng_key, conc_to_col, binding_concs, + titrant_name, select_mode): + """Assign stratified/random synthetic theta curves to spiked binding genotypes. + + wt (if present) keeps its natural reference curve. Returns + ``(theta_gc_override, binding_rows)``. + """ + binding_genotypes = list(standardize_genotypes(binding_genotypes)) + non_wt = [g for g in binding_genotypes if g != "wt"] + override = {} + rows = [] + + wt_binding_gc = None + if "wt" in binding_genotypes: + single_wt_df = pd.DataFrame({"genotype": ["wt"]}) + binding_wt_sim = build_sim_data(single_wt_df, binding_sample_df, + thermo_data=cf.get('thermo_data'), + skip_pairs=True) + wt_binding_gc, _ = sample_theta_prior( + cf['theta_component'], binding_wt_sim, theta_rng_key, + sim_priors_overrides=cf.get('theta_sim_priors')) + + selected_binding_gc = None + if non_wt: + selected_binding_gc, selected_growth_gc = sample_theta_stratified( + component_name=cf['theta_component'], + binding_sample_df=binding_sample_df, + growth_sample_df=sample_df, + rng_key=theta_rng_key, + n_select=len(non_wt), + thermo_data=cf.get('thermo_data'), + pool_size=cf.get('binding_stratify_pool_size', 500), + priors_overrides=cf.get('theta_priors'), + sim_priors_overrides=cf.get('theta_sim_priors'), + select_mode=select_mode) + override.update({g: selected_growth_gc[i] for i, g in enumerate(non_wt)}) + + if "wt" in binding_genotypes and wt_binding_gc is not None: + for conc in binding_concs: + rows.append({"genotype": "wt", "titrant_name": titrant_name, + "titrant_conc": float(conc), + "theta_true": float(wt_binding_gc[0, conc_to_col[float(conc)]])}) + for i, g in enumerate(non_wt): + for conc in binding_concs: + rows.append({"genotype": g, "titrant_name": titrant_name, + "titrant_conc": float(conc), + "theta_true": float(selected_binding_gc[i, conc_to_col[float(conc)]])}) + return override, rows + + def library_prediction(cf: Union[Dict[str, Any], str, Path], override_keys: dict=None): """ @@ -110,7 +251,11 @@ def library_prediction(cf: Union[Dict[str, Any], str, Path], dk_geno_hyper_shift = cf['dk_geno_hyper_shift'] # ------------------------------------------------------------------------- - # Stratified theta sampling for binding calibration genotypes + # Binding-calibration genotypes: spiked (clean, congression-free) plus + # in-library FILE injection. Stratified/random in-library selection and all + # in-library binding *measurements* happen post-growth-sim (see + # simulate/library_binding_data.py); only the phenotype-setting parts live + # here so the growth simulation reflects them. binding_cfg = cf.get('binding_data') theta_gc_override = {} @@ -120,138 +265,47 @@ def library_prediction(cf: Union[Dict[str, Any], str, Path], if binding_cfg is not None: binding_concs = binding_cfg['titrant_conc'] titrant_name = binding_cfg['titrant_name'] - binding_noise = binding_cfg.get('noise', 0.0) + theta_component = cf['theta_component'] binding_sample_df = pd.DataFrame({"titrant_conc": binding_concs}) sorted_binding_concs = np.sort(np.unique(binding_concs)) conc_to_col = {float(c): j for j, c in enumerate(sorted_binding_concs)} - - rows = [] # accumulated rows for binding_theta_df - - # --- Section 1: Simulated genotypes (existing 'genotypes' key) --- - binding_genotypes = list(standardize_genotypes(binding_cfg.get('genotypes', []))) - - # wt gets its natural unperturbed reference parameters — not a random - # draw from the pool. Only non-wt binding genotypes are stratified. - non_wt_genotypes = [g for g in binding_genotypes if g != "wt"] - - # wt reference curve (if wt is a simulated binding genotype) - wt_binding_gc = None - if "wt" in binding_genotypes: - single_wt_df = pd.DataFrame({"genotype": ["wt"]}) - binding_wt_sim = build_sim_data(single_wt_df, binding_sample_df, - thermo_data=cf.get('thermo_data'), - skip_pairs=True) - # Perturbation path for wt (M=0): always returns the fixed sim-priors - # reference curve regardless of rng_key, so the binding data matches - # the growth simulation exactly. - wt_binding_gc, _ = sample_theta_prior( - cf['theta_component'], binding_wt_sim, theta_rng_key, - sim_priors_overrides=cf.get('theta_sim_priors'), - ) - - # Stratified curves for non-wt simulated binding genotypes - selected_binding_gc = None - selected_growth_gc = None - if non_wt_genotypes: - selected_binding_gc, selected_growth_gc = sample_theta_stratified( - component_name=cf['theta_component'], - binding_sample_df=binding_sample_df, - growth_sample_df=sample_df, - rng_key=theta_rng_key, - n_select=len(non_wt_genotypes), - thermo_data=cf.get('thermo_data'), - pool_size=cf.get('binding_stratify_pool_size', 500), - priors_overrides=cf.get('theta_priors'), - sim_priors_overrides=cf.get('theta_sim_priors'), - ) - - # Override theta at growth concentrations for non-wt binding genotypes only. - # wt is deliberately excluded so thermo_to_growth uses its natural curve. - if non_wt_genotypes and selected_growth_gc is not None: - theta_gc_override.update({ - g: selected_growth_gc[i] - for i, g in enumerate(non_wt_genotypes) - }) - - # Accumulate binding rows for simulated genotypes - if "wt" in binding_genotypes and wt_binding_gc is not None: - for conc in binding_concs: - rows.append({ - "genotype": "wt", - "titrant_name": titrant_name, - "titrant_conc": float(conc), - "theta_true": float(wt_binding_gc[0, conc_to_col[float(conc)]]), - }) - for i, g in enumerate(non_wt_genotypes): - for conc in binding_concs: - rows.append({ - "genotype": g, - "titrant_name": titrant_name, - "titrant_conc": float(conc), - "theta_true": float(selected_binding_gc[i, conc_to_col[float(conc)]]), - }) - - # --- Section 2: Measured genotype params from CSV --- - params_file = binding_cfg.get('genotype_params_file') - if params_file is not None: - theta_component = cf['theta_component'] - if theta_component not in _BINDING_PARAMS_SUPPORTED: - raise ValueError( - f"genotype_params_file is only supported with Hill-based theta " - f"components: {sorted(_BINDING_PARAMS_SUPPORTED)}. " - f"Got: '{theta_component}'." - ) - - # Build sim_priors for WT reference / NaN filling - from tfscreen.tfmodel.generative.registry import model_registry - theta_module = model_registry["theta"][theta_component] - sim_params = theta_module.get_sim_hyperparameters() - if cf.get('theta_sim_priors'): - sim_params.update(cf['theta_sim_priors']) - sim_priors = theta_module.SimPriors(**sim_params) - - wt_params = _wt_params_from_sim_priors(sim_priors) - - params_dict = read_binding_genotype_params(params_file) - - # Compute theta overrides for measured genotypes - log_conc_growth = np.array(sim_data.log_titrant_conc) - - if theta_component == "hill_geno": - measured_override, measured_params = build_theta_gc_override_hill_geno( - params_dict, log_conc_growth, wt_params - ) - else: # hill_mut - measured_override, measured_params = build_theta_gc_override_hill_mut( - params_dict=params_dict, - library_genotypes=library_df["genotype"].tolist(), - sim_data=sim_data, - sim_priors=sim_priors, - log_conc=log_conc_growth, - rng=rng, - ) - - # Measured data takes precedence over stratified simulated data - theta_gc_override.update(measured_override) - theta_params_override.update(measured_params) - - # Accumulate binding rows for measured genotypes (overrides simulated rows) - # Store noise-free theta_true; noise is applied later by - # binding_data.generate_binding_df, consistent with the - # simulated-genotypes path. - measured_binding_df = build_binding_theta_from_params( - params_dict=params_dict, - binding_concs=binding_concs, - titrant_name=titrant_name, - noise=0.0, - rng=rng, - wt_params=wt_params, - ) - # Remove any existing rows for genotypes now covered by measured data - measured_genotypes = set(params_dict.keys()) - rows = [r for r in rows if r["genotype"] not in measured_genotypes] - rows.extend(measured_binding_df.to_dict("records")) + rows = [] + + spiked_names = list(pd.unique( + library_df.loc[library_df["library_origin"] == "spiked", "genotype"])) + + _validate_binding_config(binding_cfg, spiked_names, theta_component) + + # ---------- spiked_binding (clean, monoclonal) ---------- + sb = binding_cfg.get("spiked_binding") + if sb is not None: + choose_by = sb["choose_by"] + if _is_file_choice(choose_by): + gc_over, p_over, spiked_rows = _measured_params_override( + choose_by, cf, sim_data, library_df, rng, + binding_concs, titrant_name) + theta_gc_override.update(gc_over) + theta_params_override.update(p_over) + rows.extend(spiked_rows) + else: + num = sb.get("num") + sel = spiked_names if num is None else spiked_names[:int(num)] + s_over, s_rows = _spiked_stratified_binding( + sel, cf, sample_df, binding_sample_df, theta_rng_key, + conc_to_col, binding_concs, titrant_name, + select_mode=choose_by) + theta_gc_override.update(s_over) + rows.extend(s_rows) + + # ---------- library_binding: FILE injection only (pre-sim) ---------- + lb = binding_cfg.get("library_binding") + if lb is not None and _is_file_choice(lb["choose_by"]): + gc_over, p_over, _ = _measured_params_override( + lb["choose_by"], cf, sim_data, library_df, rng, + binding_concs, titrant_name) + theta_gc_override.update(gc_over) + theta_params_override.update(p_over) binding_theta_df = pd.DataFrame(rows) if rows else None diff --git a/src/tfscreen/simulate/sample_theta.py b/src/tfscreen/simulate/sample_theta.py index 43398531..f0cdc250 100644 --- a/src/tfscreen/simulate/sample_theta.py +++ b/src/tfscreen/simulate/sample_theta.py @@ -174,7 +174,8 @@ def sample_theta_stratified(component_name, thermo_data=None, pool_size=500, priors_overrides=None, - sim_priors_overrides=None): + sim_priors_overrides=None, + select_mode="stratified"): """ Sample a pool of theta curves from the prior and select n_select that maximally span the theta-curve space (greedy maximin on binding concentrations). @@ -269,6 +270,16 @@ def sample_theta_stratified(component_name, pool_binding_gc = np.stack(pool_binding_rows) # (pool_size, C_b) pool_growth_gc = np.stack(pool_growth_rows) # (pool_size, C_g) - selected_indices = _greedy_maximin(pool_binding_gc, n_select) + if select_mode == "stratified": + selected_indices = _greedy_maximin(pool_binding_gc, n_select) + elif select_mode == "random": + # random draw from the prior pool (no maximin spread) + rng = np.random.default_rng(int(jax.random.randint( + rng_key, (), 0, 2**31 - 1))) + selected_indices = rng.choice(pool_size, size=n_select, replace=False) + else: + raise ValueError( + f"Unknown select_mode '{select_mode}' (expected 'stratified' or 'random')." + ) return pool_binding_gc[selected_indices], pool_growth_gc[selected_indices] diff --git a/src/tfscreen/simulate/scripts/simulate_cli.py b/src/tfscreen/simulate/scripts/simulate_cli.py index 7f437396..2777fa84 100644 --- a/src/tfscreen/simulate/scripts/simulate_cli.py +++ b/src/tfscreen/simulate/scripts/simulate_cli.py @@ -6,6 +6,7 @@ import tfscreen from tfscreen.simulate import library_prediction, selection_experiment from tfscreen.simulate.binding_data import generate_binding_df +from tfscreen.simulate.library_binding_data import generate_library_binding_df from tfscreen.simulate.presplit_data import generate_presplit_df from tfscreen.simulate.base_growth_data import generate_base_growth_df, generate_k_ref_df from tfscreen.simulate.growth_parameters_output import generate_growth_parameters_df @@ -70,6 +71,8 @@ def out_path(name): "growth_parameters", "transformation_lam"] if "binding_data" in cf: output_names.append("binding") + if cf["binding_data"].get("library_binding") is not None: + output_names.append("library_binding") if "presplit_data" in cf: output_names.append("presplit") if "base_growth_data" in cf: @@ -150,7 +153,31 @@ def out_path(name): print(f"\nWrote: {', '.join(out_path(n) for n in ['library', 'parameters', 'genotype_theta', 'growth', 'growth_parameters', 'transformation_lam'])}") if "binding_data" in cf: - binding_df = generate_binding_df(cf["binding_data"], rng, binding_theta_df) + binding_cfg = cf["binding_data"] + # Spiked (clean) binding measurements from the pre-sim binding_theta_df. + if binding_theta_df is not None: + binding_df = generate_binding_df(binding_cfg, rng, binding_theta_df) + else: + binding_df = pd.DataFrame(columns=["genotype", "titrant_name", + "titrant_conc", "theta_obs", "theta_std"]) + # In-library binding measurements (post-sim: selection from survivors). + lb = binding_cfg.get("library_binding") + if lb is not None: + spiked_names = list(pd.unique( + library_df.loc[library_df["library_origin"] == "spiked", "genotype"])) + lib_binding_df, lib_manifest = generate_library_binding_df( + lb, + binding_cfg["titrant_name"], + binding_cfg["titrant_conc"], + binding_cfg.get("noise", 0.0), + parameters_df, + growth_df, + spiked_genotypes=spiked_names, + rng=rng, + ) + binding_df = pd.concat([binding_df, lib_binding_df], ignore_index=True) + lib_manifest.to_csv(out_path("library_binding"), index=False) + print(f"Wrote: {out_path('library_binding')}") binding_df.to_csv(out_path("binding"), index=False) print(f"Wrote: {out_path('binding')}") diff --git a/tests/tfscreen/simulate/test_library_prediction.py b/tests/tfscreen/simulate/test_library_prediction.py index 464c8bd0..0bf8188c 100644 --- a/tests/tfscreen/simulate/test_library_prediction.py +++ b/tests/tfscreen/simulate/test_library_prediction.py @@ -134,7 +134,8 @@ def test_library_prediction_dk_geno_zero_makes_hyper_params_optional(mocker): mocker.patch("tfscreen.util.read_yaml", return_value=config) mocker.patch( "tfscreen.simulate.library_prediction.library_manager.LibraryManager" - ).return_value.build_library_df.return_value = pd.DataFrame({"genotype": ["wt"]}) + ).return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt"], "library_origin": ["spiked"]}) mocker.patch( "tfscreen.simulate.library_prediction.build_sample_dataframes", return_value=pd.DataFrame({"titrant_conc": [0.0]}), @@ -168,7 +169,8 @@ def test_library_prediction_missing_hyper_params_raises_without_dk_geno_zero(moc mocker.patch("tfscreen.util.read_yaml", return_value=config) mocker.patch( "tfscreen.simulate.library_prediction.library_manager.LibraryManager" - ).return_value.build_library_df.return_value = pd.DataFrame({"genotype": ["wt"]}) + ).return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt"], "library_origin": ["spiked"]}) mocker.patch( "tfscreen.simulate.library_prediction.build_sample_dataframes", return_value=pd.DataFrame({"titrant_conc": [0.0]}), @@ -196,7 +198,8 @@ def _patch_library_deps(mocker, config): mocker.patch("tfscreen.util.read_yaml", return_value=config) mocker.patch( "tfscreen.simulate.library_prediction.library_manager.LibraryManager" - ).return_value.build_library_df.return_value = pd.DataFrame({"genotype": ["wt"]}) + ).return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt"], "library_origin": ["spiked"]}) mocker.patch( "tfscreen.simulate.library_prediction.build_sample_dataframes", return_value=pd.DataFrame({"titrant_conc": [0.0]}), @@ -330,15 +333,13 @@ def _make_params_csv(tmp_path, content): return str(p) -def _base_config_with_binding(params_path, genotypes=None): +def _base_config_with_binding(params_path): binding = { "titrant_name": "iptg", "titrant_conc": [0.0, 0.001, 0.01], "noise": 0.0, - "genotype_params_file": params_path, + "spiked_binding": {"choose_by": params_path}, } - if genotypes is not None: - binding["genotypes"] = genotypes return { "condition_blocks": [{"some": "block"}], "theta_component": "hill_geno", @@ -357,7 +358,8 @@ def _patch_for_params_file(mocker, config): """Patch all heavy deps; returns (mock_thermo, mock_sim_data).""" mocker.patch("tfscreen.util.read_yaml", return_value=config) - mock_library_df = pd.DataFrame({"genotype": ["wt", "A47V"]}) + mock_library_df = pd.DataFrame({"genotype": ["wt", "A47V"], + "library_origin": ["spiked", "spiked"]}) mocker.patch( "tfscreen.simulate.library_prediction.library_manager.LibraryManager" ).return_value.build_library_df.return_value = mock_library_df @@ -452,7 +454,8 @@ def test_unsupported_theta_component_raises(mocker, tmp_path): mocker.patch("tfscreen.util.read_yaml", return_value=config) mocker.patch( "tfscreen.simulate.library_prediction.library_manager.LibraryManager" - ).return_value.build_library_df.return_value = pd.DataFrame({"genotype": ["wt"]}) + ).return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt"], "library_origin": ["spiked"]}) mocker.patch( "tfscreen.simulate.library_prediction.build_sample_dataframes", return_value=pd.DataFrame({"titrant_conc": [0.0]}), @@ -462,31 +465,3 @@ def test_unsupported_theta_component_raises(mocker, tmp_path): with pytest.raises(ValueError, match="hill"): library_prediction(cf="config.yaml") - - -def test_params_file_and_genotypes_coexist(mocker, tmp_path): - """genotype_params_file and genotypes can coexist; both appear in binding_df.""" - csv = _make_params_csv( - tmp_path, - "genotype,theta_low,theta_high,log_hill_K,hill_n\n" - "A47V,0.97,0.03,-3.8,1.8\n", - ) - config = _base_config_with_binding(csv, genotypes=["wt"]) - mock_thermo, mock_sim_data = _patch_for_params_file(mocker, config) - - # Patch sample_theta_prior (called for simulated WT in the 'genotypes' path) - import numpy as np - mock_wt_gc = np.array([[0.99, 0.50, 0.01]]) # shape (1, 3): 1 genotype × 3 concs - mock_theta_param = MagicMock() - mocker.patch( - "tfscreen.simulate.library_prediction.sample_theta_prior", - return_value=(mock_wt_gc, mock_theta_param), - ) - - _, _, _, _, binding_df = library_prediction(cf="config.yaml") - - assert binding_df is not None - genos = set(binding_df["genotype"].unique()) - # WT from simulated path + A47V from params file - assert "A47V" in genos - assert "wt" in genos From 288ed3b98514de1f433de431e56cb1a16d03b81f Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Thu, 9 Jul 2026 09:36:12 -0700 Subject: [PATCH 29/30] added ability to simulate empirically informed data --- CLAUDE.md | 12 + docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- pyproject.toml | 1 + reports/flake.txt | 387 +++++++------- reports/junit/junit.xml | 2 +- src/tfscreen/simulate/binding_params.py | 15 +- src/tfscreen/simulate/empirical/__init__.py | 0 .../simulate/empirical/fit_phenotypes.py | 503 ++++++++++++++++++ src/tfscreen/simulate/empirical/population.py | 306 +++++++++++ src/tfscreen/simulate/empirical/resample.py | 225 ++++++++ src/tfscreen/simulate/library_binding_data.py | 166 ++++++ src/tfscreen/simulate/library_prediction.py | 102 +++- .../simulate/scripts/build_empirical_cli.py | 197 +++++++ src/tfscreen/simulate/selection_experiment.py | 2 + src/tfscreen/simulate/thermo_to_growth.py | 18 + .../empirical/test_build_empirical_cli.py | 169 ++++++ .../simulate/empirical/test_fit_phenotypes.py | 214 ++++++++ .../test_library_prediction_empirical.py | 195 +++++++ .../simulate/empirical/test_population.py | 161 ++++++ .../simulate/empirical/test_resample.py | 260 +++++++++ .../test_binding_config_validation.py | 76 +++ .../tfscreen/simulate/test_binding_params.py | 13 +- .../simulate/test_library_binding_data.py | 143 +++++ 24 files changed, 2957 insertions(+), 214 deletions(-) create mode 100644 src/tfscreen/simulate/empirical/__init__.py create mode 100644 src/tfscreen/simulate/empirical/fit_phenotypes.py create mode 100644 src/tfscreen/simulate/empirical/population.py create mode 100644 src/tfscreen/simulate/empirical/resample.py create mode 100644 src/tfscreen/simulate/library_binding_data.py create mode 100644 src/tfscreen/simulate/scripts/build_empirical_cli.py create mode 100644 tests/tfscreen/simulate/empirical/test_build_empirical_cli.py create mode 100644 tests/tfscreen/simulate/empirical/test_fit_phenotypes.py create mode 100644 tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py create mode 100644 tests/tfscreen/simulate/empirical/test_population.py create mode 100644 tests/tfscreen/simulate/empirical/test_resample.py create mode 100644 tests/tfscreen/simulate/test_binding_config_validation.py create mode 100644 tests/tfscreen/simulate/test_library_binding_data.py diff --git a/CLAUDE.md b/CLAUDE.md index a07d49b9..446ea09d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -55,6 +55,7 @@ tfs-cat-response # Fit categorical response curves tfs-diagnose-nan # Diagnose NaN issues in inference tfs-simulate # Simulate a full experiment tfs-report-cfu0 # Report average ln_cfu0 by genotype class from a simulate config +tfs-build-empirical # Fit real data → empirical phenotype-generating distribution (Stages 1-2) 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 @@ -261,6 +262,16 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro | `simulate/scripts/report_cfu0_cli.py` | `tfs-report-cfu0` CLI entry point; reuses `library_prediction` + `selection_experiment` (same pattern as `simulate_cli.py`) across `num_replicates` to report mean `ln_cfu_0` and surviving-genotype counts by class (`wt`/`spiked`/`single`/`double`), for tuning `transform_sizes`/`library_mixture`/`cfu0` against observed real-library values | | `simulate/run_simulation.py` | Simpler, non-CLI orchestrator (`run_simulation`); does not support `binding_data`/`presplit_data`/`base_growth_data` | +### Empirical phenotype pipeline (`simulate/empirical/`) + +An alternative to prior-predictive phenotype sampling: instead of drawing theta from made-up priors, fit **real** screen data to an empirical phenotype-generating distribution and resample from it, so the simulated library's phenotype *distribution* matches reality while ground truth stays known. Targets `hill_geno` + linear growth; asserts `A ≡ 1` (repressor: blocks or not, leaky binding absorbed into `theta_low`). Three stages: + +- **Stage 1** (`fit_phenotypes.py`): per-genotype MLE of the growth model on a real `ln_cfu` DataFrame (derives `ln_cfu_std` from the processed `ln_cfu_var` via `get_scaled_cfu`, like `model_orchestrator`), calibration (`growth_k`/`growth_m` per `condition_rep`) frozen. Fits `(dk_geno, theta_low, theta_high, log_hill_K, hill_n)` in transformed coords (logit theta bounds, log n) so `run_least_squares` returns covariance in the space Stage 2 needs. Per-genotype independent (no cross-genotype coupling); weak `dk_geno` Tikhonov prior; ±16 logit clamp. Returns `GenotypeFit(estimate, covariance)` per genotype. `_hill_theta` is numerically identical to `hill_geno.run_model` and `binding_params._hill_theta` (verified — same `_ZERO_CONC_SENTINEL`). +- **Stage 2** (`population.py`): measurement-error EM (`z_i~N(mu,Σ)`, `y_i~N(z_i,S_i)`) that **deconvolves estimation noise** (`Cov(y)=Σ+mean(S_i)`), so it recovers a narrower population than a naive KDE on the point estimates. `fit_population()` → `PopulationModel` (single MV-Normal in transformed space; `wt_ref` field holds wt's actual Stage-1 fit; `.sample(n)` → natural-space DataFrame; `.save()`/`.load()`). Does **not** correct congression attenuation (deferred). +- **Stage 3** (`resample.py`): `resample_phenotypes` draws one i.i.d. phenotype per genotype (wt pinned to `dk_geno=0` + `wt_ref` Hill); `make_empirical_overrides` reuses `build_theta_gc_override_hill_geno` → `(theta_gc_override, theta_params_override, dk_geno_override)`. `thermo_to_growth` gained a `dk_geno_override` param (the one growth-path change; `theta_params_override` only patches θ columns). `build_empirical_binding_theta` rebuilds spiked `binding_theta_df` from resampled params (selection from the `binding_data` config; θ from resampled Hill, not `sample_theta_stratified`). + +Integration: `library_prediction` gains a `phenotype_source: empirical` branch (needs an `empirical: {phenotype_model: }` block pointing at the single self-contained `_phenotype_model.json`; `_resolve_phenotype_model_path` accepts that path with/without `.json` or the bare ``, and the fit prints the absolute path — use it so no file-copying is needed) that resamples all genotypes, injects the overrides, forces `theta_component=hill_geno` (warns + ignores any other value; the resampled phenotypes are per-genotype Hill curves and the discarded prior draw must match the `parameters_df` schema — this also avoids running/overflowing an e.g. `hill_mut` draw), drops the ignored `theta_priors`/`theta_sim_priors`, and forces `activity=fixed/1`. `phenotype_source`/`empirical` are in `selection_experiment.SIMULATE_KNOWN_KEYS`. Resampled ground truth flows into `parameters_df`/`genotype_theta_df` automatically (no new return value); `library_binding` regenerates for free (reads `parameters_df`). `tfs-build-empirical` (`simulate/scripts/build_empirical_cli.py`) is a **one-command orchestrator**: given the experimental inputs (`growth_file` and `seed` positional; `--binding_file` required; optional `--spiked_file`/`--base_growth_file`/`--thermo_data`) it internally calls `configure_model` (linear + hill_geno defaults — no model choices exposed, since here they'd only be wrong) then `run_prefit_calibration` (MAP-calibrates per-condition k/m), then Stages 1-2, saving the deliverable `_phenotype_model.json` (one self-contained, human-readable file = the generating distribution; `PopulationModel.save`/`.load`) + the diagnostic `_stage1_fits.csv`, plus the `_configure_*`/`_prefit_*` intermediates. The configure/prefit imports are lazy (the heavy JAX stack loads only on this path). The MAP prefit is the slow step, so `--calibration_file` skips configure+prefit and reuses a calibration for fast Stage-1/2 iteration — either a prefit **priors CSV** (read via `fit_phenotypes.read_calibration`, which pivots the `growth.condition_growth.k_loc`/`growth.condition_growth.m_loc` per-`condition_rep` rows — prefit writes these via `_csv_row_name` = `growth.{component}.{field}` — to wide k/m) or a wide `(condition_rep, growth_k, growth_m)` CSV. This **complements** the fully-synthetic prior path (the *accuracy* benchmark) as a *realism* benchmark. + ## YAML Standards All YAML files in this codebase follow these conventions. Apply them when creating or modifying any YAML file. @@ -331,6 +342,7 @@ Both grid CLIs import from `tfscreen.util.grid_utils` for run-name generation, J | `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-empirical/simulate_config.yaml` | Simulate config that resamples phenotypes from a `tfs-build-empirical` model (`phenotype_source: empirical`) | | `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` | diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index c24babeb..9b5a50eb 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.12%coverage96.12% \ No newline at end of file +coverage: 96.13%coverage96.13% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index f5f600e0..1e6308a2 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 3970tests3970 \ No newline at end of file +tests: 4009tests4009 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index b7408b03..47cb0586 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,6 +85,7 @@ tfs-cat-response = "tfscreen.analysis.cat_response.scripts.cat_response_cli:main tfs-diagnose-nan = "tfscreen.tfmodel.scripts.diagnose_nan_cli:main" tfs-simulate = "tfscreen.simulate.scripts.simulate_cli:main" tfs-report-cfu0 = "tfscreen.simulate.scripts.report_cfu0_cli:main" +tfs-build-empirical = "tfscreen.simulate.scripts.build_empirical_cli:main" tfs-setup-sim-grid = "tfscreen.simulate.scripts.setup_sim_grid_cli:main" tfs-setup-grid = "tfscreen.tfmodel.scripts.setup_grid_cli:main" tfs-summarize-grid = "tfscreen.tfmodel.scripts.summarize_grid_cli:main" diff --git a/reports/flake.txt b/reports/flake.txt index e62ebaef..98fda335 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -1202,44 +1202,44 @@ ./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 -./src/tfscreen/simulate/binding_params.py:290:18: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:292:13: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:293:13: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:296:16: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:298:12: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:299:12: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:317:20: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:318:21: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:321:27: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:321:43: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:323:23: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:324:23: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:330:32: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:332:28: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:333:28: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:336:16: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:350:14: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:350:31: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:352:10: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:352:27: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:353:10: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:353:27: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:383:22: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:385:18: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:222:1: C901 'build_theta_gc_override_hill_mut' is too complex (15) +./src/tfscreen/simulate/binding_params.py:286:17: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:287:18: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:289:13: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:290:13: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:293:16: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:295:12: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:296:12: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:314:20: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:315:21: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:318:27: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:318:43: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:320:23: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:321:23: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:327:32: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:329:28: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:330:28: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:333:16: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:347:14: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:347:31: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:349:10: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:349:27: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:350:10: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:350:27: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:380:22: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:382:18: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:383:18: E221 multiple spaces before operator ./src/tfscreen/simulate/binding_params.py:386:18: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:389:18: E221 multiple spaces before operator -./src/tfscreen/simulate/binding_params.py:391:15: E221 multiple spaces before operator +./src/tfscreen/simulate/binding_params.py:388:15: E221 multiple spaces before operator ./src/tfscreen/simulate/build_sample_dataframes.py:4:1: E302 expected 2 blank lines, found 1 ./src/tfscreen/simulate/build_sample_dataframes.py:56:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:68:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:83:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:87:1: W293 blank line contains whitespace ./src/tfscreen/simulate/build_sample_dataframes.py:95:21: W292 no newline at end of file -./src/tfscreen/simulate/library_prediction.py:34:1: C901 '_validate_binding_config' is too complex (13) -./src/tfscreen/simulate/library_prediction.py:170:43: E252 missing whitespace around parameter equals -./src/tfscreen/simulate/library_prediction.py:170:44: E252 missing whitespace around parameter equals +./src/tfscreen/simulate/library_prediction.py:76:1: C901 '_validate_binding_config' is too complex (13) +./src/tfscreen/simulate/library_prediction.py:212:43: E252 missing whitespace around parameter equals +./src/tfscreen/simulate/library_prediction.py:212:44: E252 missing whitespace around parameter equals ./src/tfscreen/simulate/presplit_data.py:55:15: E221 multiple spaces before operator ./src/tfscreen/simulate/presplit_data.py:56:17: E221 multiple spaces before operator ./src/tfscreen/simulate/presplit_data.py:57:16: E221 multiple spaces before operator @@ -1315,143 +1315,143 @@ ./src/tfscreen/simulate/selection_experiment.py:44:36: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:45:36: E231 missing whitespace after ':' ./src/tfscreen/simulate/selection_experiment.py:46:36: E231 missing whitespace after ':' -./src/tfscreen/simulate/selection_experiment.py:71:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:72:1: C901 '_check_dict_number' is too complex (13) -./src/tfscreen/simulate/selection_experiment.py:72:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:115:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:158:1: C901 '_check_cf' is too complex (25) -./src/tfscreen/simulate/selection_experiment.py:180:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:199:57: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:223:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:224:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:290:1: C901 '_check_lib_spec' is too complex (12) -./src/tfscreen/simulate/selection_experiment.py:290:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:342:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:347:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:369:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:422:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:438:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:446:36: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:446:44: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:456:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:466:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:509:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:513:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:514:75: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:524:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:527:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:573:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:584:38: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:585:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:588:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:592:55: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:598:32: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:603:30: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:604:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:608:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:650:51: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:656:35: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:661:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:685:43: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:685:45: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:687:75: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:689:44: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:690:46: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:691:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:692:67: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:742:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:759:79: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:765:29: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:807:43: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:813:74: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:814:18: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:820:79: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:822:33: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:827:80: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:832:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:838:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:849:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:892:73: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:897:76: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:914:25: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1022:26: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1022:36: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1022:44: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1022:52: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1022:60: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1030:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1031:32: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1039:42: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1048:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1049:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1051:63: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1057:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1059:51: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1066:28: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1068:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1069:24: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1076:79: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1081:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1082:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1084:36: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1086:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1090:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1096:128: E501 line too long (145 > 127 characters) -./src/tfscreen/simulate/selection_experiment.py:1097:128: E501 line too long (145 > 127 characters) -./src/tfscreen/simulate/selection_experiment.py:1101:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1102:72: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1106:34: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1113:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1115:20: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1115:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1116:20: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1118:32: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1119:38: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1131:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1139:41: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1146:49: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1148:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1153:36: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1154:37: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1154:45: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1154:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1154:61: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1159:1: E302 expected 2 blank lines, found 1 -./src/tfscreen/simulate/selection_experiment.py:1194:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1215:57: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1216:53: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1219:28: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1219:39: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1224:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1230:78: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1233:19: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1241:33: E261 at least two spaces before inline comment -./src/tfscreen/simulate/selection_experiment.py:1242:49: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1243:37: E231 missing whitespace after ':' -./src/tfscreen/simulate/selection_experiment.py:1245:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1246:76: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1248:19: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1250:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1258:77: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1259:43: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1263:41: E127 continuation line over-indented for visual indent -./src/tfscreen/simulate/selection_experiment.py:1266:49: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1290:71: W291 trailing whitespace -./src/tfscreen/simulate/selection_experiment.py:1298:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1299:76: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1304:11: F541 f-string is missing placeholders -./src/tfscreen/simulate/selection_experiment.py:1309:38: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1326:6: E114 indentation is not a multiple of 4 (comment) -./src/tfscreen/simulate/selection_experiment.py:1333:51: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1334:48: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1335:1: W293 blank line contains whitespace -./src/tfscreen/simulate/selection_experiment.py:1336:33: E231 missing whitespace after ',' -./src/tfscreen/simulate/selection_experiment.py:1339:1: W391 blank line at end of file +./src/tfscreen/simulate/selection_experiment.py:73:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:74:1: C901 '_check_dict_number' is too complex (13) +./src/tfscreen/simulate/selection_experiment.py:74:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:117:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:160:1: C901 '_check_cf' is too complex (25) +./src/tfscreen/simulate/selection_experiment.py:182:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:201:57: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:225:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:226:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:292:1: C901 '_check_lib_spec' is too complex (12) +./src/tfscreen/simulate/selection_experiment.py:292:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:344:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:349:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:371:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:424:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:440:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:448:36: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:448:44: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:458:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:468:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:511:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:515:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:516:75: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:526:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:529:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:575:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:586:38: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:587:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:590:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:594:55: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:600:32: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:605:30: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:606:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:610:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:652:51: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:658:35: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:663:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:687:43: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:687:45: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:689:75: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:691:44: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:692:46: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:693:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:694:67: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:744:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:761:79: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:767:29: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:809:43: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:815:74: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:816:18: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:822:79: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:824:33: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:829:80: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:834:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:840:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:851:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:894:73: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:899:76: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:916:25: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1024:26: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1024:36: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1024:44: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1024:52: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1024:60: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1032:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1033:32: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1041:42: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1050:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1051:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1053:63: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1059:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1061:51: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1068:28: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1070:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1071:24: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1078:79: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1083:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1084:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1086:36: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1088:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1092:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1098:128: E501 line too long (145 > 127 characters) +./src/tfscreen/simulate/selection_experiment.py:1099:128: E501 line too long (145 > 127 characters) +./src/tfscreen/simulate/selection_experiment.py:1103:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1104:72: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1108:34: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1115:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1117:20: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1117:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1118:20: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1120:32: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1121:38: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1133:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1141:41: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1148:49: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1150:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1155:36: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1156:37: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1156:45: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1156:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1156:61: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1161:1: E302 expected 2 blank lines, found 1 +./src/tfscreen/simulate/selection_experiment.py:1196:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1217:57: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1218:53: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1221:28: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1221:39: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1226:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1232:78: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1235:19: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1243:33: E261 at least two spaces before inline comment +./src/tfscreen/simulate/selection_experiment.py:1244:49: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1245:37: E231 missing whitespace after ':' +./src/tfscreen/simulate/selection_experiment.py:1247:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1248:76: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1250:19: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1252:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1260:77: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1261:43: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1265:41: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/selection_experiment.py:1268:49: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1292:71: W291 trailing whitespace +./src/tfscreen/simulate/selection_experiment.py:1300:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1301:76: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1306:11: F541 f-string is missing placeholders +./src/tfscreen/simulate/selection_experiment.py:1311:38: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1328:6: E114 indentation is not a multiple of 4 (comment) +./src/tfscreen/simulate/selection_experiment.py:1335:51: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1336:48: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1337:1: W293 blank line contains whitespace +./src/tfscreen/simulate/selection_experiment.py:1338:33: E231 missing whitespace after ',' +./src/tfscreen/simulate/selection_experiment.py:1341:1: W391 blank line at end of file ./src/tfscreen/simulate/sim_data_class.py:97:1: E303 too many blank lines (3) ./src/tfscreen/simulate/thermo_to_growth.py:102:36: E127 continuation line over-indented for visual indent ./src/tfscreen/simulate/thermo_to_growth.py:103:36: E127 continuation line over-indented for visual indent -./src/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (18) -./src/tfscreen/simulate/thermo_to_growth.py:626:41: E127 continuation line over-indented for visual indent +./src/tfscreen/simulate/thermo_to_growth.py:289:1: C901 'thermo_to_growth' is too complex (21) +./src/tfscreen/simulate/thermo_to_growth.py:644:41: E127 continuation line over-indented for visual indent ./src/tfscreen/tfmodel/__init__.py:2:73: W291 trailing whitespace ./src/tfscreen/tfmodel/__init__.py:3:20: W291 trailing whitespace ./src/tfscreen/tfmodel/__init__.py:18:65: W291 trailing whitespace @@ -5062,6 +5062,13 @@ ./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/empirical/test_build_empirical_cli.py:33:1: E305 expected 2 blank lines after class or function definition, found 1 +./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:94:30: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:95:30: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:169:34: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/empirical/test_fit_phenotypes.py:161:57: E128 continuation line under-indented for visual indent +./tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py:9:1: F401 'tfscreen.util' imported but unused +./tests/tfscreen/simulate/empirical/test_population.py:4:1: F401 'pandas as pd' imported but unused ./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 @@ -5104,26 +5111,26 @@ ./tests/tfscreen/simulate/test_binding_params.py:90:21: E221 multiple spaces before operator ./tests/tfscreen/simulate/test_binding_params.py:91:21: E221 multiple spaces before operator ./tests/tfscreen/simulate/test_binding_params.py:93:19: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:203:22: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:205:32: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:215:35: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:217:32: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:229:35: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:237:35: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:302:38: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:304:37: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:313:5: F811 redefinition of unused 'pd' from line 8 -./tests/tfscreen/simulate/test_binding_params.py:316:15: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:317:14: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:422:43: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_binding_params.py:442:56: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_binding_params.py:443:56: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_binding_params.py:463:46: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/test_binding_params.py:484:38: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:485:39: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:487:37: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:505:45: E221 multiple spaces before operator -./tests/tfscreen/simulate/test_binding_params.py:584:1: E302 expected 2 blank lines, found 1 +./tests/tfscreen/simulate/test_binding_params.py:206:22: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:208:32: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:218:35: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:220:32: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:232:35: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:240:35: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:305:38: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:307:37: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:316:5: F811 redefinition of unused 'pd' from line 8 +./tests/tfscreen/simulate/test_binding_params.py:319:15: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:320:14: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:425:43: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_binding_params.py:445:56: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_binding_params.py:446:56: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_binding_params.py:466:46: E127 continuation line over-indented for visual indent +./tests/tfscreen/simulate/test_binding_params.py:487:38: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:488:39: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:490:37: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:508:45: E221 multiple spaces before operator +./tests/tfscreen/simulate/test_binding_params.py:587:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:9:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:33:1: E302 expected 2 blank lines, found 1 ./tests/tfscreen/simulate/test_build_sample_dataframes.py:52:1: W293 blank line contains whitespace @@ -7644,8 +7651,8 @@ 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 -211 E127 continuation line over-indented for visual indent -91 E128 continuation line under-indented for visual indent +214 E127 continuation line over-indented for visual indent +92 E128 continuation line under-indented for visual indent 3 E131 continuation line unaligned for hanging indent 43 E201 whitespace after '[' 28 E202 whitespace before ']' @@ -7665,7 +7672,7 @@ 1 E301 expected 1 blank line, found 0 780 E302 expected 2 blank lines, found 1 50 E303 too many blank lines (2) -19 E305 expected 2 blank lines after class or function definition, found 1 +20 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 38 E402 module level import not at top of file @@ -7676,7 +7683,7 @@ 1 E722 do not use bare 'except' 1 E731 do not assign a lambda expression, use a def 21 E741 ambiguous variable name 'l' -230 F401 'tfscreen.tfmodel.generative.components.theta.thermo.O2_C12_K5_U0_a.thermo.run_model' imported but unused +232 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 @@ -7684,4 +7691,4 @@ 85 W292 no newline at end of file 1582 W293 blank line contains whitespace 30 W391 blank line at end of file -7638 +7645 diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index d7e7b8a2..3bed884b 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/simulate/binding_params.py b/src/tfscreen/simulate/binding_params.py index 201c8b55..1b5e9ece 100644 --- a/src/tfscreen/simulate/binding_params.py +++ b/src/tfscreen/simulate/binding_params.py @@ -71,8 +71,9 @@ def read_binding_genotype_params(csv_path: Union[str, Path]) -> dict: Raises ------ ValueError - If the CSV lacks a ``genotype`` column, has no recognised parameter - columns, or contains unrecognised column names. + If the CSV lacks a ``genotype`` column or has no recognised parameter + columns. Extra columns (e.g. the diagnostic columns in a + ``*_stage1_fits.csv``) are ignored. """ df = pd.read_csv(csv_path) @@ -88,13 +89,9 @@ def read_binding_genotype_params(csv_path: Union[str, Path]) -> dict: f"{sorted(HILL_PARAM_COLS)}" ) - unknown = set(df.columns) - {"genotype"} - HILL_PARAM_COLS - if unknown: - raise ValueError( - f"Unrecognised columns in '{csv_path}': {sorted(unknown)}. " - f"Expected: genotype + subset of {sorted(HILL_PARAM_COLS)}" - ) - + # Any columns beyond genotype + the recognised Hill params are ignored, + # so a stage1_fits.csv (which also carries dk_geno, *_t, n_obs, ...) can be + # used directly as a binding genotype-params file. result = {} for _, row in df.iterrows(): g = str(row["genotype"]) diff --git a/src/tfscreen/simulate/empirical/__init__.py b/src/tfscreen/simulate/empirical/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tfscreen/simulate/empirical/fit_phenotypes.py b/src/tfscreen/simulate/empirical/fit_phenotypes.py new file mode 100644 index 00000000..fe552158 --- /dev/null +++ b/src/tfscreen/simulate/empirical/fit_phenotypes.py @@ -0,0 +1,503 @@ +""" +Stage 1 of the empirical-phenotype pipeline: per-genotype MLE fits of the +growth model against *real* experimental data. + +Given a processed ``ln_cfu`` DataFrame (the output of ``tfs-process-counts``) +and a set of *frozen* per-condition growth-calibration parameters (``k``, ``m`` +from ``tfs-prefit-calibration``), this module fits an independent, lightly +regularized nonlinear least-squares model to each genotype's ~O(100) +observations: + + ln_cfu = ln_cfu0 + + (k_pre + dk_geno + m_pre * theta) * t_pre + + (k_sel + dk_geno + m_sel * theta) * t_sel + +where ``theta`` is a 4-parameter Hill curve in the titrant concentration +(``theta_low``, ``theta_high``, ``log_hill_K``, ``hill_n``) and activity is +asserted to be 1 (appropriate for a repressor: it blocks transcription or it +does not; leaky binding is absorbed into ``theta_low``). + +The purpose is *not* genotype-specific truth — the per-genotype fits are +confounded (see the module notes) and, on bulk data, congression-attenuated. +The purpose is to harvest a realistic *joint distribution* of per-genotype +phenotype parameters that a later stage resamples to seed a simulation. For +that, each fit returns both a point estimate **and** its covariance, both in +the transformed coordinate system in which the downstream distribution is +estimated and sampled. + +Design / identifiability notes +------------------------------ +* The fit is done **per genotype, calibration frozen** — there is no + cross-genotype coupling and the condition ``k``/``m`` never re-float. This + is deliberate: a joint/global fit would let parameters soak up variance and + re-open the k/dk_geno slide. +* ``dk_geno`` and the vertical placement of the theta curve (``theta_low``) + are only softly separated. What is robustly identified is the titration + *shape* (``log_hill_K``, ``hill_n``) and *amplitude* + (``theta_high - theta_low``). The absolute level is separated only by the + contrast between the two selective markers (different ``m_sel``); a weak + prior on ``dk_geno`` (``dk_geno_prior_sd``) is applied as belt-and-suspenders. +* ``theta_low``/``theta_high`` are fit through a logit transform, so they are + intrinsically confined to ``(0, 1)`` and cannot run off to the + ``logit ~= +-16`` artefact that a raw-space fit produces. +* Per-tube starting-abundance variation is handled with a nuisance intercept + per ``intercept_cols`` group (default: one ``ln_cfu0`` per ``replicate``). + These intercepts are marginalized away for the downstream distribution. + +Assumptions to confirm against real data (flagged intentionally) +---------------------------------------------------------------- +1. Titrant concentration is constant within a sample across the pre- and + sel-phases, so a single ``theta`` enters both phase terms. +2. ``condition_pre`` / ``condition_sel`` strings match the ``condition_rep`` + keys used by the calibration table verbatim (this is the same identity + used on the fit side; see ``model_orchestrator._build_growth_tm``). +3. The Hill functional form here mirrors the ``hill_geno`` theta component so + that resampled parameters reproduce the fitted curves in Stage 3. +""" + +import numpy as np +import pandas as pd +from scipy.special import expit, logit +import tqdm +import warnings +from collections import namedtuple + +from tfscreen.util.io import read_dataframe +from tfscreen.util.dataframe import check_columns, get_scaled_cfu +from tfscreen.mle.fitters.least_squares import run_least_squares + +# Numerical guards, matched to tfscreen.mle.curve_models.models so the fitted +# Hill is numerically identical to the empirical-curve library. +_EXP_CLIP = 700.0 +_POWER_CLIP = 25.0 + +# Zero-concentration substitution, matched to simulate.binding_params so the +# Hill evaluated when *fitting* here is identical to the one used when the +# resampled parameters are *injected* in Stage 3 (and to hill_geno inference). +_ZERO_CONC_SENTINEL = 1e-20 + +# Logit-space bound on theta_low/theta_high (mirrors FitManager's stability +# bound): keeps theta strictly inside (expit(-16), expit(16)) so the fit +# cannot float-saturate to exactly 0 or 1 when the dk_geno/theta_low +# degeneracy pushes the vertical placement to an asymptote. +_LOGIT_BOUND = 16.0 + +# Phenotype parameters carried forward to the distribution-estimation stage, +# in their transformed (fit) coordinates. The nuisance intercepts are *not* +# in this list. +PHENO_PARAMS_TRANSFORMED = [ + "dk_geno", + "logit_theta_low", + "logit_theta_high", + "log_hill_K", + "log_hill_n", +] + +# Natural-space names, aligned index-for-index with PHENO_PARAMS_TRANSFORMED. +PHENO_PARAMS_NATURAL = [ + "dk_geno", + "theta_low", + "theta_high", + "log_hill_K", + "hill_n", +] + +_Design = namedtuple( + "_Design", + ["conc", "t_pre", "t_sel", "k_pre", "m_pre", "k_sel", "m_sel", + "intercept_onehot", "n_intercept", "prior_idx"], +) + +# Per-genotype fit result. ``est_t`` / ``cov_t`` are the *full* transformed +# parameter vector and covariance (intercepts first, then the five phenotype +# params in PHENO_PARAMS_TRANSFORMED order); ``pheno_slice`` indexes the +# phenotype block for the downstream stage. +GenotypeFit = namedtuple( + "GenotypeFit", + ["genotype", "titrant_name", "n_obs", "converged", + "param_names_t", "est_t", "cov_t", "pheno_slice"], +) + + +def _hill_theta(conc, theta_low, theta_high, log_K, n): + """Hill occupancy at ``conc`` (mirrors curve_models.models._hill). + + ``theta = theta_low + (theta_high - theta_low) * x^n / (x^n + K^n)`` with + ``x = conc`` and ``K = exp(log_K)``. For a repressor induced by titrant, + ``theta_high < theta_low`` (occupancy falls as titrant rises). + + This is identical to ``hill_geno.run_model``'s + ``sigmoid(n * (ln x - ln K))`` occupancy and to + ``simulate.binding_params._hill_theta`` (the Stage-3 injection path); zero + concentrations use the same ``_ZERO_CONC_SENTINEL`` substitution as the + injection path so fitted and injected curves coincide. + """ + conc = np.asarray(conc, dtype=float) + x_safe = np.where(conc == 0.0, _ZERO_CONC_SENTINEL, conc) + n_safe = np.clip(n, -_POWER_CLIP, _POWER_CLIP) + ln_K_to_n = np.clip(n_safe * log_K, -_EXP_CLIP, _EXP_CLIP) + ln_x_to_n = np.clip(n_safe * np.log(x_safe), -_EXP_CLIP, _EXP_CLIP) + K_to_n = np.exp(ln_K_to_n) + x_to_n = np.exp(ln_x_to_n) + fx = x_to_n / (x_to_n + K_to_n) + return theta_low + (theta_high - theta_low) * fx + + +def _forward(p_t, design): + """Predict ln_cfu (and prior pseudo-observations) from transformed params. + + Parameter layout in ``p_t``: + [ln_cfu0_1 ... ln_cfu0_G, dk_geno, logit_theta_low, + logit_theta_high, log_hill_K, log_hill_n] + where ``G = design.n_intercept``. + """ + n_int = design.n_intercept + ln_cfu0_vec = p_t[:n_int] + dk_geno = p_t[n_int + 0] + theta_low = expit(p_t[n_int + 1]) + theta_high = expit(p_t[n_int + 2]) + log_K = p_t[n_int + 3] + n = np.exp(p_t[n_int + 4]) + + theta = _hill_theta(design.conc, theta_low, theta_high, log_K, n) + rate_pre = design.k_pre + dk_geno + design.m_pre * theta + rate_sel = design.k_sel + dk_geno + design.m_sel * theta + + ln_cfu0_row = design.intercept_onehot @ ln_cfu0_vec + pred = ln_cfu0_row + rate_pre * design.t_pre + rate_sel * design.t_sel + + # Append the regularized parameter values as pseudo-observations so a + # Gaussian prior enters as extra (Tikhonov) residuals in the same + # least-squares problem. + if design.prior_idx is not None: + pred = np.concatenate([pred, p_t[design.prior_idx]]) + + return pred + + +# prefit priors-CSV parameter names -> wide calibration columns (linear model). +# The prefit writes these via _csv_row_name = "growth.{component}.{field}". +_CALIB_PRIORS_MAP = { + "growth.condition_growth.k_loc": "growth_k", + "growth.condition_growth.m_loc": "growth_m", +} + + +def _pivot_priors_calibration(df): + """Reshape a prefit priors CSV (long form) to wide (condition_rep, k, m).""" + if "value" not in df.columns: + raise ValueError("priors CSV lacks a 'value' column.") + + sub = df[df["parameter"].isin(list(_CALIB_PRIORS_MAP))].copy() + if sub.empty: + raise ValueError( + "priors CSV has no 'growth.condition_growth.k_loc' / " + "'growth.condition_growth.m_loc' rows; run tfs-prefit-calibration on " + "a linear condition_growth model first (the empirical pipeline " + "assumes the linear growth model).") + + if "condition_rep" not in sub.columns or sub["condition_rep"].isna().all(): + raise ValueError( + "growth k/m priors are present but carry no per-condition " + "'condition_rep' labels — this looks like a fresh configure. Run " + "tfs-prefit-calibration to write the per-condition calibration first.") + + sub = sub.dropna(subset=["condition_rep"]) + sub["_field"] = sub["parameter"].map(_CALIB_PRIORS_MAP) + wide = (sub.pivot_table(index="condition_rep", columns="_field", + values="value", aggfunc="first") + .reset_index()) + wide.columns.name = None + + missing = {"growth_k", "growth_m"} - set(wide.columns) + if missing: + raise ValueError( + f"priors CSV is missing calibration rows for: {sorted(missing)} " + f"(expected both condition_growth_k_loc and condition_growth_m_loc).") + + wide["growth_k"] = wide["growth_k"].astype(float) + wide["growth_m"] = wide["growth_m"].astype(float) + return wide[["condition_rep", "growth_k", "growth_m"]] + + +def read_calibration(calib): + """Normalize a calibration source to wide ``(condition_rep, growth_k, growth_m)``. + + Accepts, transparently: + + * the **priors CSV** written by ``tfs-prefit-calibration`` (long form: a + ``parameter`` column with ``growth.condition_growth.k_loc`` / + ``growth.condition_growth.m_loc`` rows carrying a ``condition_rep`` label), or + * an already-wide table (columns ``condition_rep``, ``growth_k``, + ``growth_m``), + + as either a path or a DataFrame. + """ + df = read_dataframe(calib) + + if {"condition_rep", "growth_k", "growth_m"}.issubset(df.columns): + out = df[["condition_rep", "growth_k", "growth_m"]].copy() + out["growth_k"] = out["growth_k"].astype(float) + out["growth_m"] = out["growth_m"].astype(float) + return out + + if "parameter" in df.columns: + return _pivot_priors_calibration(df) + + raise ValueError( + "calibration must be either a wide table with columns " + "[condition_rep, growth_k, growth_m] or a prefit priors CSV with " + "'parameter' rows growth.condition_growth.k_loc / " + "growth.condition_growth.m_loc.") + + +def _build_calib_lookup(calib): + """Return (k_map, m_map): dicts condition_rep -> growth_k / growth_m. + + ``calib`` may be a mapping ``{condition_rep: {"growth_k": .., + "growth_m": ..}}``, or anything :func:`read_calibration` accepts (a path or + DataFrame in either the prefit priors form or the wide form). + """ + if isinstance(calib, dict): + k_map, m_map = {}, {} + for cond, d in calib.items(): + k_map[cond] = d["growth_k"] + m_map[cond] = d["growth_m"] + return k_map, m_map + + calib_df = read_calibration(calib) + k_map = dict(zip(calib_df["condition_rep"], calib_df["growth_k"])) + m_map = dict(zip(calib_df["condition_rep"], calib_df["growth_m"])) + return k_map, m_map + + +def _lookup_km(conditions, k_map, m_map, which): + """Vectorized (k, m) lookup with a fail-fast on unknown conditions.""" + conditions = np.asarray(conditions, dtype=object) + missing = sorted({c for c in conditions if c not in k_map}) + if missing: + raise ValueError( + f"condition_{which} value(s) absent from the calibration table: " + f"{missing}. The per-genotype fit requires frozen k/m for every " + f"condition; run tfs-prefit-calibration first.") + k = np.array([k_map[c] for c in conditions], dtype=float) + m = np.array([m_map[c] for c in conditions], dtype=float) + return k, m + + +def _initial_guess_transformed(sub, n_int): + """Transformed-space initial guesses for one genotype group.""" + pos_conc = sub["titrant_conc"].to_numpy(dtype=float) + pos_conc = pos_conc[pos_conc > 0] + log_K0 = np.log(np.median(pos_conc)) if pos_conc.size else 0.0 + + guess = np.empty(n_int + 5, dtype=float) + guess[:n_int] = float(np.nanmedian(sub["ln_cfu"].to_numpy(dtype=float))) + guess[n_int + 0] = 0.0 # dk_geno + guess[n_int + 1] = logit(0.9) # theta_low (repressed at 0) + guess[n_int + 2] = logit(0.1) # theta_high (induced) + guess[n_int + 3] = log_K0 # log_hill_K + guess[n_int + 4] = 0.0 # log_hill_n (n = 1) + return guess + + +def fit_one_genotype(sub, k_map, m_map, intercept_cols, dk_geno_prior=(0.0, 1.0)): + """Fit the growth model to a single (genotype, titrant_name) group. + + Parameters + ---------- + sub : pandas.DataFrame + Rows for one genotype/titrant with columns ``ln_cfu``, ``ln_cfu_std``, + ``t_pre``, ``t_sel``, ``titrant_conc``, ``condition_pre``, + ``condition_sel`` and every column in ``intercept_cols``. + k_map, m_map : dict + ``condition_rep -> growth_k`` and ``-> growth_m`` (frozen calibration). + intercept_cols : list of str + Columns whose unique combinations each get their own nuisance + ``ln_cfu0``. Empty list -> a single shared intercept. + dk_geno_prior : (loc, sd) or None + Weak Gaussian prior on ``dk_geno`` (natural == transformed space). + ``None`` disables regularization. + + Returns + ------- + GenotypeFit + """ + # Drop unusable observations (dead / zero-cfu rows carry NaN ln_cfu or a + # non-finite / non-positive std that run_least_squares cannot weight). + finite = (np.isfinite(sub["ln_cfu"].to_numpy(dtype=float)) + & np.isfinite(sub["ln_cfu_std"].to_numpy(dtype=float)) + & (sub["ln_cfu_std"].to_numpy(dtype=float) > 0)) + sub = sub.loc[finite] + + n_obs = len(sub) + + # Build the nuisance-intercept one-hot design. + if intercept_cols: + keys = sub[intercept_cols].astype(str).agg("|".join, axis=1) + cats = pd.Categorical(keys) + onehot = np.zeros((n_obs, len(cats.categories)), dtype=float) + onehot[np.arange(n_obs), cats.codes] = 1.0 + else: + onehot = np.ones((n_obs, 1), dtype=float) + n_int = onehot.shape[1] + + param_names_t = ([f"ln_cfu0[{i}]" for i in range(n_int)] + + PHENO_PARAMS_TRANSFORMED) + pheno_slice = slice(n_int, n_int + 5) + + # A group with fewer observations than parameters cannot be fit. + n_params = n_int + 5 + if n_obs < n_params + 1: + return GenotypeFit( + genotype=sub["genotype"].iloc[0] if n_obs else None, + titrant_name=sub["titrant_name"].iloc[0] if n_obs else None, + n_obs=n_obs, converged=False, param_names_t=param_names_t, + est_t=np.full(n_params, np.nan), + cov_t=np.full((n_params, n_params), np.nan), + pheno_slice=pheno_slice) + + k_pre, m_pre = _lookup_km(sub["condition_pre"], k_map, m_map, "pre") + k_sel, m_sel = _lookup_km(sub["condition_sel"], k_map, m_map, "sel") + + # Assemble prior pseudo-observations (currently only dk_geno). + if dk_geno_prior is not None: + prior_idx = np.array([n_int + 0]) + prior_loc = np.array([dk_geno_prior[0]], dtype=float) + prior_sd = np.array([dk_geno_prior[1]], dtype=float) + else: + prior_idx = None + prior_loc = np.array([], dtype=float) + prior_sd = np.array([], dtype=float) + + design = _Design( + conc=sub["titrant_conc"].to_numpy(dtype=float), + t_pre=sub["t_pre"].to_numpy(dtype=float), + t_sel=sub["t_sel"].to_numpy(dtype=float), + k_pre=k_pre, m_pre=m_pre, k_sel=k_sel, m_sel=m_sel, + intercept_onehot=onehot, n_intercept=n_int, prior_idx=prior_idx) + + obs = np.concatenate([sub["ln_cfu"].to_numpy(dtype=float), prior_loc]) + obs_std = np.concatenate([sub["ln_cfu_std"].to_numpy(dtype=float), prior_sd]) + + guess = _initial_guess_transformed(sub, n_int) + + # Bounds: intercepts and dk_geno free; theta logits clamped to keep theta + # in (0, 1); log_hill_K to a wide but finite window; log_hill_n to the + # component's power-clip range. + lower = np.full(n_int + 5, -np.inf) + upper = np.full(n_int + 5, np.inf) + lower[n_int + 1:n_int + 3] = -_LOGIT_BOUND + upper[n_int + 1:n_int + 3] = _LOGIT_BOUND + lower[n_int + 3], upper[n_int + 3] = np.log(1e-12), np.log(1e6) + lower[n_int + 4], upper[n_int + 4] = np.log(0.05), np.log(_POWER_CLIP) + + est_t, _std_t, cov_t, fit = run_least_squares( + some_model=_forward, obs=obs, obs_std=obs_std, + guesses=guess, lower_bounds=lower, upper_bounds=upper, args=(design,)) + + converged = bool(getattr(fit, "success", False)) + + return GenotypeFit( + genotype=sub["genotype"].iloc[0], + titrant_name=sub["titrant_name"].iloc[0], + n_obs=n_obs, converged=converged, param_names_t=param_names_t, + est_t=est_t, cov_t=cov_t, pheno_slice=pheno_slice) + + +def _natural_from_transformed(est_t, pheno_slice): + """Back-transform the 5-element phenotype block to natural space.""" + dk, lo_t, hi_t, logK, logn = est_t[pheno_slice] + return { + "dk_geno": dk, + "theta_low": expit(lo_t), + "theta_high": expit(hi_t), + "log_hill_K": logK, + "hill_n": np.exp(logn), + } + + +def fit_phenotypes(growth_df, + calib, + intercept_cols=("replicate",), + dk_geno_prior=(0.0, 1.0), + min_obs=None, + progress=True): + """Fit the growth model to every genotype in a real ``ln_cfu`` DataFrame. + + Parameters + ---------- + growth_df : pandas.DataFrame or str + Processed ln_cfu data (``tfs-process-counts`` output) or a path to it. + Required columns: ``genotype``, ``titrant_name``, ``titrant_conc``, + ``condition_pre``, ``condition_sel``, ``t_pre``, ``t_sel``, ``ln_cfu``, + ``ln_cfu_std``, plus every column in ``intercept_cols``. + calib : pandas.DataFrame or dict + Frozen per-condition growth calibration keyed by ``condition_rep``, + with ``growth_k`` and ``growth_m`` (see ``_build_calib_lookup``). + intercept_cols : sequence of str + Columns whose unique combinations each get a nuisance ``ln_cfu0``. + Default one intercept per ``replicate``; pass ``()`` for a single + shared intercept. + dk_geno_prior : (loc, sd) or None + Weak Gaussian prior on ``dk_geno``. ``None`` disables it. + min_obs : int or None + Skip genotype groups with fewer than this many usable observations. + progress : bool + Show a tqdm progress bar. + + Returns + ------- + results_df : pandas.DataFrame + One row per (genotype, titrant_name): ``n_obs``, ``converged``, the + five natural-space phenotype parameters, and their transformed-space + estimate/std (``_t``, ``_t_std``) for the downstream + distribution stage. + fits : dict + ``(genotype, titrant_name) -> GenotypeFit`` carrying the full + transformed estimate and covariance (the Stage-2 deconvolution input). + """ + growth_df = read_dataframe(growth_df) + # Real tfs-process-counts output carries ln_cfu + ln_cfu_var; derive + # ln_cfu / ln_cfu_std here exactly as the fit side (model_orchestrator) does. + growth_df = get_scaled_cfu(growth_df, need_columns=["ln_cfu", "ln_cfu_std"]) + intercept_cols = list(intercept_cols) + + required = ["genotype", "titrant_name", "titrant_conc", + "condition_pre", "condition_sel", "t_pre", "t_sel", + "ln_cfu", "ln_cfu_std"] + intercept_cols + check_columns(growth_df, required_columns=required) + + k_map, m_map = _build_calib_lookup(calib) + + groups = list(growth_df.groupby(["genotype", "titrant_name"], + observed=True, sort=False)) + if progress: + groups = tqdm.tqdm(groups, desc="fitting genotypes") + + rows = [] + fits = {} + for (geno, titr), sub in groups: + if min_obs is not None and len(sub) < min_obs: + continue + + gf = fit_one_genotype(sub, k_map, m_map, intercept_cols, + dk_geno_prior=dk_geno_prior) + fits[(geno, titr)] = gf + + natural = _natural_from_transformed(gf.est_t, gf.pheno_slice) + std_t = np.sqrt(np.diag(gf.cov_t))[gf.pheno_slice] + row = {"genotype": geno, "titrant_name": titr, + "n_obs": gf.n_obs, "converged": gf.converged} + row.update(natural) + for name, e, s in zip(PHENO_PARAMS_TRANSFORMED, + gf.est_t[gf.pheno_slice], std_t): + row[f"{name}_t"] = e + row[f"{name}_t_std"] = s + rows.append(row) + + if not rows: + warnings.warn("fit_phenotypes produced no fits (empty/filtered input).") + + results_df = pd.DataFrame(rows) + return results_df, fits diff --git a/src/tfscreen/simulate/empirical/population.py b/src/tfscreen/simulate/empirical/population.py new file mode 100644 index 00000000..76b87afa --- /dev/null +++ b/src/tfscreen/simulate/empirical/population.py @@ -0,0 +1,306 @@ +""" +Stage 2 of the empirical-phenotype pipeline: estimate the *generating* +distribution of per-genotype phenotype parameters from the Stage-1 fits. + +Each Stage-1 fit gives a point estimate ``y_i`` and a sampling covariance +``S_i`` (both in the transformed coordinate system: +``[dk_geno, logit_theta_low, logit_theta_high, log_hill_K, log_hill_n]``). +The spread of the point estimates is inflated by estimation noise: + + Cov(y_i) == Sigma_pop + mean_i(S_i) + +so naively fitting a distribution to the point estimates (a KDE/GMM on +``y_i``) would bake that inflation in and produce a library more heterogeneous +than reality. This module instead fits a measurement-error (random-effects) +model + + z_i ~ Normal(mu, Sigma_pop) # true phenotype (what we want) + y_i ~ Normal(z_i, S_i) # Stage-1 estimate, known S_i + +by maximum likelihood (EM), recovering the **deconvolved** population +covariance ``Sigma_pop`` with estimation noise removed. ``Sigma_pop`` is the +distribution Stage 3 resamples fresh genotypes from. + +Scope +----- +This stage removes *estimation* noise only. It does **not** correct the +congression attenuation present in bulk (in-library) fits — that is the +deferred iteration-to-consistency layer. To validate/anchor the result, +fit the population on the congression-free spiked subset separately (pass a +``subset`` mask) and compare to the bulk fit. + +The population is modeled as a single multivariate Normal in transformed +space. A Gaussian-mixture extension (for multimodal libraries, e.g. a +functional mode plus a dead mode) is a natural drop-in: run one +measurement-error EM per mixture component with responsibilities. Left as a +future extension so v1 stays simple and testable. +""" + +import json +import os +import numpy as np +import pandas as pd +import warnings +from dataclasses import dataclass + +from tfscreen.simulate.empirical.fit_phenotypes import ( + PHENO_PARAMS_TRANSFORMED, + PHENO_PARAMS_NATURAL, + _LOGIT_BOUND, +) +from scipy.special import expit + +_JITTER = 1e-9 # added to matrices before inversion +_EIG_FLOOR = 1e-8 # floor on eigenvalues of S_i and projected Sigma + + +def _nearest_psd(A, floor=_EIG_FLOOR): + """Symmetrize and clip eigenvalues to ``floor`` (nearest PSD matrix).""" + A = 0.5 * (A + A.T) + w, V = np.linalg.eigh(A) + w = np.clip(w, floor, None) + return (V * w) @ V.T + + +def _batched_inv(mats): + """Invert a stack of matrices with a small diagonal jitter.""" + D = mats.shape[-1] + return np.linalg.inv(mats + _JITTER * np.eye(D)) + + +def _pheno_block(fit): + """Extract the (estimate, covariance) phenotype block from a GenotypeFit.""" + est = np.asarray(fit.est_t)[fit.pheno_slice] + cov = np.asarray(fit.cov_t)[fit.pheno_slice, fit.pheno_slice] + return est, cov + + +def _collect_estimates(fits, subset=None, require_converged=True, + drop_railed=True): + """Gather transformed phenotype estimates + covariances from Stage-1 fits. + + Parameters + ---------- + fits : dict + ``{key: GenotypeFit}`` from ``fit_phenotypes``. + subset : set/list or None + If given, keep only fits whose key is in ``subset`` (e.g. spiked-only). + require_converged : bool + Drop fits whose optimizer did not report success. + drop_railed : bool + Drop fits whose ``logit_theta_low``/``logit_theta_high`` sit on the + ``+-_LOGIT_BOUND`` clamp (unidentified vertical placement). + + Returns + ------- + Y : (N, D) float + S : (N, D, D) float (each PSD-floored) + keys : list (kept keys, aligned with Y/S rows) + """ + Y, S, keys = [], [], [] + for key, fit in fits.items(): + if subset is not None and key not in subset: + continue + if require_converged and not fit.converged: + continue + + est, cov = _pheno_block(fit) + if not (np.all(np.isfinite(est)) and np.all(np.isfinite(cov))): + continue + + if drop_railed: + # indices 1, 2 are logit_theta_low / logit_theta_high + if np.any(np.abs(est[[1, 2]]) >= _LOGIT_BOUND - 1e-6): + continue + + Y.append(est) + S.append(_nearest_psd(cov)) + keys.append(key) + + if not Y: + raise ValueError( + "No usable fits after filtering (converged / finite / not railed). " + "Relax the filters or check the Stage-1 output.") + + return np.asarray(Y), np.asarray(S), keys + + +def _moment_init(Y, S): + """Method-of-moments start: mu = mean(Y), Sigma = Cov(Y) - mean(S).""" + mu = Y.mean(axis=0) + sigma = np.cov(Y, rowvar=False) - S.mean(axis=0) + return mu, _nearest_psd(np.atleast_2d(sigma)) + + +def _marginal_loglik(Y, S, mu, sigma): + """Sum_i log Normal(Y_i | mu, Sigma + S_i).""" + D = Y.shape[1] + C = sigma[None] + S # (N, D, D) + r = Y - mu # (N, D) + sign, logdet = np.linalg.slogdet(C) + sol = np.linalg.solve(C, r[..., None])[..., 0] + quad = np.einsum("ni,ni->n", r, sol) + return float(np.sum(-0.5 * (D * np.log(2 * np.pi) + logdet + quad))) + + +def _em_measurement_error(Y, S, max_iter=500, tol=1e-8): + """EM for z_i ~ N(mu, Sigma), y_i ~ N(z_i, S_i) with known S_i. + + Returns (mu, Sigma, n_iter, loglik). + """ + mu, sigma = _moment_init(Y, S) + S_inv = _batched_inv(S) # (N, D, D), fixed across iters + ll_prev = -np.inf + + for it in range(1, max_iter + 1): + sigma_inv = np.linalg.inv(sigma + _JITTER * np.eye(sigma.shape[0])) + + # E-step: posterior of each z_i given y_i. + prec = sigma_inv[None] + S_inv # (N, D, D) + V = _batched_inv(prec) # posterior covariances + rhs = (sigma_inv @ mu)[None] + np.einsum("nij,nj->ni", S_inv, Y) + m = np.einsum("nij,nj->ni", V, rhs) # posterior means (N, D) + + # M-step. + mu = m.mean(axis=0) + diff = m - mu + sigma = V.mean(axis=0) + np.einsum("ni,nj->ij", diff, diff) / len(Y) + sigma = _nearest_psd(sigma) + + ll = _marginal_loglik(Y, S, mu, sigma) + if np.abs(ll - ll_prev) < tol * (1 + np.abs(ll_prev)): + return mu, sigma, it, ll + ll_prev = ll + + warnings.warn(f"measurement-error EM did not converge in {max_iter} " + f"iterations (last loglik={ll_prev:.4g}).") + return mu, sigma, max_iter, ll_prev + + +@dataclass +class PopulationModel: + """A fitted generating distribution over transformed phenotype params.""" + param_names_t: list # transformed-space names + param_names_natural: list # natural-space names (aligned index-for-index) + mu: np.ndarray # (D,) + cov: np.ndarray # (D, D) + n_used: int + loglik: float = np.nan + n_iter: int = 0 + wt_ref: dict = None # actual wt Stage-1 Hill params (theta_low, ...) + + def sample_transformed(self, n, rng=None): + """Draw ``n`` phenotype vectors in transformed space, shape (n, D).""" + rng = np.random.default_rng(rng) + return rng.multivariate_normal(self.mu, self.cov, size=n) + + def sample(self, n, rng=None): + """Draw ``n`` phenotypes as a natural-space DataFrame. + + Columns: ``dk_geno``, ``theta_low``, ``theta_high``, ``log_hill_K``, + ``hill_n`` — exactly the per-genotype quantities Stage 3 injects. + """ + Z = self.sample_transformed(n, rng=rng) + return self._to_natural(Z) + + def _to_natural(self, Z): + """Back-transform a (n, D) transformed array to a natural DataFrame.""" + Z = np.atleast_2d(Z) + out = { + "dk_geno": Z[:, 0], + "theta_low": expit(Z[:, 1]), + "theta_high": expit(Z[:, 2]), + "log_hill_K": Z[:, 3], + "hill_n": np.exp(Z[:, 4]), + } + return pd.DataFrame(out, columns=PHENO_PARAMS_NATURAL) + + def save(self, path): + """Persist as a single, self-contained, human-readable JSON file. + + The whole model is the generating distribution: a small multivariate + Normal (``mu``, ``cov``) over the transformed per-genotype phenotype + parameters, plus the parameter names and wt's reference phenotype. It + is written as one ``.json`` file (``.json`` appended if absent) that you + can open and read. Returns the path actually written. + """ + path = str(path) + if not path.endswith(".json"): + path = path + ".json" + payload = { + "_description": ( + "tfscreen empirical phenotype generating distribution: a " + "multivariate Normal over transformed per-genotype phenotype " + "parameters. Produced by tfs-build-empirical; consumed " + "by tfs-simulate via 'phenotype_source: empirical'."), + "param_names_transformed": list(self.param_names_t), + "param_names_natural": list(self.param_names_natural), + "mu": np.asarray(self.mu).tolist(), + "cov": np.asarray(self.cov).tolist(), + "wt_ref": self.wt_ref, + "n_genotypes_used": int(self.n_used), + "loglik": float(self.loglik), + "em_iters": int(self.n_iter), + } + with open(path, "w") as f: + json.dump(payload, f, indent=2) + return path + + @classmethod + def load(cls, path): + path = str(path) + if not os.path.exists(path) and os.path.exists(path + ".json"): + path = path + ".json" + with open(path) as f: + d = json.load(f) + return cls(param_names_t=d["param_names_transformed"], + param_names_natural=d["param_names_natural"], + mu=np.asarray(d["mu"], dtype=float), + cov=np.asarray(d["cov"], dtype=float), + n_used=int(d["n_genotypes_used"]), + loglik=float(d.get("loglik", np.nan)), + n_iter=int(d.get("em_iters", 0)), + wt_ref=d.get("wt_ref")) + + +def fit_population(fits, + subset=None, + require_converged=True, + drop_railed=True, + max_iter=500, + tol=1e-8): + """Estimate the deconvolved generating distribution from Stage-1 fits. + + Parameters + ---------- + fits : dict + ``{key: GenotypeFit}`` from ``fit_phenotypes``. + subset : set/list or None + Restrict to these keys (e.g. spiked-only for the congression-free + validation fit). + require_converged, drop_railed : bool + Fit-quality filters (see ``_collect_estimates``). + max_iter, tol : int, float + EM controls. + + Returns + ------- + PopulationModel + """ + Y, S, keys = _collect_estimates( + fits, subset=subset, require_converged=require_converged, + drop_railed=drop_railed) + + D = Y.shape[1] + if len(Y) < D + 1: + raise ValueError( + f"Only {len(Y)} usable fits for a {D}-dimensional population; " + f"need at least {D + 1}. Loosen filters or gather more genotypes.") + + mu, sigma, n_iter, ll = _em_measurement_error(Y, S, max_iter=max_iter, + tol=tol) + + return PopulationModel( + param_names_t=list(PHENO_PARAMS_TRANSFORMED), + param_names_natural=list(PHENO_PARAMS_NATURAL), + mu=mu, cov=sigma, n_used=len(Y), loglik=ll, n_iter=n_iter) diff --git a/src/tfscreen/simulate/empirical/resample.py b/src/tfscreen/simulate/empirical/resample.py new file mode 100644 index 00000000..33e6a677 --- /dev/null +++ b/src/tfscreen/simulate/empirical/resample.py @@ -0,0 +1,225 @@ +""" +Stage 3 of the empirical-phenotype pipeline: resample fresh per-genotype +phenotypes from a Stage-2 ``PopulationModel`` and turn them into the override +dicts that ``thermo_to_growth`` / ``library_prediction`` inject. + +Flow: draw one ``(dk_geno, theta_low, theta_high, log_hill_K, hill_n)`` per +library genotype from the fitted generating distribution, then hand those to +the existing ``build_theta_gc_override_hill_geno`` machinery to produce a +``theta_gc_override`` (theta at growth concentrations) and a +``theta_params_override`` (the effective Hill params written to +``parameters_df``), plus a ``dk_geno_override``. These three dicts are exactly +the injection points ``thermo_to_growth`` already consumes, so no growth-path +changes are needed beyond the ``dk_geno_override`` hook. + +Scope +----- +This targets ``hill_geno`` — the theta component whose per-genotype parameters +are independent (no mutation decomposition). Drawing one i.i.d. phenotype per +genotype from the marginal population is exactly consistent with that +structure. ``hill_mut`` (per-mutation deltas with epistasis) would instead +require resampling in mutation space and is a future extension. + +wt handling +----------- +``wt`` is the reference genotype: its ``dk_geno`` is pinned to 0 (matching the +sim/inference convention) and its Hill curve defaults to the population mean +(back-transformed ``mu``) unless an explicit ``wt_ref`` is supplied. All other +genotypes are fresh i.i.d. draws. +""" + +import numpy as np +import pandas as pd + +from tfscreen.genetics import standardize_genotypes +from tfscreen.simulate.sample_theta import _greedy_maximin +from tfscreen.simulate.binding_params import ( + build_theta_gc_override_hill_geno, + build_binding_theta_from_params, + read_binding_genotype_params, + _hill_theta, + _to_log_conc, +) + +# Natural-space Hill columns, in the order the injection machinery expects. +_HILL_COLS = ["theta_low", "theta_high", "log_hill_K", "hill_n"] + + +def population_mean_params(model): + """Return the back-transformed population-mean Hill params as a dict.""" + mean_natural = model._to_natural(model.mu) # 1-row DataFrame + return {c: float(mean_natural[c].iloc[0]) for c in _HILL_COLS} + + +def resample_phenotypes(model, genotypes, rng=None, wt_ref=None): + """Draw one phenotype per genotype from a ``PopulationModel``. + + Parameters + ---------- + model : PopulationModel + Fitted Stage-2 generating distribution. + genotypes : iterable of str + Library genotypes to assign phenotypes to. Duplicates are collapsed + (first occurrence wins for ordering). + rng : int, np.random.Generator, or None + Seed / generator for the draws. + wt_ref : dict or None + Optional explicit Hill params for ``wt`` (``theta_low``, ``theta_high``, + ``log_hill_K``, ``hill_n``). Defaults to the population mean. + + Returns + ------- + pandas.DataFrame + One row per genotype: ``genotype`` plus ``dk_geno`` and the four Hill + columns. ``wt`` (if present) is first, with ``dk_geno == 0``. + """ + genotypes = list(dict.fromkeys(genotypes)) # unique, order-preserving + has_wt = "wt" in genotypes + non_wt = [g for g in genotypes if g != "wt"] + + draws = model.sample(len(non_wt), rng=rng) if non_wt else \ + model.sample(0) + draws = draws.reset_index(drop=True) + draws.insert(0, "genotype", non_wt) + + frames = [] + if has_wt: + wt_params = dict(wt_ref) if wt_ref is not None \ + else population_mean_params(model) + wt_row = {"genotype": "wt", "dk_geno": 0.0} + wt_row.update({c: float(wt_params[c]) for c in _HILL_COLS}) + frames.append(pd.DataFrame([wt_row])) + frames.append(draws) + + out = pd.concat(frames, ignore_index=True) + return out[["genotype", "dk_geno"] + _HILL_COLS] + + +def build_overrides(pheno_df, log_conc_growth, wt_params=None): + """Turn resampled phenotypes into thermo_to_growth override dicts. + + Parameters + ---------- + pheno_df : pandas.DataFrame + Output of :func:`resample_phenotypes` (``genotype``, ``dk_geno``, and + the four Hill columns). + log_conc_growth : array-like, shape (C,) + Log growth concentrations, from ``sim_data.log_titrant_conc``. + wt_params : dict or None + Fallback Hill params for any NaN fields (required by + ``build_theta_gc_override_hill_geno``). Since resampled rows are fully + specified this is never actually consulted; defaults to the first row's + params so a valid dict is always passed. + + Returns + ------- + theta_gc_override : dict[str, np.ndarray] + theta_params_override : dict[str, dict[str, float]] + dk_geno_override : dict[str, float] + """ + params_dict = { + row["genotype"]: {c: float(row[c]) for c in _HILL_COLS} + for _, row in pheno_df.iterrows() + } + if wt_params is None: + wt_params = next(iter(params_dict.values())) + + theta_gc_override, theta_params_override = build_theta_gc_override_hill_geno( + params_dict, np.asarray(log_conc_growth, dtype=float), wt_params) + + dk_geno_override = {row["genotype"]: float(row["dk_geno"]) + for _, row in pheno_df.iterrows()} + + return theta_gc_override, theta_params_override, dk_geno_override + + +def _resampled_binding_matrix(pheno_by_geno, genos, binding_concs): + """Resampled binding-theta curves (rows=genos) at the binding concentrations.""" + log_concs = _to_log_conc(np.asarray(binding_concs, dtype=float)) + rows = [] + for g in genos: + r = pheno_by_geno.loc[g] + rows.append(_hill_theta(r["theta_low"], r["theta_high"], + r["log_hill_K"], r["hill_n"], log_concs)) + return np.asarray(rows) + + +def build_empirical_binding_theta(pheno_df, binding_cfg, spiked_names, rng): + """Build the spiked ``binding_theta_df`` from resampled phenotypes. + + *Selection* (which spiked genotypes are measured) follows the + ``spiked_binding`` block of ``binding_cfg`` — ``file`` (explicit list), + ``random`` (``num`` at random), or ``stratified`` (greedy-maximin spread + over the resampled binding curves). The theta *values* come from each + genotype's resampled Hill params in ``pheno_df``, keeping binding and + growth derived from the same ground truth. Returned rows are noise-free + (``theta_true``); ``simulate_cli`` applies the assay noise downstream. + + Returns + ------- + pandas.DataFrame or None + ``genotype, titrant_name, titrant_conc, theta_true`` — or ``None`` when + no ``spiked_binding`` is configured. + """ + sb = binding_cfg.get("spiked_binding") + if sb is None: + return None + + titrant_name = binding_cfg["titrant_name"] + binding_concs = binding_cfg["titrant_conc"] + choose_by = sb["choose_by"] + + spiked_set = list(dict.fromkeys(standardize_genotypes(spiked_names))) + pheno_by_geno = pheno_df.set_index("genotype") + + if choose_by not in ("stratified", "random"): + # file: genotype list from the file's keys (params ignored — theta + # comes from the resampled phenotypes); must be a subset of spiked. + genos = list(standardize_genotypes( + list(read_binding_genotype_params(choose_by).keys()))) + bad = set(genos) - set(spiked_set) + if bad: + raise ValueError( + f"spiked_binding file genotypes must be spiked; not spiked: " + f"{sorted(bad)}") + else: + num = sb.get("num") + num = len(spiked_set) if num is None else int(num) + num = min(num, len(spiked_set)) + if choose_by == "random": + idx = rng.choice(len(spiked_set), size=num, replace=False) + genos = [spiked_set[i] for i in sorted(idx)] + else: # stratified + mat = _resampled_binding_matrix(pheno_by_geno, spiked_set, + binding_concs) + sel = _greedy_maximin(mat, num) + genos = [spiked_set[i] for i in sel] + + params_dict = {g: {c: float(pheno_by_geno.loc[g, c]) for c in _HILL_COLS} + for g in genos if g in pheno_by_geno.index} + if not params_dict: + return None + + wt_params = next(iter(params_dict.values())) + return build_binding_theta_from_params( + params_dict, binding_concs, titrant_name, noise=0.0, + rng=rng, wt_params=wt_params) + + +def make_empirical_overrides(model, genotypes, log_conc_growth, + rng=None, wt_ref=None): + """Convenience: resample + build overrides in one call. + + Returns + ------- + pheno_df : pandas.DataFrame + The resampled per-genotype phenotypes (ground truth to save alongside). + theta_gc_override, theta_params_override, dk_geno_override : dict + Ready to pass to ``thermo_to_growth`` / ``library_prediction``. + """ + pheno_df = resample_phenotypes(model, genotypes, rng=rng, wt_ref=wt_ref) + wt_params = population_mean_params(model) + theta_gc_override, theta_params_override, dk_geno_override = build_overrides( + pheno_df, log_conc_growth, wt_params=wt_params) + return (pheno_df, theta_gc_override, theta_params_override, + dk_geno_override) diff --git a/src/tfscreen/simulate/library_binding_data.py b/src/tfscreen/simulate/library_binding_data.py new file mode 100644 index 00000000..84308dc2 --- /dev/null +++ b/src/tfscreen/simulate/library_binding_data.py @@ -0,0 +1,166 @@ +""" +Generate simulated binding-curve data for IN-LIBRARY genotypes. + +Unlike the spiked/monoclonal binding genotypes (handled in ``library_prediction`` ++ ``binding_data.generate_binding_df``), these genotypes are drawn from the bulk +library, so their growth data carries congressional transformation. Only a +binding *measurement* is added here -- their phenotype (Hill theta) is whatever +the library simulation produced (a prior-predictive draw for stratified/random +selection, or the injected file params for the file path), so no theta override +is needed and consistency with growth is automatic. + +Selection for the stratified/random paths is deferred until AFTER the growth +simulation so it can be restricted to genotypes that actually survived with +growth data, guaranteeing ``num`` usable anchors. The file path names its +genotypes up front (validated pre-sim); any that fail to survive are warned +about and dropped here. +""" + +import warnings + +import numpy as np +import pandas as pd + +from tfscreen.genetics import standardize_genotypes +from tfscreen.simulate.sample_theta import _greedy_maximin +from tfscreen.simulate.binding_params import ( + read_binding_genotype_params, + _to_log_conc, +) + +_BINDING_COLS = ["genotype", "titrant_name", "titrant_conc", "theta_obs", "theta_std"] + + +def _is_file_choice(choose_by): + """``choose_by`` is a file when it is not one of the builtin keywords.""" + return choose_by not in ("stratified", "random") + + +def _theta_matrix(params_df, log_concs): + """Vectorised Hill theta for each row of ``params_df`` at each log conc. + + Returns an array of shape ``(len(params_df), len(log_concs))``. + """ + tl = params_df["theta_low"].to_numpy(dtype=float)[:, None] + th = params_df["theta_high"].to_numpy(dtype=float)[:, None] + lk = params_df["log_hill_K"].to_numpy(dtype=float)[:, None] + hn = params_df["hill_n"].to_numpy(dtype=float)[:, None] + lc = np.asarray(log_concs, dtype=float)[None, :] + occupancy = 1.0 / (1.0 + np.exp(-hn * (lc - lk))) + return tl + (th - tl) * occupancy + + +def generate_library_binding_df(library_binding_cfg, + titrant_name, + titrant_conc, + noise, + parameters_df, + growth_df, + spiked_genotypes, + rng): + """ + Generate binding-curve data for in-library (bulk) genotypes. + + Parameters + ---------- + library_binding_cfg : dict + The ``binding_data.library_binding`` sub-dict. Keys: + ``choose_by`` : "stratified" | "random" | + ``num`` : int, required for stratified/random (forbidden with a file) + titrant_name : str + Titrant name (shared with the rest of ``binding_data``). + titrant_conc : list of float + Binding-assay concentrations (shared). + noise : float + Gaussian sigma on ``theta_obs`` (shared). + parameters_df : pandas.DataFrame + Per-genotype ground-truth phenotype; must carry ``genotype`` plus the + Hill columns ``theta_low, theta_high, log_hill_K, hill_n``. For + file-specified genotypes this already reflects the injected file params. + growth_df : pandas.DataFrame + The simulated growth data (post selection); its ``genotype`` column is + the set of survivors used to guarantee coverage. + spiked_genotypes : iterable of str or None + Genotypes that are spiked (excluded from the in-library pool). + rng : numpy.random.Generator + + Returns + ------- + (binding_df, manifest_df) : tuple[pandas.DataFrame, pandas.DataFrame] + ``binding_df`` columns: genotype, titrant_name, titrant_conc, + theta_obs, theta_std. ``manifest_df`` records the selected genotypes, + ``binding_class='library'`` and the ``choose_by`` used. + """ + choose_by = library_binding_cfg["choose_by"] + num = library_binding_cfg.get("num") + + titrant_conc = [float(c) for c in titrant_conc] + log_concs = _to_log_conc(titrant_conc) + noise = float(noise) + + spiked_set = (set(standardize_genotypes(list(spiked_genotypes))) + if spiked_genotypes else set()) + + # Genotypes that actually have growth data (survived selection). + survivors = set(growth_df["genotype"].astype(str).unique()) + + # Index the ground-truth phenotypes by genotype for theta lookups. + pdf = parameters_df.copy() + pdf["genotype"] = pdf["genotype"].astype(str) + pdf = pdf.drop_duplicates("genotype").set_index("genotype") + + if _is_file_choice(choose_by): + # The file names the genotypes; their Hill params were injected into the + # library phenotype pre-sim, so theta comes from parameters_df. + named = list(standardize_genotypes( + list(read_binding_genotype_params(choose_by).keys()))) + eligible = survivors & set(pdf.index) + missing = [g for g in named if g not in eligible] + if missing: + warnings.warn( + f"library_binding: {len(missing)} file-specified genotype(s) did " + f"not survive with growth data and are dropped: {missing}" + ) + genotypes = [g for g in named if g in eligible] + else: + # Stratified / random: choose `num` from the surviving bulk + # (non-spiked, non-wt) so every anchor has matching growth data. + pool = sorted((survivors & set(pdf.index)) - spiked_set - {"wt"}) + if num is None: + raise ValueError( + f"library_binding requires 'num' for choose_by '{choose_by}'." + ) + if len(pool) < int(num): + raise ValueError( + f"library_binding: only {len(pool)} eligible surviving genotype(s) " + f"available, but num={num} requested." + ) + pool_theta = _theta_matrix(pdf.loc[pool], log_concs) + if choose_by == "stratified": + sel_idx = _greedy_maximin(pool_theta, int(num)) + elif choose_by == "random": + sel_idx = rng.choice(len(pool), size=int(num), replace=False) + else: + raise ValueError(f"Unknown library_binding choose_by: '{choose_by}'.") + genotypes = [pool[int(i)] for i in np.asarray(sel_idx)] + + # Build binding rows: theta from Hill params + Gaussian noise. + theta_true = (_theta_matrix(pdf.loc[genotypes], log_concs) + if genotypes else np.zeros((0, len(titrant_conc)))) + rows = [] + for gi, g in enumerate(genotypes): + for cj, conc in enumerate(titrant_conc): + tt = float(theta_true[gi, cj]) + tobs = (float(np.clip(tt + rng.normal(0, noise), 0.0, 1.0)) + if noise > 0 else tt) + rows.append({"genotype": g, "titrant_name": titrant_name, + "titrant_conc": conc, "theta_obs": tobs, + "theta_std": noise}) + + binding_df = pd.DataFrame(rows, columns=_BINDING_COLS) + manifest_df = pd.DataFrame({ + "genotype": genotypes, + "binding_class": ["library"] * len(genotypes), + "choose_by": [str(choose_by)] * len(genotypes), + }) + return binding_df, manifest_df diff --git a/src/tfscreen/simulate/library_prediction.py b/src/tfscreen/simulate/library_prediction.py index 660ee300..5d0c2063 100644 --- a/src/tfscreen/simulate/library_prediction.py +++ b/src/tfscreen/simulate/library_prediction.py @@ -15,6 +15,12 @@ build_binding_theta_from_params, _wt_params_from_sim_priors, ) +from tfscreen.simulate.empirical.resample import ( + make_empirical_overrides, + build_empirical_binding_theta, +) +from tfscreen.simulate.empirical.population import PopulationModel + from tfscreen.genetics import library_manager from tfscreen.genetics import standardize_genotypes @@ -22,6 +28,8 @@ import numpy as np import pandas as pd +import os +import warnings from typing import Any, Dict, Union from pathlib import Path @@ -31,6 +39,40 @@ def _is_file_choice(choose_by): return choose_by not in ("stratified", "random") +def _resolve_phenotype_model_path(path): + """Resolve a ``phenotype_model`` value to the saved model JSON file. + + ``tfs-build-empirical`` writes the model as a single self-contained + ``_phenotype_model.json`` (and prints its absolute path). This + accepts that path with or without the ``.json`` extension, and — as a + convenience if you point at the bare pipeline ```` — appends + ``_phenotype_model.json``. Returns a path that exists. + """ + path = str(path) + candidates = [path, f"{path}.json", f"{path}_phenotype_model.json"] + for cand in candidates: + if os.path.exists(cand): + return cand + raise FileNotFoundError( + f"No phenotype model file found for phenotype_model='{path}'. Looked " + f"for: {candidates}. tfs-build-empirical prints the exact path " + f"to use at the end of its run (a '_phenotype_model.json' " + f"file); use that -- an absolute path resolves from any working " + f"directory, so you never need to copy the file.") + + +def _load_phenotype_model(cf): + """Load the saved Stage-2 PopulationModel for ``phenotype_source: empirical``.""" + emp = cf.get("empirical") + if not emp or not emp.get("phenotype_model"): + raise ValueError( + "phenotype_source: empirical requires an 'empirical' block with a " + "'phenotype_model' path (a saved PopulationModel from " + "tfs-build-empirical).") + return PopulationModel.load( + _resolve_phenotype_model_path(emp["phenotype_model"])) + + def _validate_binding_config(binding_cfg, spiked_names, theta_component): """Fail-fast validation of the binding_data spiked_binding/library_binding blocks.""" spiked_set = set(spiked_names) @@ -258,11 +300,29 @@ def library_prediction(cf: Union[Dict[str, Any], str, Path], # here so the growth simulation reflects them. binding_cfg = cf.get('binding_data') + phenotype_source = cf.get('phenotype_source', 'prior') theta_gc_override = {} theta_params_override = {} + dk_geno_override = None binding_theta_df = None - if binding_cfg is not None: + if phenotype_source == 'empirical': + # Empirical phenotypes: resample every library genotype from the + # fitted generating distribution and inject as overrides. Binding + # data (if configured) is regenerated from the same resampled params. + model = _load_phenotype_model(cf) + log_conc_growth = np.array(sim_data.log_titrant_conc) + pheno_df, theta_gc_override, theta_params_override, dk_geno_override = \ + make_empirical_overrides( + model, list(library_df["genotype"]), log_conc_growth, + rng=rng, wt_ref=model.wt_ref) + if binding_cfg is not None: + spiked_names = list(pd.unique(library_df.loc[ + library_df["library_origin"] == "spiked", "genotype"])) + binding_theta_df = build_empirical_binding_theta( + pheno_df, binding_cfg, spiked_names, rng) + + elif binding_cfg is not None: binding_concs = binding_cfg['titrant_conc'] titrant_name = binding_cfg['titrant_name'] theta_component = cf['theta_component'] @@ -312,27 +372,55 @@ def library_prediction(cf: Union[Dict[str, Any], str, Path], # ------------------------------------------------------------------------- # Calculate phenotype for each genotype across all conditions in sample_df + # In empirical mode the resampled phenotypes fully replace the prior draw, + # and are hill_geno-structured (marginal per-genotype). So force hill_geno + # for the (discarded) baseline draw — this both matches the parameters_df + # schema the overrides patch and avoids running/overflowing an expensive + # e.g. hill_mut prior draw that would be thrown away — drop the (ignored) + # theta prior overrides, and force unit activity (A absorbed into theta). + if phenotype_source == 'empirical': + configured = cf.get('theta_component', 'hill_geno') + if configured != 'hill_geno': + warnings.warn( + f"phenotype_source: empirical forces theta_component=hill_geno " + f"(config has '{configured}', which is ignored): the resampled " + f"phenotypes are per-genotype Hill curves.") + theta_component = 'hill_geno' + theta_priors_overrides = None + theta_sim_priors_overrides = None + activity_component = 'fixed' + activity_wt = 1.0 + activity_mut_scale = 0.0 + else: + theta_component = cf['theta_component'] + theta_priors_overrides = cf.get('theta_priors') + theta_sim_priors_overrides = cf.get('theta_sim_priors') + activity_component = cf.get('activity_component', 'fixed') + activity_wt = cf.get('activity_wt', 1.0) + activity_mut_scale = cf.get('activity_mut_scale', 0.0) + phenotype_df, genotype_theta_df, parameters_df = thermo_to_growth( genotypes=library_df["genotype"], sim_data=sim_data, sample_df=sample_df, - theta_component=cf['theta_component'], + theta_component=theta_component, theta_rng_key=theta_rng_key, growth_params=cf['growth'], - theta_priors_overrides=cf.get('theta_priors'), - theta_sim_priors_overrides=cf.get('theta_sim_priors'), + theta_priors_overrides=theta_priors_overrides, + theta_sim_priors_overrides=theta_sim_priors_overrides, dk_geno_hyper_loc=dk_geno_hyper_loc, dk_geno_hyper_scale=dk_geno_hyper_scale, dk_geno_hyper_shift=dk_geno_hyper_shift, dk_geno_zero=dk_geno_zero, - activity_wt=cf.get('activity_wt', 1.0), - activity_mut_scale=cf.get('activity_mut_scale', 0.0), + activity_wt=activity_wt, + activity_mut_scale=activity_mut_scale, rng=rng, - activity_component=cf.get('activity_component', 'fixed'), + activity_component=activity_component, activity_priors_overrides=cf.get('activity_priors'), theta_rescale=cf.get('theta_rescale', 'passthrough'), theta_gc_override=theta_gc_override, theta_params_override=theta_params_override or None, + dk_geno_override=dk_geno_override, ) return library_df, phenotype_df, genotype_theta_df, parameters_df, binding_theta_df diff --git a/src/tfscreen/simulate/scripts/build_empirical_cli.py b/src/tfscreen/simulate/scripts/build_empirical_cli.py new file mode 100644 index 00000000..eca26ca3 --- /dev/null +++ b/src/tfscreen/simulate/scripts/build_empirical_cli.py @@ -0,0 +1,197 @@ +""" +tfs-build-empirical: fit real screen data to an empirical +phenotype-generating distribution (the empirical pipeline, one command). + +Takes the **experimental inputs** (real growth + binding data) and internally +runs the whole pipeline: it configures a linear/hill_geno model +(``tfs-configure-model`` defaults — there are no meaningful choices here for +this use case) and MAP-calibrates the per-condition growth linkage +(``tfs-prefit-calibration``) to get frozen ``k``/``m``, then + + * Stage 1 — per-genotype MLE of the growth model (frozen calibration) → + per-genotype ``(dk_geno, theta_low, theta_high, log_hill_K, hill_n)`` with + covariances; + * Stage 2 — measurement-error deconvolution into a ``PopulationModel`` + (with wt's actual fitted phenotype embedded as ``wt_ref``). + +The saved model is what ``tfs-simulate`` resamples from via +``phenotype_source: empirical``. + +The configure/prefit intermediates are written under ``_configure_*`` +and ``_prefit_*`` so they can be inspected and reused. The MAP +prefit is the slow step; pass ``--calibration_file`` (a prefit priors CSV or a +wide ``condition_rep,growth_k,growth_m`` CSV) to skip configure+prefit and +iterate on the fast Stage-1/2 knobs. +""" + +import os +import warnings + +from tfscreen.simulate.empirical.fit_phenotypes import fit_phenotypes +from tfscreen.simulate.empirical.population import fit_population +from tfscreen.util.io import read_dataframe +from tfscreen.util.cli import read_lines +from tfscreen.util.cli.generalized_main import generalized_main + +_WT_REF_COLS = ["theta_low", "theta_high", "log_hill_K", "hill_n"] + + +def _run_configure_and_prefit(growth_file, binding_file, spiked_file, + base_growth_file, thermo_data, out_prefix, seed): + """Configure a linear/hill_geno model and MAP-calibrate k/m. + + Returns the path to the calibrated priors CSV. Imports the (heavy) + inference stack lazily so the ``--calibration_file`` path stays light. + """ + if binding_file is None: + raise ValueError( + "binding data is required to calibrate the growth linkage; pass " + "--binding_file, or pass --calibration_file to skip configure+prefit.") + + from tfscreen.tfmodel.scripts.configure_model_cli import configure_model + from tfscreen.tfmodel.scripts.prefit_calibration_cli import ( + run_prefit_calibration, + ) + + spiked = read_lines(spiked_file) if spiked_file else None + configure_prefix = f"{out_prefix}_configure" + + print("Configuring model (linear growth, hill_geno theta)...", flush=True) + configure_model( + binding_df=binding_file, + growth_df=growth_file, + base_growth_df=base_growth_file, + spiked=spiked, + thermo_data=thermo_data, + out_prefix=configure_prefix, + ) + + print("Pre-fit calibrating per-condition growth k/m (MAP)...", flush=True) + run_prefit_calibration( + f"{configure_prefix}_config.yaml", + seed=seed, + out_prefix=f"{out_prefix}_prefit", + ) + + # prefit updates the config's priors CSV in place. + return f"{configure_prefix}_priors.csv" + + +def build_empirical(growth_file, + seed, + binding_file=None, + out_prefix="tfs_empirical", + calibration_file=None, + spiked_file=None, + base_growth_file=None, + thermo_data=None, + intercept_cols="replicate", + dk_geno_prior_sd=1.0, + min_obs=None, + drop_railed=True): + """ + Fit real screen data to an empirical phenotype generating distribution. + + Parameters + ---------- + growth_file : str + Processed ``ln_cfu`` CSV (``tfs-process-counts`` output) for real data. + seed : int + Random seed for the pre-fit MAP calibration (positional / required for + reproducibility; ignored when ``--calibration_file`` is supplied). + binding_file : str, optional + Real binding CSV. Required unless ``calibration_file`` is given; it + identifies the growth slope ``m`` from data (the in-library anchors). + out_prefix : str + Output prefix. Writes ``_model.npz`` (+ ``.names.json``), + ``_stage1_fits.csv``, and — unless ``calibration_file`` is + given — the ``_configure_*`` / ``_prefit_*`` intermediates. + calibration_file : str, optional + Skip the configure+prefit step and use this calibration directly — a + prefit priors CSV or a wide ``condition_rep,growth_k,growth_m`` CSV. + Use this to iterate on the Stage-1/2 knobs without re-running the MAP. + spiked_file : str, optional + Text file of spiked genotype names (one per line) forwarded to + ``configure_model``. + base_growth_file : str, optional + Direct growth-rate calibration CSV forwarded to ``configure_model``. + thermo_data : str, optional + Thermodynamic data path forwarded to ``configure_model`` (unused by + the default hill_geno theta). + intercept_cols : str + Comma-separated columns whose unique combinations each get a nuisance + ``ln_cfu0`` (default ``"replicate"``; empty string -> single intercept). + dk_geno_prior_sd : float + Std of the weak Normal prior on ``dk_geno`` (<=0 disables it). + min_obs : int, optional + Skip genotypes with fewer than this many usable observations. + drop_railed : bool + Drop theta-logit-railed Stage-1 fits before the Stage-2 fit. + """ + growth_df = read_dataframe(growth_file) + + icols = [c.strip() for c in str(intercept_cols).split(",") if c.strip()] + + dk_prior = None + if dk_geno_prior_sd is not None and float(dk_geno_prior_sd) > 0: + dk_prior = (0.0, float(dk_geno_prior_sd)) + + # Calibration: reuse a supplied one, or configure+prefit to produce it. + if calibration_file is None: + calibration_file = _run_configure_and_prefit( + growth_file, binding_file, spiked_file, base_growth_file, + thermo_data, out_prefix, seed) + else: + print(f"Using supplied calibration: {calibration_file}", flush=True) + + # Stage 1: fit every measured genotype independently (frozen calibration). + # The calibration path is normalized (prefit priors CSV or wide) inside. + print("Stage 1: fitting each measured genotype independently...", flush=True) + results_df, fits = fit_phenotypes( + growth_df, calibration_file, intercept_cols=icols, + dk_geno_prior=dk_prior, min_obs=min_obs) + + # Stage 2: turn the per-genotype fits into ONE generating distribution + # (deconvolving estimation noise). This distribution is the deliverable. + print(f"Stage 2: building the generating distribution from " + f"{len(fits)} per-genotype fits...", flush=True) + model = fit_population(fits, drop_railed=drop_railed) + + # Embed wt's actual Stage-1 phenotype so the simulation pins wt to its real + # value rather than a resampled/mean draw. + wt_rows = results_df[results_df["genotype"] == "wt"] + if len(wt_rows): + r = wt_rows.iloc[0] + model.wt_ref = {c: float(r[c]) for c in _WT_REF_COLS} + else: + warnings.warn( + "no 'wt' genotype in the Stage-1 fits; wt_ref not set (the " + "simulation will default wt to the population mean).") + + # The model is the ONLY file the simulation needs -- one self-contained JSON. + model_path = os.path.abspath(model.save(f"{out_prefix}_phenotype_model")) + fits_path = os.path.abspath(f"{out_prefix}_stage1_fits.csv") + results_df.to_csv(fits_path, index=False) + + bar = "=" * 72 + print(f"\n{bar}") + print(f"Fit the generating distribution from {model.n_used} genotypes " + f"(loglik={model.loglik:.4g}, {model.n_iter} EM iters).") + print("\n Phenotype model (the distribution tfs-simulate samples from):") + print(f" {model_path}") + print(" Per-genotype Stage-1 fits (diagnostic only, not used downstream):") + print(f" {fits_path}") + print("\nTo simulate from it, add to your tfs-simulate config:") + print(" phenotype_source: empirical") + print(" empirical:") + print(f" phenotype_model: {model_path}") + print("(An absolute path resolves from any directory you run tfs-simulate in.)") + print(bar) + + +def main(): + return generalized_main( + build_empirical, + manual_arg_types={"binding_file": str, "calibration_file": str, + "spiked_file": str, "base_growth_file": str, + "thermo_data": str, "seed": int, "min_obs": int}) diff --git a/src/tfscreen/simulate/selection_experiment.py b/src/tfscreen/simulate/selection_experiment.py index 7856d579..317c1ceb 100644 --- a/src/tfscreen/simulate/selection_experiment.py +++ b/src/tfscreen/simulate/selection_experiment.py @@ -53,6 +53,8 @@ # Phenotype / theta calculation "theta_component", "thermo_data", "theta_priors", "theta_rescale", "theta_sim_priors", + # Empirical phenotype source (resample from a fitted PopulationModel) + "phenotype_source", "empirical", # Conditions and growth "condition_blocks", "growth", "dk_geno_hyper_loc", "dk_geno_hyper_scale", "dk_geno_hyper_shift", "dk_geno_zero", diff --git a/src/tfscreen/simulate/thermo_to_growth.py b/src/tfscreen/simulate/thermo_to_growth.py index 577d5aef..3f0642fd 100644 --- a/src/tfscreen/simulate/thermo_to_growth.py +++ b/src/tfscreen/simulate/thermo_to_growth.py @@ -308,6 +308,7 @@ def thermo_to_growth( theta_rescale: str = "passthrough", theta_gc_override: Optional[dict] = None, theta_params_override: Optional[dict] = None, + dk_geno_override: Optional[dict] = None, ) -> tuple[pd.DataFrame, pd.DataFrame]: """ Generate phenotypes from genotypes via prior-predictive theta sampling. @@ -401,6 +402,14 @@ def thermo_to_growth( corresponding rows in ``parameters_df`` are updated so that the saved CSV reflects what was actually used in the simulation rather than the prior-predictive sample. + dk_geno_override : dict[str, float] or None, default None + Per-genotype pleiotropic growth effect overrides. Keys are genotype + strings; values replace the stochastically drawn ``dk_geno`` for that + genotype (applied before it is written into both ``phenotype_df`` and + ``parameters_df``). Used by the empirical-phenotype pipeline to inject + resampled ``dk_geno`` values alongside ``theta_gc_override`` / + ``theta_params_override``; genotypes absent from the dict keep their + drawn (or wt-pinned) value. Returns ------- @@ -562,6 +571,15 @@ def thermo_to_growth( dk_geno_hyper_shift, rng, fixed_value=0.0 if dk_geno_zero else None, ) + + # Inject resampled dk_geno for the empirical-phenotype pipeline. Applied + # to the per-genotype series so both phenotype_df and parameters_df below + # pick up the override. + if dk_geno_override: + for g, val in dk_geno_override.items(): + if g in genotype_dk_geno_series.index: + genotype_dk_geno_series[g] = float(val) + phenotype_df["dk_geno"] = phenotype_df["genotype"].map(genotype_dk_geno_series) if activity_component not in _ACTIVITY_COMPONENTS: diff --git a/tests/tfscreen/simulate/empirical/test_build_empirical_cli.py b/tests/tfscreen/simulate/empirical/test_build_empirical_cli.py new file mode 100644 index 00000000..bb8b57bd --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_build_empirical_cli.py @@ -0,0 +1,169 @@ +"""End-to-end test for the tfs-build-empirical CLI (Stages 1-2).""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.empirical.fit_phenotypes import _hill_theta +from tfscreen.simulate.empirical.population import PopulationModel +from tfscreen.simulate.scripts.build_empirical_cli import build_empirical + +_CALIB = pd.DataFrame({ + "condition_rep": ["outgrowth", "kan", "phes"], + "growth_k": [0.02, 0.0, 0.0], + "growth_m": [0.0, -0.03, -0.06], +}) +_KM = {r["condition_rep"]: (r["growth_k"], r["growth_m"]) + for _, r in _CALIB.iterrows()} + + +def _priors_calib_df(): + """Prefit priors CSV (long form) with the same k/m as _CALIB.""" + rows = [] + for i, r in _CALIB.reset_index(drop=True).iterrows(): + rows.append({"parameter": "growth.condition_growth.k_loc", + "value": r["growth_k"], "flat_index": i, + "condition_rep": r["condition_rep"]}) + rows.append({"parameter": "growth.condition_growth.m_loc", + "value": r["growth_m"], "flat_index": i, + "condition_rep": r["condition_rep"]}) + return pd.DataFrame(rows) + +# 11 genotypes (> D+1 = 6, required by the Stage-2 population fit). +_GENOS = ["wt", "A1V", "L5P", "G7R", "K2E", "D9N", + "T3S", "V4M", "R6Q", "E8A", "N10D"] +_CONCS = [0.0, 1e-3, 1e-2, 1e-1] +_T_PRE = 5.0 +_T_SELS = [0.0, 2.0, 4.0] +_REPS = [1, 2] +_LN_CFU0 = {1: 10.0, 2: 10.4} + + +def _draw_truth(rng): + truth = {} + for g in _GENOS: + if g == "wt": + truth[g] = dict(theta_low=0.9, theta_high=0.05, + log_K=np.log(0.017), n=1.5, dk=0.0) + else: + truth[g] = dict( + theta_low=rng.uniform(0.6, 0.95), + theta_high=rng.uniform(0.02, 0.3), + log_K=rng.normal(np.log(0.02), 0.4), + n=rng.uniform(0.8, 2.0), + dk=rng.normal(0.0, 0.005)) + return truth + + +def _build_growth_df(seed=0): + rng = np.random.default_rng(seed) + truth = _draw_truth(rng) + rows = [] + for g, p in truth.items(): + for rep in _REPS: + for conc in _CONCS: + theta = _hill_theta(conc, p["theta_low"], p["theta_high"], + p["log_K"], p["n"]) + for cond_sel in ["outgrowth", "kan", "phes"]: + k_pre, m_pre = _KM["outgrowth"] + k_sel, m_sel = _KM[cond_sel] + r_pre = k_pre + p["dk"] + m_pre * theta + r_sel = k_sel + p["dk"] + m_sel * theta + for t_sel in _T_SELS: + ln_cfu = (_LN_CFU0[rep] + r_pre * _T_PRE + + r_sel * t_sel + rng.normal(0.0, 0.02)) + rows.append({ + "genotype": g, "titrant_name": "iptg", + "titrant_conc": conc, + "condition_pre": "outgrowth", + "condition_sel": cond_sel, + "t_pre": _T_PRE, "t_sel": t_sel, "replicate": rep, + "ln_cfu": ln_cfu, "ln_cfu_std": 0.1}) + return pd.DataFrame(rows) + + +def test_cli_writes_model_with_wt_ref(tmp_path): + growth_csv = tmp_path / "growth.csv" + calib_csv = tmp_path / "calib.csv" + _build_growth_df().to_csv(growth_csv, index=False) + # Feed the prefit *priors* CSV directly (long form) — the CLI reshapes it. + _priors_calib_df().to_csv(calib_csv, index=False) + + out_prefix = str(tmp_path / "emp") + build_empirical(str(growth_csv), seed=0, + calibration_file=str(calib_csv), + out_prefix=out_prefix) + + # Both artifacts written (model is a single self-contained JSON). + assert (tmp_path / "emp_phenotype_model.json").exists() + assert (tmp_path / "emp_stage1_fits.csv").exists() + + model = PopulationModel.load(out_prefix + "_phenotype_model") + assert model.n_used >= 6 + # wt_ref embedded from wt's actual Stage-1 fit. + assert model.wt_ref is not None + assert set(model.wt_ref) == {"theta_low", "theta_high", + "log_hill_K", "hill_n"} + # wt fit should be near its true reference phenotype. + assert model.wt_ref["theta_low"] == pytest.approx(0.9, abs=0.1) + + # Stage-1 fits CSV has a row per genotype. + fits_df = pd.read_csv(out_prefix + "_stage1_fits.csv") + assert set(fits_df["genotype"]) == set(_GENOS) + + +def test_cli_orchestrates_configure_and_prefit(mocker, tmp_path): + """Without --calibration_file, the CLI runs configure_model + prefit.""" + growth_csv = tmp_path / "growth.csv" + binding_csv = tmp_path / "binding.csv" + _build_growth_df().to_csv(growth_csv, index=False) + binding_csv.write_text( + "genotype,titrant_name,titrant_conc,theta_obs,theta_std\n") + + out_prefix = str(tmp_path / "emp") + priors_path = f"{out_prefix}_configure_priors.csv" + + def fake_configure(**kwargs): + # Stand in for configure_model + prefit having written a calibrated + # priors CSV at the config's priors_file location. + _priors_calib_df().to_csv(priors_path, index=False) + + conf = mocker.patch( + "tfscreen.tfmodel.scripts.configure_model_cli.configure_model", + side_effect=fake_configure) + prefit = mocker.patch( + "tfscreen.tfmodel.scripts.prefit_calibration_cli.run_prefit_calibration") + + spiked_file = tmp_path / "spiked.txt" + spiked_file.write_text("wt\nA1V\n") + + build_empirical( + str(growth_csv), binding_file=str(binding_csv), out_prefix=out_prefix, + spiked_file=str(spiked_file), seed=5) + + # configure_model wired with the experimental inputs and fixed prefix. + conf.assert_called_once() + _, ckw = conf.call_args + assert ckw["binding_df"] == str(binding_csv) + assert ckw["growth_df"] == str(growth_csv) + assert ckw["out_prefix"] == f"{out_prefix}_configure" + assert ckw["spiked"] == ["wt", "A1V"] + + # prefit called on the produced config with the seed. + prefit.assert_called_once() + pargs, pkw = prefit.call_args + assert pargs[0] == f"{out_prefix}_configure_config.yaml" + assert pkw["seed"] == 5 + + # Full pipeline produced the model with wt_ref. + assert (tmp_path / "emp_phenotype_model.json").exists() + model = PopulationModel.load(out_prefix + "_phenotype_model") + assert model.wt_ref is not None + + +def test_cli_requires_binding_or_calibration(tmp_path): + growth_csv = tmp_path / "growth.csv" + _build_growth_df().to_csv(growth_csv, index=False) + with pytest.raises(ValueError, match="binding data is required"): + build_empirical(str(growth_csv), seed=0, + out_prefix=str(tmp_path / "emp")) diff --git a/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py b/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py new file mode 100644 index 00000000..e910cb80 --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py @@ -0,0 +1,214 @@ +"""Tests for the Stage-1 per-genotype phenotype fitter.""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.empirical.fit_phenotypes import ( + _hill_theta, + fit_phenotypes, + fit_one_genotype, + _build_calib_lookup, + read_calibration, +) + +# Frozen calibration: two selective markers with *different* m so that +# dk_geno is separable from theta_low; one non-selective outgrowth. +CALIB = pd.DataFrame({ + "condition_rep": ["outgrowth", "kan", "phes"], + "growth_k": [0.02, 0.0, 0.0], + "growth_m": [0.0, -0.03, -0.06], +}) +_K_MAP, _M_MAP = _build_calib_lookup(CALIB) + +# Ground-truth phenotype for a couple of genotypes. +TRUTH = { + "wt": dict(theta_low=0.90, theta_high=0.08, log_K=np.log(3e-3), + n=1.4, dk_geno=0.000), + "A1V": dict(theta_low=0.70, theta_high=0.20, log_K=np.log(3e-2), + n=1.0, dk_geno=0.006), +} +LN_CFU0 = {1: 10.0, 2: 10.5} # per-replicate starting abundance + +CONCS = [0.0, 1e-4, 1e-3, 1e-2, 1e-1, 1.0] +T_PRE = 5.0 +T_SELS = [0.0, 2.0, 4.0] +REPS = [1, 2] + + +def _build_growth_df(noise_sd=0.0, seed=0): + """Synthesize a real-shaped ln_cfu DataFrame from TRUTH.""" + rng = np.random.default_rng(seed) + rows = [] + for geno, p in TRUTH.items(): + for rep in REPS: + for conc in CONCS: + theta = _hill_theta(conc, p["theta_low"], p["theta_high"], + p["log_K"], p["n"]) + for cond_sel in ["outgrowth", "kan", "phes"]: + k_pre, m_pre = _K_MAP["outgrowth"], _M_MAP["outgrowth"] + k_sel, m_sel = _K_MAP[cond_sel], _M_MAP[cond_sel] + rate_pre = k_pre + p["dk_geno"] + m_pre * theta + rate_sel = k_sel + p["dk_geno"] + m_sel * theta + for t_sel in T_SELS: + ln_cfu = (LN_CFU0[rep] + + rate_pre * T_PRE + + rate_sel * t_sel) + ln_cfu += rng.normal(0.0, noise_sd) + rows.append({ + "genotype": geno, "titrant_name": "iptg", + "titrant_conc": conc, + "condition_pre": "outgrowth", + "condition_sel": cond_sel, + "t_pre": T_PRE, "t_sel": t_sel, + "replicate": rep, + "ln_cfu": ln_cfu, "ln_cfu_std": 0.1, + }) + return pd.DataFrame(rows) + + +def _priors_calib_df(): + """A prefit priors CSV (long form) carrying the same k/m as CALIB.""" + rows = [] + for i, r in CALIB.reset_index(drop=True).iterrows(): + rows.append({"parameter": "growth.condition_growth.k_loc", + "value": r["growth_k"], "flat_index": i, + "condition_rep": r["condition_rep"]}) + rows.append({"parameter": "growth.condition_growth.m_loc", + "value": r["growth_m"], "flat_index": i, + "condition_rep": r["condition_rep"]}) + # An unrelated scalar prior row that must be ignored. + rows.append({"parameter": "dk_geno_hyper_loc", "value": -3.5, + "flat_index": np.nan, "condition_rep": np.nan}) + return pd.DataFrame(rows) + + +def test_read_calibration_from_priors_csv(): + wide = read_calibration(_priors_calib_df()) + assert list(wide.columns) == ["condition_rep", "growth_k", "growth_m"] + w = wide.set_index("condition_rep") + assert w.loc["outgrowth", "growth_k"] == pytest.approx(0.02) + assert w.loc["kan", "growth_m"] == pytest.approx(-0.03) + assert w.loc["phes", "growth_m"] == pytest.approx(-0.06) + + +def test_read_calibration_wide_passthrough(): + wide = read_calibration(CALIB) + assert list(wide.columns) == ["condition_rep", "growth_k", "growth_m"] + assert wide.set_index("condition_rep").loc["kan", "growth_m"] == pytest.approx(-0.03) + + +def test_read_calibration_priors_missing_rows_raises(): + bad = pd.DataFrame({"parameter": ["something_else"], "value": [1.0], + "condition_rep": ["kan"]}) + with pytest.raises(ValueError, match="priors CSV has no"): + read_calibration(bad) + + +def test_read_calibration_unrecognized_raises(): + with pytest.raises(ValueError, match="calibration must be"): + read_calibration(pd.DataFrame({"foo": [1]})) + + +def test_build_calib_lookup_from_priors_matches_wide(): + k_p, m_p = _build_calib_lookup(_priors_calib_df()) + k_w, m_w = _build_calib_lookup(CALIB) + assert k_p == pytest.approx(k_w) + assert m_p == pytest.approx(m_w) + + +def test_fit_phenotypes_accepts_priors_calibration(): + df = _build_growth_df(noise_sd=0.0) + results, _ = fit_phenotypes(df, _priors_calib_df(), dk_geno_prior=None, + progress=False) + res = results.set_index("genotype") + for geno, p in TRUTH.items(): + assert res.loc[geno, "theta_low"] == pytest.approx(p["theta_low"], + abs=1e-3) + + +def test_fit_phenotypes_accepts_ln_cfu_var_only(): + """Real tfs-process-counts output has ln_cfu_var (not ln_cfu_std).""" + df = _build_growth_df(noise_sd=0.0) + df["ln_cfu_var"] = df["ln_cfu_std"] ** 2 + df = df.drop(columns=["ln_cfu_std"]) # mirror the processed CSV shape + + results, _ = fit_phenotypes(df, CALIB, dk_geno_prior=None, progress=False) + res = results.set_index("genotype") + assert res.loc["wt", "theta_low"] == pytest.approx( + TRUTH["wt"]["theta_low"], abs=1e-3) + + +def test_noiseless_roundtrip_recovers_truth(): + """With no observation noise the fit should recover the true params.""" + df = _build_growth_df(noise_sd=0.0) + results, fits = fit_phenotypes(df, CALIB, dk_geno_prior=None, + progress=False) + + assert set(results["genotype"]) == set(TRUTH) + assert results["converged"].all() + + res = results.set_index("genotype") + for geno, p in TRUTH.items(): + assert res.loc[geno, "theta_low"] == pytest.approx(p["theta_low"], + abs=1e-3) + assert res.loc[geno, "theta_high"] == pytest.approx(p["theta_high"], + abs=1e-3) + assert res.loc[geno, "log_hill_K"] == pytest.approx(p["log_K"], + abs=2e-2) + assert res.loc[geno, "hill_n"] == pytest.approx(p["n"], abs=3e-2) + assert res.loc[geno, "dk_geno"] == pytest.approx(p["dk_geno"], + abs=2e-3) + + +def test_noisy_fit_within_tolerance_and_reports_covariance(): + """Small noise: point estimates near truth, covariance is finite/PSD.""" + df = _build_growth_df(noise_sd=0.02, seed=7) + results, fits = fit_phenotypes(df, CALIB, progress=False) + + res = results.set_index("genotype") + for geno, p in TRUTH.items(): + assert res.loc[geno, "theta_low"] == pytest.approx(p["theta_low"], + abs=0.08) + assert res.loc[geno, "theta_high"] == pytest.approx(p["theta_high"], + abs=0.08) + + # Covariance is in transformed space, finite, and positive on the diagonal. + gf = fits[("wt", "iptg")] + cov_pheno = gf.cov_t[gf.pheno_slice, gf.pheno_slice] + assert np.all(np.isfinite(cov_pheno)) + assert np.all(np.diag(cov_pheno) > 0) + + +def test_theta_bounds_stay_in_unit_interval(): + """The logit parameterization must keep theta_low/high inside (0, 1).""" + df = _build_growth_df(noise_sd=0.05, seed=3) + results, _ = fit_phenotypes(df, CALIB, progress=False) + for col in ("theta_low", "theta_high"): + assert (results[col] > 0).all() + assert (results[col] < 1).all() + + +def test_missing_calibration_condition_fails_fast(): + """A condition absent from the calibration table raises a clear error.""" + df = _build_growth_df(noise_sd=0.0) + bad_calib = CALIB[CALIB["condition_rep"] != "phes"] + with pytest.raises(ValueError, match="absent from the calibration"): + fit_phenotypes(df, bad_calib, progress=False) + + +def test_dead_rows_are_dropped(): + """NaN ln_cfu / non-positive std rows are excluded from the fit.""" + df = _build_growth_df(noise_sd=0.0) + n_full = len(df[df["genotype"] == "wt"]) + df.loc[df["genotype"] == "wt", "ln_cfu"] = df.loc[ + df["genotype"] == "wt", "ln_cfu"].copy() + # Kill five wt observations. + wt_idx = df.index[df["genotype"] == "wt"][:5] + df.loc[wt_idx, "ln_cfu"] = np.nan + + gf = fit_one_genotype( + df[df["genotype"] == "wt"], _K_MAP, _M_MAP, + intercept_cols=["replicate"], dk_geno_prior=None) + assert gf.n_obs == n_full - 5 + assert gf.converged diff --git a/tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py b/tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py new file mode 100644 index 00000000..08244db2 --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py @@ -0,0 +1,195 @@ +"""Integration test for the phenotype_source=empirical branch of library_prediction.""" + +import numpy as np +import pandas as pd +from unittest.mock import MagicMock + +import pytest + +import tfscreen.util +from tfscreen.simulate.library_prediction import ( + library_prediction, _resolve_phenotype_model_path, +) +from tfscreen.simulate.empirical.fit_phenotypes import ( + PHENO_PARAMS_TRANSFORMED, PHENO_PARAMS_NATURAL, +) +from tfscreen.simulate.empirical.population import PopulationModel + + +def _make_model(): + mu = np.array([0.005, 1.2, -1.2, np.log(0.02), np.log(1.3)]) + cov = np.diag([1e-4, 0.2, 0.2, 0.1, 0.05]) + return PopulationModel( + param_names_t=list(PHENO_PARAMS_TRANSFORMED), + param_names_natural=list(PHENO_PARAMS_NATURAL), + mu=mu, cov=cov, n_used=100, + wt_ref={"theta_low": 0.99, "theta_high": 0.01, + "log_hill_K": np.log(0.017), "hill_n": 2.0}) + + +def test_resolve_phenotype_model_path(tmp_path): + # CLI saves a single _phenotype_model.json. + saved = _make_model().save(str(tmp_path / "emp_phenotype_model")) + assert saved.endswith(".json") + model_json = str(tmp_path / "emp_phenotype_model.json") + + # Bare out_prefix resolves via the _phenotype_model.json convenience... + assert _resolve_phenotype_model_path(str(tmp_path / "emp")) == model_json + # ...the .json path works directly... + assert _resolve_phenotype_model_path(model_json) == model_json + # ...and without the extension. + assert (_resolve_phenotype_model_path(str(tmp_path / "emp_phenotype_model")) + == model_json) + + +def test_resolve_phenotype_model_path_missing_raises(tmp_path): + with pytest.raises(FileNotFoundError, match="No phenotype model file"): + _resolve_phenotype_model_path(str(tmp_path / "nope")) + + +def test_library_prediction_empirical_injects_overrides(mocker, tmp_path): + model = _make_model() + model.save(str(tmp_path / "pop_model")) + + cf = { + "condition_blocks": [{"b": 1}], + "theta_component": "hill_geno", + "seed": 3, + "thermo_data": None, + "growth": {"cond": {"m": 1.0, "b": 0.0}}, + "dk_geno_hyper_loc": -3.5, + "dk_geno_hyper_scale": 1.0, + "dk_geno_hyper_shift": 0.02, + "phenotype_source": "empirical", + "empirical": {"phenotype_model": str(tmp_path / "pop_model")}, + } + mocker.patch("tfscreen.util.read_yaml", return_value=cf) + + lm = mocker.patch( + "tfscreen.simulate.library_prediction.library_manager.LibraryManager") + lm.return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt", "A1B", "C2D"]}) + + mocker.patch( + "tfscreen.simulate.library_prediction.build_sample_dataframes", + return_value=pd.DataFrame({"titrant_conc": [0.0, 1.0]})) + + sim_data = MagicMock() + sim_data.log_titrant_conc = np.log(np.array([1e-20, 1.0])) + mocker.patch("tfscreen.simulate.library_prediction.build_sim_data", + return_value=sim_data) + + thermo = mocker.patch( + "tfscreen.simulate.library_prediction.thermo_to_growth", + return_value=(pd.DataFrame({"theta": [0.5]}), + pd.DataFrame({"genotype": ["wt"]}), + pd.DataFrame({"genotype": ["wt", "A1B", "C2D"], + "dk_geno": [0.0, 0.0, 0.0], + "activity": [1.0, 1.0, 1.0]}))) + mocker.patch("tfscreen.simulate.library_prediction.jax.random.PRNGKey", + return_value="k") + + library_prediction(cf="config.yaml") + + _, kwargs = thermo.call_args + + # Empirical overrides were built for every genotype and threaded through. + assert set(kwargs["theta_gc_override"]) == {"wt", "A1B", "C2D"} + assert set(kwargs["dk_geno_override"]) == {"wt", "A1B", "C2D"} + assert all(len(v) == 2 for v in kwargs["theta_gc_override"].values()) + + # wt is pinned to dk_geno == 0. + assert kwargs["dk_geno_override"]["wt"] == 0.0 + + # Activity forced to fixed unit (A absorbed into fitted theta). + assert kwargs["activity_component"] == "fixed" + assert kwargs["activity_wt"] == 1.0 + assert kwargs["activity_mut_scale"] == 0.0 + + # theta_component forced to hill_geno; theta prior overrides dropped. + assert kwargs["theta_component"] == "hill_geno" + assert kwargs["theta_priors_overrides"] is None + assert kwargs["theta_sim_priors_overrides"] is None + + +def test_simulate_known_keys_include_empirical(): + from tfscreen.simulate.selection_experiment import SIMULATE_KNOWN_KEYS + assert "phenotype_source" in SIMULATE_KNOWN_KEYS + assert "empirical" in SIMULATE_KNOWN_KEYS + + +def test_empirical_forces_hill_geno_and_warns(mocker, tmp_path): + _make_model().save(str(tmp_path / "pop_model")) + cf = { + "condition_blocks": [{"b": 1}], + "theta_component": "hill_mut", # will be forced to hill_geno + "theta_sim_priors": {"epi_tau_scale": 0.1}, # hill_mut-only; dropped + "seed": 3, + "thermo_data": None, + "growth": {"cond": {"m": 1.0, "b": 0.0}}, + "dk_geno_hyper_loc": -3.5, + "dk_geno_hyper_scale": 1.0, + "dk_geno_hyper_shift": 0.02, + "phenotype_source": "empirical", + "empirical": {"phenotype_model": str(tmp_path / "pop_model")}, + } + mocker.patch("tfscreen.util.read_yaml", return_value=cf) + lm = mocker.patch( + "tfscreen.simulate.library_prediction.library_manager.LibraryManager") + lm.return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt", "A1B"]}) + mocker.patch( + "tfscreen.simulate.library_prediction.build_sample_dataframes", + return_value=pd.DataFrame({"titrant_conc": [0.0, 1.0]})) + sim_data = MagicMock() + sim_data.log_titrant_conc = np.log(np.array([1e-20, 1.0])) + mocker.patch("tfscreen.simulate.library_prediction.build_sim_data", + return_value=sim_data) + thermo = mocker.patch( + "tfscreen.simulate.library_prediction.thermo_to_growth", + return_value=(pd.DataFrame({"theta": [0.5]}), + pd.DataFrame({"genotype": ["wt"]}), + pd.DataFrame({"genotype": ["wt", "A1B"], + "dk_geno": [0.0, 0.0], + "activity": [1.0, 1.0]}))) + mocker.patch("tfscreen.simulate.library_prediction.jax.random.PRNGKey", + return_value="k") + + with pytest.warns(UserWarning, match="forces theta_component=hill_geno"): + library_prediction(cf="config.yaml") + + _, kwargs = thermo.call_args + assert kwargs["theta_component"] == "hill_geno" + assert kwargs["theta_sim_priors_overrides"] is None + + +def test_empirical_requires_model_path(mocker): + cf = { + "condition_blocks": [{"b": 1}], + "theta_component": "hill_geno", + "seed": 3, + "thermo_data": None, + "growth": {"cond": {"m": 1.0, "b": 0.0}}, + "dk_geno_hyper_loc": -3.5, + "dk_geno_hyper_scale": 1.0, + "dk_geno_hyper_shift": 0.02, + "phenotype_source": "empirical", + # no 'empirical' block + } + mocker.patch("tfscreen.util.read_yaml", return_value=cf) + lm = mocker.patch( + "tfscreen.simulate.library_prediction.library_manager.LibraryManager") + lm.return_value.build_library_df.return_value = pd.DataFrame( + {"genotype": ["wt", "A1B"]}) + mocker.patch( + "tfscreen.simulate.library_prediction.build_sample_dataframes", + return_value=pd.DataFrame({"titrant_conc": [0.0, 1.0]})) + sim_data = MagicMock() + sim_data.log_titrant_conc = np.log(np.array([1e-20, 1.0])) + mocker.patch("tfscreen.simulate.library_prediction.build_sim_data", + return_value=sim_data) + mocker.patch("tfscreen.simulate.library_prediction.jax.random.PRNGKey", + return_value="k") + + with pytest.raises(ValueError, match="phenotype_model"): + library_prediction(cf="config.yaml") diff --git a/tests/tfscreen/simulate/empirical/test_population.py b/tests/tfscreen/simulate/empirical/test_population.py new file mode 100644 index 00000000..608ad5f8 --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_population.py @@ -0,0 +1,161 @@ +"""Tests for the Stage-2 measurement-error deconvolution.""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.empirical.fit_phenotypes import ( + GenotypeFit, + PHENO_PARAMS_NATURAL, + _LOGIT_BOUND, +) +from tfscreen.simulate.empirical.population import ( + fit_population, + PopulationModel, + _collect_estimates, +) + +D = 5 +_PLACEHOLDER_NAMES = ["ln_cfu0[0]"] + ["p"] * D + + +def _make_fit(z, S, converged=True): + """Wrap a transformed phenotype vector + covariance as a GenotypeFit. + + One nuisance intercept is prepended so ``pheno_slice`` is slice(1, 6), + mirroring the real Stage-1 layout. + """ + est_t = np.concatenate([[5.0], np.asarray(z, dtype=float)]) + cov_t = np.zeros((D + 1, D + 1)) + cov_t[0, 0] = 0.01 + cov_t[1:, 1:] = S + return GenotypeFit( + genotype="g", titrant_name="iptg", n_obs=100, converged=converged, + param_names_t=_PLACEHOLDER_NAMES, est_t=est_t, cov_t=cov_t, + pheno_slice=slice(1, D + 1)) + + +def _random_psd(rng, scale=0.3): + A = rng.normal(size=(D, D)) * scale + return A @ A.T + 0.05 * np.eye(D) + + +def _make_population(n, mu, sigma, meas_scale, seed=0): + """Simulate n genotypes: true z ~ N(mu, sigma), estimate y ~ N(z, S_i).""" + rng = np.random.default_rng(seed) + Z = rng.multivariate_normal(mu, sigma, size=n) # true phenotypes + fits = {} + S_list = [] + for i in range(n): + # Heteroscedastic diagonal measurement covariance. + s_diag = meas_scale * (0.5 + rng.random(D)) + S = np.diag(s_diag) + y = Z[i] + rng.multivariate_normal(np.zeros(D), S) + fits[(f"g{i}", "iptg")] = _make_fit(y, S) + S_list.append(S) + return fits, np.array(S_list), Z + + +# True generating distribution used across recovery tests. +_MU = np.array([0.0, 1.5, -1.5, np.log(0.01), 0.0]) +_SIGMA = _random_psd(np.random.default_rng(0), scale=0.35) + + +def test_deconvolution_removes_estimation_inflation(): + """Sigma_hat must recover the true pop cov, beating naive Cov(Y).""" + fits, S, Z = _make_population(4000, _MU, _SIGMA, meas_scale=0.25, seed=1) + model = fit_population(fits, drop_railed=False) + + # Reconstruct the naive point-estimate covariance for comparison. + Y = np.array([f.est_t[f.pheno_slice] for f in fits.values()]) + naive_cov = np.cov(Y, rowvar=False) + + def rel(A): + return np.linalg.norm(A - _SIGMA) / np.linalg.norm(_SIGMA) + + # Deconvolved estimate is close to truth... + assert rel(model.cov) < 0.15 + # ...and materially closer than the (inflated) naive covariance. + assert rel(model.cov) < 0.5 * rel(naive_cov) + # The inflation is real: naive diagonal exceeds the true diagonal. + assert np.all(np.diag(naive_cov) > np.diag(_SIGMA)) + # Mean is recovered. + assert model.mu == pytest.approx(_MU, abs=0.05) + + +def test_sampling_matches_fitted_distribution(): + fits, _, _ = _make_population(3000, _MU, _SIGMA, meas_scale=0.2, seed=2) + model = fit_population(fits, drop_railed=False) + + draws = model.sample(20000, rng=7) + assert list(draws.columns) == PHENO_PARAMS_NATURAL + assert (draws["theta_low"] > 0).all() and (draws["theta_low"] < 1).all() + assert (draws["theta_high"] > 0).all() and (draws["theta_high"] < 1).all() + assert (draws["hill_n"] > 0).all() + + # Sample covariance of transformed draws ~ model.cov. + Zt = model.sample_transformed(50000, rng=11) + assert np.allclose(np.cov(Zt, rowvar=False), model.cov, atol=0.05) + + +def test_filters_drop_bad_fits(): + rng = np.random.default_rng(3) + good = {(f"g{i}", "iptg"): _make_fit(rng.normal(size=D) * 0.3 + _MU, + 0.1 * np.eye(D)) + for i in range(30)} + + # Non-converged. + good[("bad_conv", "iptg")] = _make_fit(_MU, 0.1 * np.eye(D), + converged=False) + # Railed theta logit. + railed = _MU.copy() + railed[1] = _LOGIT_BOUND + good[("bad_railed", "iptg")] = _make_fit(railed, 0.1 * np.eye(D)) + # Non-finite covariance. + good[("bad_nan", "iptg")] = _make_fit(_MU, np.full((D, D), np.nan)) + + Y, S, keys = _collect_estimates(good) + assert len(keys) == 30 + assert "bad_conv" not in [k[0] for k in keys] + assert "bad_railed" not in [k[0] for k in keys] + assert "bad_nan" not in [k[0] for k in keys] + + +def test_subset_restricts_fit(): + fits, _, _ = _make_population(200, _MU, _SIGMA, meas_scale=0.2, seed=4) + subset = list(fits.keys())[:50] + model = fit_population(fits, subset=set(subset), drop_railed=False) + assert model.n_used == 50 + + +def test_too_few_fits_raises(): + fits, _, _ = _make_population(3, _MU, _SIGMA, meas_scale=0.2, seed=5) + with pytest.raises(ValueError, match="usable fits"): + fit_population(fits, drop_railed=False) + + +def test_save_load_roundtrip(tmp_path): + fits, _, _ = _make_population(500, _MU, _SIGMA, meas_scale=0.2, seed=6) + model = fit_population(fits, drop_railed=False) + + path = tmp_path / "pop" + model.save(str(path)) + loaded = PopulationModel.load(str(path)) + + assert np.allclose(loaded.mu, model.mu) + assert np.allclose(loaded.cov, model.cov) + assert loaded.param_names_natural == model.param_names_natural + assert loaded.n_used == model.n_used + + +def test_wt_ref_roundtrip(tmp_path): + fits, _, _ = _make_population(300, _MU, _SIGMA, meas_scale=0.2, seed=8) + model = fit_population(fits, drop_railed=False) + model.wt_ref = {"theta_low": 0.99, "theta_high": 0.01, + "log_hill_K": np.log(0.017), "hill_n": 2.0} + + path = tmp_path / "pop" + model.save(str(path)) + loaded = PopulationModel.load(str(path)) + + assert loaded.wt_ref == model.wt_ref diff --git a/tests/tfscreen/simulate/empirical/test_resample.py b/tests/tfscreen/simulate/empirical/test_resample.py new file mode 100644 index 00000000..4b780a27 --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_resample.py @@ -0,0 +1,260 @@ +"""Tests for Stage-3 resampling and override injection.""" + +import dataclasses +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.empirical.fit_phenotypes import ( + PHENO_PARAMS_TRANSFORMED, + PHENO_PARAMS_NATURAL, +) +from tfscreen.simulate.empirical.population import PopulationModel +from tfscreen.simulate.empirical.resample import ( + resample_phenotypes, + build_overrides, + make_empirical_overrides, + build_empirical_binding_theta, + population_mean_params, + _HILL_COLS, +) +from tfscreen.simulate.binding_params import _hill_theta +from tfscreen.simulate.thermo_to_growth import thermo_to_growth + + +def _make_model(): + mu = np.array([0.005, 1.2, -1.2, np.log(0.02), np.log(1.3)]) + cov = np.diag([1e-4, 0.2, 0.2, 0.1, 0.05]) + return PopulationModel( + param_names_t=list(PHENO_PARAMS_TRANSFORMED), + param_names_natural=list(PHENO_PARAMS_NATURAL), + mu=mu, cov=cov, n_used=100) + + +GENOS = ["wt", "A1B", "A1B/C2D", "E3F"] + + +# --------------------------------------------------------------------------- +# resample_phenotypes +# --------------------------------------------------------------------------- + +def test_resample_columns_and_wt_pinned(): + model = _make_model() + df = resample_phenotypes(model, GENOS, rng=0) + + assert list(df.columns) == ["genotype", "dk_geno"] + _HILL_COLS + assert len(df) == len(GENOS) + # wt is first and pinned to dk_geno == 0. + assert df.iloc[0]["genotype"] == "wt" + assert df.iloc[0]["dk_geno"] == 0.0 + # wt Hill params default to the population mean. + mean = population_mean_params(model) + for c in _HILL_COLS: + assert df.iloc[0][c] == pytest.approx(mean[c]) + + +def test_resample_theta_in_unit_interval_and_reproducible(): + model = _make_model() + df1 = resample_phenotypes(model, GENOS, rng=42) + df2 = resample_phenotypes(model, GENOS, rng=42) + + pd.testing.assert_frame_equal(df1, df2) + assert (df1["theta_low"] > 0).all() and (df1["theta_low"] < 1).all() + assert (df1["theta_high"] > 0).all() and (df1["theta_high"] < 1).all() + assert (df1["hill_n"] > 0).all() + + +def test_resample_explicit_wt_ref(): + model = _make_model() + wt_ref = {"theta_low": 0.99, "theta_high": 0.01, + "log_hill_K": np.log(0.017), "hill_n": 2.0} + df = resample_phenotypes(model, ["wt", "A1B"], rng=1, wt_ref=wt_ref) + wt = df[df["genotype"] == "wt"].iloc[0] + assert wt["theta_low"] == pytest.approx(0.99) + assert wt["hill_n"] == pytest.approx(2.0) + assert wt["dk_geno"] == 0.0 + + +def test_resample_no_wt(): + model = _make_model() + df = resample_phenotypes(model, ["A1B", "C2D"], rng=0) + assert "wt" not in df["genotype"].values + assert len(df) == 2 + + +# --------------------------------------------------------------------------- +# build_overrides +# --------------------------------------------------------------------------- + +def test_build_overrides_structure(): + model = _make_model() + df = resample_phenotypes(model, GENOS, rng=3) + log_conc = np.log(np.array([10.0, 100.0])) + + gc_over, params_over, dk_over = build_overrides(df, log_conc) + + assert set(gc_over) == set(GENOS) + assert set(params_over) == set(GENOS) + assert set(dk_over) == set(GENOS) + # theta arrays have one entry per concentration. + for g in GENOS: + assert gc_over[g].shape == (2,) + assert set(params_over[g]) == set(_HILL_COLS) + # dk_geno override values equal the resampled dk_geno. + for _, row in df.iterrows(): + assert dk_over[row["genotype"]] == pytest.approx(row["dk_geno"]) + # theta_gc_override equals the Hill curve of the resampled params. + a1b = df[df["genotype"] == "A1B"].iloc[0] + expected = _hill_theta(a1b["theta_low"], a1b["theta_high"], + a1b["log_hill_K"], a1b["hill_n"], log_conc) + assert np.allclose(gc_over["A1B"], expected) + + +# --------------------------------------------------------------------------- +# build_empirical_binding_theta +# --------------------------------------------------------------------------- + +_BINDING_CONCS = [0.0, 0.01, 1.0] +_SPIKED = ["wt", "A1B", "A1B/C2D"] + + +def _binding_cfg(spiked_block): + return {"titrant_name": "IPTG", "titrant_conc": _BINDING_CONCS, + "noise": 0.05, "spiked_binding": spiked_block} + + +def test_binding_none_when_no_spiked_block(): + model = _make_model() + pheno = resample_phenotypes(model, _SPIKED, rng=0) + cfg = {"titrant_name": "IPTG", "titrant_conc": _BINDING_CONCS} + assert build_empirical_binding_theta(pheno, cfg, _SPIKED, + np.random.default_rng(0)) is None + + +def test_binding_random_selection(): + model = _make_model() + pheno = resample_phenotypes(model, _SPIKED, rng=0) + cfg = _binding_cfg({"choose_by": "random", "num": 2}) + df = build_empirical_binding_theta(pheno, cfg, _SPIKED, + np.random.default_rng(1)) + + assert list(df.columns) == ["genotype", "titrant_name", "titrant_conc", + "theta_true"] + chosen = set(df["genotype"].unique()) + assert len(chosen) == 2 + assert chosen <= set(_SPIKED) + # noise-free: theta_true equals the resampled Hill curve. + from tfscreen.simulate.binding_params import _hill_theta, _to_log_conc + g = next(iter(chosen)) + r = pheno.set_index("genotype").loc[g] + expected = _hill_theta(r["theta_low"], r["theta_high"], r["log_hill_K"], + r["hill_n"], _to_log_conc(np.array(_BINDING_CONCS))) + got = df[df["genotype"] == g].sort_values("titrant_conc")["theta_true"] + assert np.allclose(got.to_numpy(), expected) + + +def test_binding_stratified_selection(): + model = _make_model() + pheno = resample_phenotypes(model, _SPIKED, rng=2) + cfg = _binding_cfg({"choose_by": "stratified", "num": 2}) + df = build_empirical_binding_theta(pheno, cfg, _SPIKED, + np.random.default_rng(2)) + assert set(df["genotype"].unique()) <= set(_SPIKED) + assert len(df["genotype"].unique()) == 2 + + +def test_binding_file_selection(tmp_path): + model = _make_model() + pheno = resample_phenotypes(model, _SPIKED, rng=3) + # File lists genotypes (params ignored — theta comes from resampled). + csv = tmp_path / "spiked.csv" + csv.write_text( + "genotype,theta_low,theta_high,log_hill_K,hill_n\n" + "wt,0.9,0.1,-4.0,1.0\n" + "A1B,0.8,0.2,-4.0,1.0\n") + cfg = _binding_cfg({"choose_by": str(csv)}) + df = build_empirical_binding_theta(pheno, cfg, _SPIKED, + np.random.default_rng(3)) + assert set(df["genotype"].unique()) == {"wt", "A1B"} + + +def test_binding_file_rejects_non_spiked(tmp_path): + model = _make_model() + pheno = resample_phenotypes(model, ["wt", "A1B", "Z9Y"], rng=4) + csv = tmp_path / "bad.csv" + csv.write_text( + "genotype,theta_low,theta_high,log_hill_K,hill_n\n" + "Z9Y,0.9,0.1,-4.0,1.0\n") + cfg = _binding_cfg({"choose_by": str(csv)}) + with pytest.raises(ValueError, match="must be spiked"): + build_empirical_binding_theta(pheno, cfg, ["wt", "A1B"], + np.random.default_rng(4)) + + +# --------------------------------------------------------------------------- +# Integration through thermo_to_growth (exercises dk_geno_override hook) +# --------------------------------------------------------------------------- + +@dataclasses.dataclass +class _FakeThetaParam: + """Minimal ThetaParam-like carrier so _theta_param_to_df extracts columns.""" + theta_low: np.ndarray + theta_high: np.ndarray + log_hill_K: np.ndarray + hill_n: np.ndarray + + +def test_injection_through_thermo_to_growth(mocker): + model = _make_model() + genotypes = ["wt", "A1B", "A1B/C2D"] + concs = np.array([10.0, 100.0]) + log_conc = np.log(concs) + + pheno_df, gc_over, params_over, dk_over = make_empirical_overrides( + model, genotypes, log_conc, rng=5) + + # Mock the prior-predictive draw: theta_gc placeholder (overwritten by the + # override) + a theta_param exposing the four Hill fields (T=1, G=3). + G = len(genotypes) + theta_gc = np.full((G, len(concs)), 0.5) + fake_param = _FakeThetaParam( + theta_low=np.zeros((1, G)), theta_high=np.zeros((1, G)), + log_hill_K=np.zeros((1, G)), hill_n=np.zeros((1, G))) + mocker.patch( + "tfscreen.simulate.thermo_to_growth.sample_theta_prior", + return_value=(theta_gc, fake_param)) + + sample_df = pd.DataFrame({ + "condition_pre": ["M9", "M9"], + "condition_sel": ["M9+Ab", "M9+Ab"], + "titrant_name": ["IPTG", "IPTG"], + "titrant_conc": concs, + }) + growth_params = {"M9": {"m": 0.001, "b": 0.020}, + "M9+Ab": {"m": -0.010, "b": 0.005}} + sim_data = mocker.MagicMock() + sim_data.titrant_conc = concs + + _, genotype_theta_df, parameters_df = thermo_to_growth( + genotypes=genotypes, sim_data=sim_data, sample_df=sample_df, + theta_component="mock", theta_rng_key=0, growth_params=growth_params, + theta_gc_override=gc_over, theta_params_override=params_over, + dk_geno_override=dk_over) + + pdf = parameters_df.set_index("genotype") + pref = pheno_df.set_index("genotype") + + # dk_geno_override came through (the new hook), including wt pinned to 0. + assert pdf.loc["wt", "dk_geno"] == 0.0 + for g in ["A1B", "A1B/C2D"]: + assert pdf.loc[g, "dk_geno"] == pytest.approx(pref.loc[g, "dk_geno"]) + + # theta_params_override wrote the resampled Hill params. + for g in genotypes: + for c in _HILL_COLS: + assert pdf.loc[g, c] == pytest.approx(pref.loc[g, c]) + + # genotype_theta_df reflects the injected Hill curve for A1B. + gtdf = genotype_theta_df[genotype_theta_df["genotype"] == "A1B"] + gtdf = gtdf.sort_values("titrant_conc") + assert np.allclose(gtdf["theta"].to_numpy(), gc_over["A1B"]) diff --git a/tests/tfscreen/simulate/test_binding_config_validation.py b/tests/tfscreen/simulate/test_binding_config_validation.py new file mode 100644 index 00000000..41bc5b4f --- /dev/null +++ b/tests/tfscreen/simulate/test_binding_config_validation.py @@ -0,0 +1,76 @@ +"""Fail-fast validation of the binding_data spiked_binding/library_binding blocks.""" + +import pytest + +from tfscreen.simulate.library_prediction import ( + _validate_binding_config, + _is_file_choice, +) + +SPIKED = ["wt", "M42I", "H74A", "K84L"] + + +def _pfile(tmp_path, genos): + p = tmp_path / "p.csv" + lines = ["genotype,theta_low,theta_high,log_hill_K,hill_n"] + lines += [f"{g},0.05,0.9,-4.0,2.0" for g in genos] + p.write_text("\n".join(lines) + "\n") + return str(p) + + +def test_is_file_choice(): + assert not _is_file_choice("stratified") + assert not _is_file_choice("random") + assert _is_file_choice("hill_params.csv") + + +def test_valid_configs_do_not_raise(tmp_path): + f = _pfile(tmp_path, ["wt", "M42I"]) + _validate_binding_config({"spiked_binding": {"choose_by": f}}, SPIKED, "hill_mut") + _validate_binding_config( + {"spiked_binding": {"choose_by": "stratified", "num": 2}, + "library_binding": {"choose_by": "random", "num": 3}}, + SPIKED, "hill_mut") + + +def test_spiked_file_genotype_not_spiked_errors(tmp_path): + f = _pfile(tmp_path, ["wt", "D88A"]) # D88A not in SPIKED + with pytest.raises(ValueError, match="must be spiked"): + _validate_binding_config({"spiked_binding": {"choose_by": f}}, SPIKED, "hill_mut") + + +def test_library_file_genotype_in_spiked_errors(tmp_path): + f = _pfile(tmp_path, ["M42I"]) # M42I IS spiked + with pytest.raises(ValueError, match="must NOT be spiked"): + _validate_binding_config({"library_binding": {"choose_by": f}}, SPIKED, "hill_mut") + + +def test_num_with_file_errors(tmp_path): + f = _pfile(tmp_path, ["wt"]) + with pytest.raises(ValueError, match="incompatible with a choose_by file"): + _validate_binding_config( + {"spiked_binding": {"choose_by": f, "num": 2}}, SPIKED, "hill_mut") + + +def test_file_requires_hill_component(tmp_path): + f = _pfile(tmp_path, ["wt"]) + with pytest.raises(ValueError, match="Hill theta component"): + _validate_binding_config( + {"spiked_binding": {"choose_by": f}}, SPIKED, "thermo.O2_C12_K5_U0_a.PK") + + +def test_spiked_num_out_of_range_errors(): + with pytest.raises(ValueError, match=r"num must be in \[1, 4\]"): + _validate_binding_config( + {"spiked_binding": {"choose_by": "stratified", "num": 99}}, SPIKED, "hill_mut") + + +def test_library_stratified_requires_num(): + with pytest.raises(ValueError, match="requires 'num'"): + _validate_binding_config( + {"library_binding": {"choose_by": "stratified"}}, SPIKED, "hill_mut") + + +def test_missing_choose_by_errors(): + with pytest.raises(ValueError, match="requires a 'choose_by'"): + _validate_binding_config({"spiked_binding": {"num": 2}}, SPIKED, "hill_mut") diff --git a/tests/tfscreen/simulate/test_binding_params.py b/tests/tfscreen/simulate/test_binding_params.py index 240e1ca4..abe1fda5 100644 --- a/tests/tfscreen/simulate/test_binding_params.py +++ b/tests/tfscreen/simulate/test_binding_params.py @@ -134,11 +134,14 @@ def test_raises_no_param_columns(self, tmp_path): with pytest.raises(ValueError, match="parameter column"): read_binding_genotype_params(str(p)) - def test_raises_unknown_columns(self, tmp_path): - p = tmp_path / "bad.csv" - p.write_text("genotype,theta_low,extra_col\nwt,0.99,foo\n") - with pytest.raises(ValueError, match="Unrecognised"): - read_binding_genotype_params(str(p)) + def test_ignores_extra_columns(self, tmp_path): + """Extra columns (e.g. a stage1_fits.csv) are ignored, not rejected.""" + p = tmp_path / "extra.csv" + p.write_text("genotype,theta_low,theta_high,log_hill_K,hill_n," + "dk_geno,n_obs\nwt,0.99,0.01,-4.1,2.0,0.003,120\n") + d = read_binding_genotype_params(str(p)) + assert set(d["wt"]) == {"theta_low", "theta_high", "log_hill_K", "hill_n"} + assert d["wt"]["theta_low"] == pytest.approx(0.99) def test_clips_theta_above_one(self, tmp_path): """theta_low > 1 (float rounding) must be clipped and trigger a warning.""" diff --git a/tests/tfscreen/simulate/test_library_binding_data.py b/tests/tfscreen/simulate/test_library_binding_data.py new file mode 100644 index 00000000..a635a9f7 --- /dev/null +++ b/tests/tfscreen/simulate/test_library_binding_data.py @@ -0,0 +1,143 @@ +"""Tests for simulate/library_binding_data.py (in-library binding genotypes).""" + +import numpy as np +import pandas as pd +import pytest + +from tfscreen.simulate.library_binding_data import ( + generate_library_binding_df, + _theta_matrix, +) +from tfscreen.simulate.binding_params import _to_log_conc + + +CONCS = [0.0, 0.001, 0.03, 1.0] + + +@pytest.fixture +def params_df(): + # Six genotypes with distinct Hill curves so maximin has something to span. + return pd.DataFrame({ + "genotype": ["wt", "M42I", "H74A", "K84L", "D88A", "A27G"], + "theta_low": [0.01, 0.05, 0.10, 0.02, 0.20, 0.03], + "theta_high": [0.99, 0.90, 0.80, 0.95, 0.70, 0.88], + "log_hill_K": [-4.0, -3.0, -5.0, -2.0, -4.5, -3.5], + "hill_n": [2.0, 1.5, 1.2, 1.0, 2.0, 1.8], + }) + + +def _all_survive(params_df): + return pd.DataFrame({"genotype": list(params_df["genotype"])}) + + +def _theta_true(params_df, genotype): + row = params_df.set_index("genotype").loc[[genotype]] + return _theta_matrix(row, _to_log_conc(CONCS))[0] + + +# --------------------------------------------------------------------------- +# stratified / random selection +# --------------------------------------------------------------------------- + +def test_stratified_selects_num_nonspiked_nonwt(params_df): + bdf, man = generate_library_binding_df( + {"choose_by": "stratified", "num": 3}, "iptg", CONCS, 0.0, + params_df, _all_survive(params_df), spiked_genotypes=["wt", "M42I"], + rng=np.random.default_rng(0), + ) + sel = set(man["genotype"]) + assert len(sel) == 3 + assert "wt" not in sel and "M42I" not in sel # wt + spiked excluded + assert sel.issubset({"H74A", "K84L", "D88A", "A27G"}) + assert (man["binding_class"] == "library").all() + assert list(bdf.columns) == ["genotype", "titrant_name", "titrant_conc", + "theta_obs", "theta_std"] + assert len(bdf) == 3 * len(CONCS) + + +def test_random_selects_num_survivors(params_df): + _, man = generate_library_binding_df( + {"choose_by": "random", "num": 2}, "iptg", CONCS, 0.0, + params_df, _all_survive(params_df), spiked_genotypes=["wt"], + rng=np.random.default_rng(1), + ) + assert len(man) == 2 + assert "wt" not in set(man["genotype"]) + + +def test_only_survivors_are_eligible(params_df): + # Only B and C have growth data → a num=3 request cannot be satisfied. + growth = pd.DataFrame({"genotype": ["wt", "H74A", "K84L"]}) + with pytest.raises(ValueError, match="only 2 eligible"): + generate_library_binding_df( + {"choose_by": "stratified", "num": 3}, "iptg", CONCS, 0.0, + params_df, growth, spiked_genotypes=["wt"], + rng=np.random.default_rng(0), + ) + + +def test_num_required_for_stratified(params_df): + with pytest.raises(ValueError, match="requires 'num'"): + generate_library_binding_df( + {"choose_by": "stratified"}, "iptg", CONCS, 0.0, + params_df, _all_survive(params_df), spiked_genotypes=["wt"], + rng=np.random.default_rng(0), + ) + + +# --------------------------------------------------------------------------- +# theta values and noise +# --------------------------------------------------------------------------- + +def test_theta_matches_hill_params_noise_free(params_df): + _, man = generate_library_binding_df( + {"choose_by": "random", "num": 1}, "iptg", CONCS, 0.0, + params_df, _all_survive(params_df), spiked_genotypes=["wt"], + rng=np.random.default_rng(3), + ) + g = man["genotype"].iloc[0] + bdf, _ = generate_library_binding_df( + {"choose_by": "random", "num": 1}, "iptg", CONCS, 0.0, + params_df, _all_survive(params_df), spiked_genotypes=["wt"], + rng=np.random.default_rng(3), + ) + expected = _theta_true(params_df, g) + got = bdf.sort_values("titrant_conc")["theta_obs"].to_numpy() + np.testing.assert_allclose(np.sort(got), np.sort(expected), rtol=1e-6) + assert (bdf["theta_std"] == 0.0).all() + + +def test_noise_sets_theta_std_and_perturbs(params_df): + bdf, _ = generate_library_binding_df( + {"choose_by": "random", "num": 2}, "iptg", CONCS, 0.02, + params_df, _all_survive(params_df), spiked_genotypes=["wt"], + rng=np.random.default_rng(4), + ) + assert (bdf["theta_std"] == 0.02).all() + assert (bdf["theta_obs"] >= 0.0).all() and (bdf["theta_obs"] <= 1.0).all() + + +# --------------------------------------------------------------------------- +# file path +# --------------------------------------------------------------------------- + +def test_file_path_uses_named_genotypes_and_warns_on_nonsurvivor(params_df, tmp_path): + # File names B, C, D; but D has no growth data → dropped with a warning. + f = tmp_path / "lib_binding.csv" + pd.DataFrame({ + "genotype": ["H74A", "K84L", "D88A"], + "theta_low": [0.1, 0.02, 0.2], + "theta_high": [0.8, 0.95, 0.7], + "log_hill_K": [-5.0, -2.0, -4.5], + "hill_n": [1.2, 1.0, 2.0], + }).to_csv(f, index=False) + + growth = pd.DataFrame({"genotype": ["wt", "H74A", "K84L"]}) # D88A missing + with pytest.warns(UserWarning, match="did not survive"): + bdf, man = generate_library_binding_df( + {"choose_by": str(f)}, "iptg", CONCS, 0.0, + params_df, growth, spiked_genotypes=["wt"], + rng=np.random.default_rng(0), + ) + assert set(man["genotype"]) == {"H74A", "K84L"} + assert "D88A" not in set(bdf["genotype"]) From 0ff01d15e0ad1957a7e1af9367e2975c83c782d4 Mon Sep 17 00:00:00 2001 From: Michael Harms Date: Thu, 9 Jul 2026 11:42:44 -0700 Subject: [PATCH 30/30] added congressional de-attenuation to empirical --- CLAUDE.md | 7 +- docs/badges/coverage-badge.svg | 2 +- docs/badges/tests-badge.svg | 2 +- reports/flake.txt | 2 +- reports/junit/junit.xml | 2 +- .../simulate/empirical/congression.py | 194 ++++++++++++++++++ .../simulate/empirical/fit_phenotypes.py | 82 ++++++-- .../simulate/scripts/build_empirical_cli.py | 50 +++-- .../simulate/empirical/test_congression.py | 130 ++++++++++++ .../simulate/empirical/test_fit_phenotypes.py | 12 ++ 10 files changed, 451 insertions(+), 32 deletions(-) create mode 100644 src/tfscreen/simulate/empirical/congression.py create mode 100644 tests/tfscreen/simulate/empirical/test_congression.py diff --git a/CLAUDE.md b/CLAUDE.md index 446ea09d..5c8d8995 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -266,11 +266,12 @@ These two dicts are the mechanism by which binding data is "pinned" into the gro An alternative to prior-predictive phenotype sampling: instead of drawing theta from made-up priors, fit **real** screen data to an empirical phenotype-generating distribution and resample from it, so the simulated library's phenotype *distribution* matches reality while ground truth stays known. Targets `hill_geno` + linear growth; asserts `A ≡ 1` (repressor: blocks or not, leaky binding absorbed into `theta_low`). Three stages: -- **Stage 1** (`fit_phenotypes.py`): per-genotype MLE of the growth model on a real `ln_cfu` DataFrame (derives `ln_cfu_std` from the processed `ln_cfu_var` via `get_scaled_cfu`, like `model_orchestrator`), calibration (`growth_k`/`growth_m` per `condition_rep`) frozen. Fits `(dk_geno, theta_low, theta_high, log_hill_K, hill_n)` in transformed coords (logit theta bounds, log n) so `run_least_squares` returns covariance in the space Stage 2 needs. Per-genotype independent (no cross-genotype coupling); weak `dk_geno` Tikhonov prior; ±16 logit clamp. Returns `GenotypeFit(estimate, covariance)` per genotype. `_hill_theta` is numerically identical to `hill_geno.run_model` and `binding_params._hill_theta` (verified — same `_ZERO_CONC_SENTINEL`). -- **Stage 2** (`population.py`): measurement-error EM (`z_i~N(mu,Σ)`, `y_i~N(z_i,S_i)`) that **deconvolves estimation noise** (`Cov(y)=Σ+mean(S_i)`), so it recovers a narrower population than a naive KDE on the point estimates. `fit_population()` → `PopulationModel` (single MV-Normal in transformed space; `wt_ref` field holds wt's actual Stage-1 fit; `.sample(n)` → natural-space DataFrame; `.save()`/`.load()`). Does **not** correct congression attenuation (deferred). +- **Stage 1** (`fit_phenotypes.py`): per-genotype MLE of the growth model on a real `ln_cfu` DataFrame (derives `ln_cfu_std` from the processed `ln_cfu_var` via `get_scaled_cfu`, like `model_orchestrator`), calibration (`growth_k`/`growth_m` per `condition_rep`) frozen. Fits `(dk_geno, theta_low, theta_high, log_hill_K, hill_n)` in transformed coords (logit theta bounds, log n) so `run_least_squares` returns covariance in the space Stage 2 needs. Per-genotype independent (no cross-genotype coupling); weak `dk_geno` Tikhonov prior; ±16 logit clamp. Returns `GenotypeFit(estimate, covariance)` per genotype. The fits are embarrassingly parallel — `num_workers` (`-1` = `cpu_count-1`) runs them over a `ProcessPoolExecutor`; the parallel path strips the genotype `Categorical` first (it carries all categories on every group → O(N²) pickling). Worker startup pays a ~2s JAX import, so parallelism is a wash for tiny/fast runs and near-linear for large real libraries. `_hill_theta` is numerically identical to `hill_geno.run_model` and `binding_params._hill_theta` (verified — same `_ZERO_CONC_SENTINEL`). +- **Stage 2** (`population.py`): measurement-error EM (`z_i~N(mu,Σ)`, `y_i~N(z_i,S_i)`) that **deconvolves estimation noise** (`Cov(y)=Σ+mean(S_i)`), so it recovers a narrower population than a naive KDE on the point estimates. `fit_population()` → `PopulationModel` (single MV-Normal in transformed space; `wt_ref` field holds wt's actual Stage-1 fit; `.sample(n)` → natural-space DataFrame; `.save()`/`.load()`). +- **Stage 1.5** (`congression.py`, optional; between Stage 1 and Stage 2, gated by `--congression_lambda`): de-attenuates the **bulk** genotypes' theta curves for co-transformation. Reuses the inference's own θ-level operator `transformation._congression.update_thetas` (the `E[max(x,M)]` **dominant-max occupancy** map — the tightest-bound operator sets effective θ, so `E[max]` only, never the min variant — with an empirical background CDF). `correct_theta_matrix` is the fixed point: `θ_true ← θ_obs`; iterate `θ_true += gain·(θ_obs − update_thetas(θ_true; background=θ_true))` per-concentration until converged (the background *is* the corrected population, hence the iteration). `deattenuate_congression` evaluates each bulk genotype's Stage-1 Hill at the growth `titrant_conc` grid, corrects, and refits Hill (dk_geno and the Stage-1 covariance are left untouched — a deliberate bias-only correction; Stage 2's estimation-noise deconvolution still runs after). λ passes straight through **unconverted**: a focal barcode is size-biased into its cell, so co-residents are Poisson(λ) at the *same* zero-truncated `transformation_poisson_lambda` (`_sim_transform` uses `zero_truncated_poisson` + i.i.d. plasmid draws). Spiked genotypes are congression-free → excluded from correction and the background CDF, and pass through unchanged. This is the θ-level analogue of the simulator's growth-level congression (agree to first order, exact at λ→0); spiked-only vs bulk distribution is the external check. - **Stage 3** (`resample.py`): `resample_phenotypes` draws one i.i.d. phenotype per genotype (wt pinned to `dk_geno=0` + `wt_ref` Hill); `make_empirical_overrides` reuses `build_theta_gc_override_hill_geno` → `(theta_gc_override, theta_params_override, dk_geno_override)`. `thermo_to_growth` gained a `dk_geno_override` param (the one growth-path change; `theta_params_override` only patches θ columns). `build_empirical_binding_theta` rebuilds spiked `binding_theta_df` from resampled params (selection from the `binding_data` config; θ from resampled Hill, not `sample_theta_stratified`). -Integration: `library_prediction` gains a `phenotype_source: empirical` branch (needs an `empirical: {phenotype_model: }` block pointing at the single self-contained `_phenotype_model.json`; `_resolve_phenotype_model_path` accepts that path with/without `.json` or the bare ``, and the fit prints the absolute path — use it so no file-copying is needed) that resamples all genotypes, injects the overrides, forces `theta_component=hill_geno` (warns + ignores any other value; the resampled phenotypes are per-genotype Hill curves and the discarded prior draw must match the `parameters_df` schema — this also avoids running/overflowing an e.g. `hill_mut` draw), drops the ignored `theta_priors`/`theta_sim_priors`, and forces `activity=fixed/1`. `phenotype_source`/`empirical` are in `selection_experiment.SIMULATE_KNOWN_KEYS`. Resampled ground truth flows into `parameters_df`/`genotype_theta_df` automatically (no new return value); `library_binding` regenerates for free (reads `parameters_df`). `tfs-build-empirical` (`simulate/scripts/build_empirical_cli.py`) is a **one-command orchestrator**: given the experimental inputs (`growth_file` and `seed` positional; `--binding_file` required; optional `--spiked_file`/`--base_growth_file`/`--thermo_data`) it internally calls `configure_model` (linear + hill_geno defaults — no model choices exposed, since here they'd only be wrong) then `run_prefit_calibration` (MAP-calibrates per-condition k/m), then Stages 1-2, saving the deliverable `_phenotype_model.json` (one self-contained, human-readable file = the generating distribution; `PopulationModel.save`/`.load`) + the diagnostic `_stage1_fits.csv`, plus the `_configure_*`/`_prefit_*` intermediates. The configure/prefit imports are lazy (the heavy JAX stack loads only on this path). The MAP prefit is the slow step, so `--calibration_file` skips configure+prefit and reuses a calibration for fast Stage-1/2 iteration — either a prefit **priors CSV** (read via `fit_phenotypes.read_calibration`, which pivots the `growth.condition_growth.k_loc`/`growth.condition_growth.m_loc` per-`condition_rep` rows — prefit writes these via `_csv_row_name` = `growth.{component}.{field}` — to wide k/m) or a wide `(condition_rep, growth_k, growth_m)` CSV. This **complements** the fully-synthetic prior path (the *accuracy* benchmark) as a *realism* benchmark. +Integration: `library_prediction` gains a `phenotype_source: empirical` branch (needs an `empirical: {phenotype_model: }` block pointing at the single self-contained `_phenotype_model.json`; `_resolve_phenotype_model_path` accepts that path with/without `.json` or the bare ``, and the fit prints the absolute path — use it so no file-copying is needed) that resamples all genotypes, injects the overrides, forces `theta_component=hill_geno` (warns + ignores any other value; the resampled phenotypes are per-genotype Hill curves and the discarded prior draw must match the `parameters_df` schema — this also avoids running/overflowing an e.g. `hill_mut` draw), drops the ignored `theta_priors`/`theta_sim_priors`, and forces `activity=fixed/1`. `phenotype_source`/`empirical` are in `selection_experiment.SIMULATE_KNOWN_KEYS`. Resampled ground truth flows into `parameters_df`/`genotype_theta_df` automatically (no new return value); `library_binding` regenerates for free (reads `parameters_df`). `tfs-build-empirical` (`simulate/scripts/build_empirical_cli.py`) is a **one-command orchestrator**: given the experimental inputs (`growth_file` and `seed` positional; `--binding_file` required; optional `--spiked_file`/`--base_growth_file`/`--thermo_data`/`--congression_lambda`/`--num_workers`) it internally calls `configure_model` (linear + hill_geno defaults — no model choices exposed, since here they'd only be wrong) then `run_prefit_calibration` (MAP-calibrates per-condition k/m), then Stages 1-2 (plus optional Stage 1.5 congression de-attenuation when `--congression_lambda` is given), saving the deliverable `_phenotype_model.json` (one self-contained, human-readable file = the generating distribution; `PopulationModel.save`/`.load`) + the diagnostic `_stage1_fits.csv`, plus the `_configure_*`/`_prefit_*` intermediates. The configure/prefit imports are lazy (the heavy JAX stack loads only on this path). The MAP prefit is the slow step, so `--calibration_file` skips configure+prefit and reuses a calibration for fast Stage-1/2 iteration — either a prefit **priors CSV** (read via `fit_phenotypes.read_calibration`, which pivots the `growth.condition_growth.k_loc`/`growth.condition_growth.m_loc` per-`condition_rep` rows — prefit writes these via `_csv_row_name` = `growth.{component}.{field}` — to wide k/m) or a wide `(condition_rep, growth_k, growth_m)` CSV. This **complements** the fully-synthetic prior path (the *accuracy* benchmark) as a *realism* benchmark. ## YAML Standards diff --git a/docs/badges/coverage-badge.svg b/docs/badges/coverage-badge.svg index 9b5a50eb..c24babeb 100644 --- a/docs/badges/coverage-badge.svg +++ b/docs/badges/coverage-badge.svg @@ -1 +1 @@ -coverage: 96.13%coverage96.13% \ No newline at end of file +coverage: 96.12%coverage96.12% \ No newline at end of file diff --git a/docs/badges/tests-badge.svg b/docs/badges/tests-badge.svg index 1e6308a2..e8bb384a 100644 --- a/docs/badges/tests-badge.svg +++ b/docs/badges/tests-badge.svg @@ -1 +1 @@ -tests: 4009tests4009 \ No newline at end of file +tests: 4015tests4015 \ No newline at end of file diff --git a/reports/flake.txt b/reports/flake.txt index 98fda335..2bd51b9c 100644 --- a/reports/flake.txt +++ b/reports/flake.txt @@ -5066,7 +5066,7 @@ ./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:94:30: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:95:30: E127 continuation line over-indented for visual indent ./tests/tfscreen/simulate/empirical/test_build_empirical_cli.py:169:34: E127 continuation line over-indented for visual indent -./tests/tfscreen/simulate/empirical/test_fit_phenotypes.py:161:57: E128 continuation line under-indented for visual indent +./tests/tfscreen/simulate/empirical/test_fit_phenotypes.py:173:57: E128 continuation line under-indented for visual indent ./tests/tfscreen/simulate/empirical/test_library_prediction_empirical.py:9:1: F401 'tfscreen.util' imported but unused ./tests/tfscreen/simulate/empirical/test_population.py:4:1: F401 'pandas as pd' imported but unused ./tests/tfscreen/simulate/growth/test_growth_linkage.py:50:16: E221 multiple spaces before operator diff --git a/reports/junit/junit.xml b/reports/junit/junit.xml index 3bed884b..ed025d18 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/simulate/empirical/congression.py b/src/tfscreen/simulate/empirical/congression.py new file mode 100644 index 00000000..031657db --- /dev/null +++ b/src/tfscreen/simulate/empirical/congression.py @@ -0,0 +1,194 @@ +""" +Stage 1.5 of the empirical-phenotype pipeline: de-attenuate the per-genotype +theta curves for congression (co-transformation). + +A barcode observed in the bulk is really a cell that received a +zero-truncated-Poisson(lambda) number of plasmids. Under **dominant-max +occupancy** — the tightest-bound operator in a co-transformed cell sets the +effective theta, regardless of marker — the theta a monoclonal Hill fit +recovers for genotype ``g`` is inflated toward the population's high-occupancy +envelope: + + theta_obs = E[ max(theta_g, M) ], M = max of Poisson(lambda) co-residents + +drawn from the population theta distribution. This is exactly the inference's +own congression operator (``transformation._congression.update_thetas``, the +``E[max(x, M)]`` map with an empirical background CDF), and because a focal +barcode is size-biased into its cell, the co-resident count is Poisson at the +same ``lambda`` the simulator's ``transformation_poisson_lambda`` uses — so no +lambda conversion is needed. + +We want ``theta_true`` such that pushing it through that forward map (with the +background built from ``theta_true`` itself) reproduces ``theta_obs``. That is +a fixed point because the background *is* the corrected population, which +changes every pass. Per titrant concentration is an independent 1-D +correction; the Hill refit afterward re-links the concentrations into a curve. + +Scope / assumptions +------------------- +* **Dominant-max occupancy only** (single ``E[max]`` operator; no min variant). +* Corrects only **bulk** genotypes; spiked genotypes are congression-free, so + they are excluded from both the correction and the background CDF and pass + through unchanged. +* Operates on the genotype × concentration theta *point estimates* (pooled over + replicate/library by Stage 1); ``dk_geno`` is untouched (it is a growth + parameter, not part of the theta curve). Estimation-noise deconvolution + stays in Stage 2 — this stage only removes the congression *bias*, and keeps + each genotype's Stage-1 covariance (a deliberate approximation: the bias + shift barely changes estimation precision). + +This is the θ-level analogue of the simulator's growth-level congression; the +two agree to first order (exact at ``lambda -> 0``), and the spiked-only +distribution is the external check on the residual. +""" + +import numpy as np +import jax.numpy as jnp +from scipy.special import expit + +from tfscreen.util.io import read_dataframe +from tfscreen.mle.fitters.least_squares import run_least_squares +from tfscreen.simulate.empirical.fit_phenotypes import ( + _hill_theta, _POWER_CLIP, _LOGIT_BOUND, +) +from tfscreen.tfmodel.generative.components.transformation._congression import ( + update_thetas, +) + +# Positions within the 5-element pheno block (PHENO_PARAMS_TRANSFORMED) of the +# theta-curve params: logit_theta_low, logit_theta_high, log_hill_K, log_hill_n. +# Index 0 (dk_geno) is a growth parameter and is left untouched. +_THETA_PARAM_IDX = np.array([1, 2, 3, 4]) + +_THETA_EPS = 1e-6 + + +def _theta_from_fit(fit, concs): + """Evaluate a genotype's fitted Hill curve at ``concs`` (natural conc).""" + pheno = np.asarray(fit.est_t)[fit.pheno_slice] + theta_low = expit(pheno[1]) + theta_high = expit(pheno[2]) + log_K = pheno[3] + n = np.exp(pheno[4]) + return _hill_theta(concs, theta_low, theta_high, log_K, n) + + +def correct_theta_matrix(theta_obs, lam, gain=1.0, tol=1e-4, max_iter=50, + n_grid=256): + """Fixed-point de-attenuation of an observed-theta matrix. + + Parameters + ---------- + theta_obs : np.ndarray, shape (n_conc, n_geno) + Observed theta per concentration (rows) and genotype (cols). Each row + is corrected against its own population CDF. + lam : float + Poisson co-resident rate (== the zero-truncated ``transformation_poisson_lambda``). + gain, tol, max_iter, n_grid : see module notes. + + Returns + ------- + theta_true : np.ndarray, shape (n_conc, n_geno) + n_iter : int + """ + theta_obs = np.asarray(theta_obs, dtype=float) + theta_true = np.clip(theta_obs.copy(), _THETA_EPS, 1.0 - _THETA_EPS) + + if lam is None or float(lam) <= 0: + return theta_obs.copy(), 0 + + n_iter = 0 + for n_iter in range(1, max_iter + 1): + theta_pred = np.asarray(update_thetas( + jnp.asarray(theta_true), (float(lam),), theta_dist="empirical", + population_theta=jnp.asarray(theta_true), n_grid=n_grid)) + resid = theta_obs - theta_pred + if np.nanmax(np.abs(resid)) < tol: + break + theta_true = np.clip(theta_true + gain * resid, _THETA_EPS, 1.0 - _THETA_EPS) + + return theta_true, n_iter + + +def _refit_hill_theta(concs, theta, guess_pheno): + """Refit the 4 transformed theta-Hill params to a corrected theta curve. + + ``guess_pheno`` is the genotype's current pheno block (used to seed). + Returns ``(logit_low, logit_high, log_K, log_n)``. + """ + def model(p_t, x): + low = expit(p_t[0]) + high = expit(p_t[1]) + log_K = p_t[2] + n = np.exp(p_t[3]) + return _hill_theta(x, low, high, log_K, n) + + guess = np.asarray(guess_pheno)[_THETA_PARAM_IDX].astype(float) + lower = np.array([-_LOGIT_BOUND, -_LOGIT_BOUND, np.log(1e-12), np.log(0.05)]) + upper = np.array([_LOGIT_BOUND, _LOGIT_BOUND, np.log(1e6), np.log(_POWER_CLIP)]) + est, _std, _cov, _fit = run_least_squares( + some_model=model, + obs=np.asarray(theta, dtype=float), + obs_std=np.ones_like(theta, dtype=float), + guesses=guess, lower_bounds=lower, upper_bounds=upper, + args=(np.asarray(concs, dtype=float),)) + return est + + +def deattenuate_congression(fits, growth_df, lam, spiked=None, + gain=1.0, tol=1e-4, max_iter=50, n_grid=256): + """Congression-correct the bulk theta curves in a Stage-1 ``fits`` dict. + + Parameters + ---------- + fits : dict + ``{(genotype, titrant_name): GenotypeFit}`` from ``fit_phenotypes``. + growth_df : pandas.DataFrame or str + The real ln_cfu data (supplies the per-titrant concentration grid the + theta curves are corrected on). + lam : float or None + Zero-truncated Poisson congression rate. ``None``/``<=0`` -> no-op. + spiked : iterable of str or None + Congression-free genotypes to exclude from correction and background. + gain, tol, max_iter, n_grid : fixed-point controls. + + Returns + ------- + dict + A new fits dict: bulk genotypes' theta-Hill params de-attenuated (Hill + refit; dk_geno and covariance unchanged); spiked genotypes untouched. + """ + if lam is None or float(lam) <= 0: + return dict(fits) + + spiked = set(spiked or []) + growth_df = read_dataframe(growth_df) + corrected = dict(fits) + + for titrant_name, sub in growth_df.groupby("titrant_name", observed=True): + concs = np.sort(sub["titrant_conc"].unique().astype(float)) + + keys = [k for k in fits + if k[1] == titrant_name and k[0] not in spiked + and np.all(np.isfinite(fits[k].est_t))] + if len(keys) < 2: + continue # need a population to build a background CDF + + # (n_conc, n_geno) observed theta. + theta_obs = np.stack([_theta_from_fit(fits[k], concs) for k in keys], + axis=1) + theta_true, _ = correct_theta_matrix( + theta_obs, float(lam), gain=gain, tol=tol, max_iter=max_iter, + n_grid=n_grid) + + for j, k in enumerate(keys): + fit = fits[k] + new_theta_t = _refit_hill_theta( + concs, theta_true[:, j], fit.est_t[fit.pheno_slice]) + est_t = np.array(fit.est_t, dtype=float) + pheno = est_t[fit.pheno_slice].copy() + pheno[_THETA_PARAM_IDX] = new_theta_t + est_t[fit.pheno_slice] = pheno + corrected[k] = fit._replace(est_t=est_t) + + return corrected diff --git a/src/tfscreen/simulate/empirical/fit_phenotypes.py b/src/tfscreen/simulate/empirical/fit_phenotypes.py index fe552158..fa9fb9db 100644 --- a/src/tfscreen/simulate/empirical/fit_phenotypes.py +++ b/src/tfscreen/simulate/empirical/fit_phenotypes.py @@ -59,8 +59,10 @@ import pandas as pd from scipy.special import expit, logit import tqdm +import os import warnings from collections import namedtuple +from concurrent.futures import ProcessPoolExecutor from tfscreen.util.io import read_dataframe from tfscreen.util.dataframe import check_columns, get_scaled_cfu @@ -417,12 +419,40 @@ def _natural_from_transformed(est_t, pheno_slice): } +# Read-only per-worker state for the process pool, populated once per worker by +# ``_init_worker`` so the (small) calibration maps are not re-pickled per task. +_WORKER_STATE = {} + + +def _init_worker(k_map, m_map, intercept_cols, dk_geno_prior): + _WORKER_STATE.update(k_map=k_map, m_map=m_map, + intercept_cols=intercept_cols, + dk_geno_prior=dk_geno_prior) + + +def _fit_one_task(sub): + """Pool worker: fit one genotype group using the shared worker state.""" + return fit_one_genotype(sub, _WORKER_STATE["k_map"], _WORKER_STATE["m_map"], + _WORKER_STATE["intercept_cols"], + dk_geno_prior=_WORKER_STATE["dk_geno_prior"]) + + +def _resolve_workers(num_workers): + """joblib-style worker count: 1 -> serial, -1 -> cpu_count-1, N -> N.""" + if num_workers is None or int(num_workers) == 1: + return 1 + if int(num_workers) < 0: + return max(1, (os.cpu_count() or 2) - 1) + return int(num_workers) + + def fit_phenotypes(growth_df, calib, intercept_cols=("replicate",), dk_geno_prior=(0.0, 1.0), min_obs=None, - progress=True): + progress=True, + num_workers=1): """Fit the growth model to every genotype in a real ``ln_cfu`` DataFrame. Parameters @@ -445,6 +475,10 @@ def fit_phenotypes(growth_df, Skip genotype groups with fewer than this many usable observations. progress : bool Show a tqdm progress bar. + num_workers : int + Per-genotype fits are independent, so they can run in parallel over a + process pool. ``1`` (default) fits serially; ``-1`` uses + ``os.cpu_count() - 1`` workers; ``N`` uses ``N`` workers. Returns ------- @@ -470,21 +504,45 @@ def fit_phenotypes(growth_df, k_map, m_map = _build_calib_lookup(calib) - groups = list(growth_df.groupby(["genotype", "titrant_name"], - observed=True, sort=False)) - if progress: - groups = tqdm.tqdm(groups, desc="fitting genotypes") - - rows = [] - fits = {} - for (geno, titr), sub in groups: + workers = _resolve_workers(num_workers) + + # For the parallel path, drop the genotype Categorical: it carries the full + # category list on every group, so pickling each sub-frame to a worker would + # be O(num_genotype) per task (O(N^2) overall). Plain strings pickle in + # O(rows). fit_one_genotype reads the genotype via ``.iloc[0]``, so a str + # column behaves identically. + if workers != 1 and str(growth_df["genotype"].dtype) == "category": + growth_df = growth_df.copy() + growth_df["genotype"] = growth_df["genotype"].astype(str) + + # Collect the per-genotype work items (each is an independent fit). + keys, subs = [], [] + for key, sub in growth_df.groupby(["genotype", "titrant_name"], + observed=True, sort=False): if min_obs is not None and len(sub) < min_obs: continue + keys.append(key) + subs.append(sub) - gf = fit_one_genotype(sub, k_map, m_map, intercept_cols, - dk_geno_prior=dk_geno_prior) - fits[(geno, titr)] = gf + if workers == 1: + it = tqdm.tqdm(subs, desc="fitting genotypes") if progress else subs + gfs = [fit_one_genotype(sub, k_map, m_map, intercept_cols, + dk_geno_prior=dk_geno_prior) for sub in it] + else: + chunksize = max(1, len(subs) // (workers * 8)) if subs else 1 + with ProcessPoolExecutor( + max_workers=workers, initializer=_init_worker, + initargs=(k_map, m_map, intercept_cols, dk_geno_prior)) as ex: + mapped = ex.map(_fit_one_task, subs, chunksize=chunksize) + if progress: + mapped = tqdm.tqdm(mapped, total=len(subs), + desc=f"fitting genotypes ({workers} workers)") + gfs = list(mapped) + rows = [] + fits = {} + for (geno, titr), gf in zip(keys, gfs): + fits[(geno, titr)] = gf natural = _natural_from_transformed(gf.est_t, gf.pheno_slice) std_t = np.sqrt(np.diag(gf.cov_t))[gf.pheno_slice] row = {"genotype": geno, "titrant_name": titr, diff --git a/src/tfscreen/simulate/scripts/build_empirical_cli.py b/src/tfscreen/simulate/scripts/build_empirical_cli.py index eca26ca3..a3ea0183 100644 --- a/src/tfscreen/simulate/scripts/build_empirical_cli.py +++ b/src/tfscreen/simulate/scripts/build_empirical_cli.py @@ -27,7 +27,9 @@ import os import warnings -from tfscreen.simulate.empirical.fit_phenotypes import fit_phenotypes +from tfscreen.simulate.empirical.fit_phenotypes import ( + fit_phenotypes, _natural_from_transformed, +) from tfscreen.simulate.empirical.population import fit_population from tfscreen.util.io import read_dataframe from tfscreen.util.cli import read_lines @@ -36,7 +38,7 @@ _WT_REF_COLS = ["theta_low", "theta_high", "log_hill_K", "hill_n"] -def _run_configure_and_prefit(growth_file, binding_file, spiked_file, +def _run_configure_and_prefit(growth_file, binding_file, spiked, base_growth_file, thermo_data, out_prefix, seed): """Configure a linear/hill_geno model and MAP-calibrate k/m. @@ -53,7 +55,6 @@ def _run_configure_and_prefit(growth_file, binding_file, spiked_file, run_prefit_calibration, ) - spiked = read_lines(spiked_file) if spiked_file else None configure_prefix = f"{out_prefix}_configure" print("Configuring model (linear growth, hill_geno theta)...", flush=True) @@ -85,10 +86,12 @@ def build_empirical(growth_file, spiked_file=None, base_growth_file=None, thermo_data=None, + congression_lambda=None, intercept_cols="replicate", dk_geno_prior_sd=1.0, min_obs=None, - drop_railed=True): + drop_railed=True, + num_workers=1): """ Fit real screen data to an empirical phenotype generating distribution. @@ -118,6 +121,12 @@ def build_empirical(growth_file, thermo_data : str, optional Thermodynamic data path forwarded to ``configure_model`` (unused by the default hill_geno theta). + congression_lambda : float, optional + Zero-truncated Poisson congression rate (the same lambda as the + simulator's ``transformation_poisson_lambda``). When given, run Stage + 1.5: de-attenuate the bulk theta curves for co-transformation before + building the distribution (spiked genotypes are congression-free and + left alone). Omit for no correction. intercept_cols : str Comma-separated columns whose unique combinations each get a nuisance ``ln_cfu0`` (default ``"replicate"``; empty string -> single intercept). @@ -127,8 +136,13 @@ def build_empirical(growth_file, Skip genotypes with fewer than this many usable observations. drop_railed : bool Drop theta-logit-railed Stage-1 fits before the Stage-2 fit. + num_workers : int + Parallelize the Stage-1 per-genotype fits over a process pool: ``1`` + (default) serial; ``-1`` uses ``os.cpu_count() - 1``; ``N`` uses ``N``. + Recommended for large libraries (the fits are embarrassingly parallel). """ growth_df = read_dataframe(growth_file) + spiked = read_lines(spiked_file) if spiked_file else None icols = [c.strip() for c in str(intercept_cols).split(",") if c.strip()] @@ -139,7 +153,7 @@ def build_empirical(growth_file, # Calibration: reuse a supplied one, or configure+prefit to produce it. if calibration_file is None: calibration_file = _run_configure_and_prefit( - growth_file, binding_file, spiked_file, base_growth_file, + growth_file, binding_file, spiked, base_growth_file, thermo_data, out_prefix, seed) else: print(f"Using supplied calibration: {calibration_file}", flush=True) @@ -149,7 +163,15 @@ def build_empirical(growth_file, print("Stage 1: fitting each measured genotype independently...", flush=True) results_df, fits = fit_phenotypes( growth_df, calibration_file, intercept_cols=icols, - dk_geno_prior=dk_prior, min_obs=min_obs) + dk_geno_prior=dk_prior, min_obs=min_obs, num_workers=num_workers) + + # Stage 1.5 (optional): de-attenuate the bulk theta curves for congression. + if congression_lambda is not None and float(congression_lambda) > 0: + from tfscreen.simulate.empirical.congression import deattenuate_congression + print(f"Stage 1.5: de-attenuating congression " + f"(lambda={float(congression_lambda):g})...", flush=True) + fits = deattenuate_congression( + fits, growth_df, float(congression_lambda), spiked=spiked) # Stage 2: turn the per-genotype fits into ONE generating distribution # (deconvolving estimation noise). This distribution is the deliverable. @@ -157,12 +179,13 @@ def build_empirical(growth_file, f"{len(fits)} per-genotype fits...", flush=True) model = fit_population(fits, drop_railed=drop_railed) - # Embed wt's actual Stage-1 phenotype so the simulation pins wt to its real - # value rather than a resampled/mean draw. - wt_rows = results_df[results_df["genotype"] == "wt"] - if len(wt_rows): - r = wt_rows.iloc[0] - model.wt_ref = {c: float(r[c]) for c in _WT_REF_COLS} + # Embed wt's actual (congression-corrected, if applied) phenotype so the + # simulation pins wt to its real value rather than a resampled/mean draw. + wt_keys = [k for k in fits if k[0] == "wt"] + if wt_keys: + nat = _natural_from_transformed(fits[wt_keys[0]].est_t, + fits[wt_keys[0]].pheno_slice) + model.wt_ref = {c: float(nat[c]) for c in _WT_REF_COLS} else: warnings.warn( "no 'wt' genotype in the Stage-1 fits; wt_ref not set (the " @@ -194,4 +217,5 @@ def main(): build_empirical, manual_arg_types={"binding_file": str, "calibration_file": str, "spiked_file": str, "base_growth_file": str, - "thermo_data": str, "seed": int, "min_obs": int}) + "thermo_data": str, "seed": int, "min_obs": int, + "congression_lambda": float, "num_workers": int}) diff --git a/tests/tfscreen/simulate/empirical/test_congression.py b/tests/tfscreen/simulate/empirical/test_congression.py new file mode 100644 index 00000000..49d90e83 --- /dev/null +++ b/tests/tfscreen/simulate/empirical/test_congression.py @@ -0,0 +1,130 @@ +"""Tests for Stage-1.5 congression de-attenuation.""" + +import numpy as np +import jax.numpy as jnp +import pandas as pd +import pytest +from scipy.special import expit, logit + +from tfscreen.tfmodel.generative.components.transformation._congression import ( + update_thetas, +) +from tfscreen.simulate.empirical.congression import ( + correct_theta_matrix, + deattenuate_congression, +) +from tfscreen.simulate.empirical.fit_phenotypes import ( + GenotypeFit, PHENO_PARAMS_TRANSFORMED, +) + + +def _forward(theta_true, lam): + """Apply the congression forward operator E[max(x, M)].""" + return np.asarray(update_thetas( + jnp.asarray(theta_true), (float(lam),), theta_dist="empirical", + population_theta=jnp.asarray(theta_true))) + + +# --------------------------------------------------------------------------- +# correct_theta_matrix — the fixed-point core +# --------------------------------------------------------------------------- + +def test_roundtrip_recovers_true_population(): + rng = np.random.default_rng(0) + # 300 genotypes at 2 independent conditions. + theta_true = expit(rng.normal(0.0, 1.5, size=(2, 300))) + theta_obs = _forward(theta_true, lam=1.0) + + # Congression can only inflate (max), so observed >= true. + assert np.all(theta_obs >= theta_true - 1e-9) + # ...and it compresses the population (masks the low end up). + assert np.std(theta_obs) < np.std(theta_true) + + theta_rec, n_iter = correct_theta_matrix( + theta_obs, lam=1.0, tol=1e-6, max_iter=200) + + assert np.median(np.abs(theta_rec - theta_true)) < 0.03 + assert np.std(theta_rec) == pytest.approx(np.std(theta_true), abs=0.03) + + +def test_lambda_zero_is_noop(): + rng = np.random.default_rng(1) + theta_obs = expit(rng.normal(0, 1, size=(1, 50))) + theta_rec, n_iter = correct_theta_matrix(theta_obs, lam=0.0) + assert np.allclose(theta_rec, theta_obs) + assert n_iter == 0 + + +def test_correction_pulls_observed_down(): + rng = np.random.default_rng(2) + theta_true = expit(rng.normal(0, 1.5, size=(1, 300))) + theta_obs = _forward(theta_true, lam=1.5) + theta_rec, _ = correct_theta_matrix(theta_obs, lam=1.5, max_iter=200) + # E[max] >= true, so the inverse pulls the observed population down. + assert np.mean(theta_rec) < np.mean(theta_obs) + + +# --------------------------------------------------------------------------- +# deattenuate_congression — the fits-level wrapper +# --------------------------------------------------------------------------- + +def _make_fit(genotype, theta_low, theta_high, log_K, n, dk=0.0): + # est_t: [ln_cfu0, dk_geno, logit_low, logit_high, log_K, log_n] + est_t = np.array([5.0, dk, logit(theta_low), logit(theta_high), + log_K, np.log(n)]) + cov_t = np.eye(6) * 0.01 + return GenotypeFit( + genotype=genotype, titrant_name="iptg", n_obs=100, converged=True, + param_names_t=["ln_cfu0[0]"] + list(PHENO_PARAMS_TRANSFORMED), + est_t=est_t, cov_t=cov_t, pheno_slice=slice(1, 6)) + + +def _mean_theta_high(fits, orig_keys): + # theta_high = expit(est_t[3]) (induced-end occupancy). + return np.mean([expit(fits[k].est_t[3]) for k in orig_keys]) + + +def _build_fits(rng, n=25): + fits = {} + for i in range(n): + fits[(f"A{i}V", "iptg")] = _make_fit( + f"A{i}V", + theta_low=rng.uniform(0.7, 0.98), + theta_high=rng.uniform(0.02, 0.5), + log_K=rng.uniform(np.log(1e-3), np.log(0.3)), # spread -> dynamic range + n=rng.uniform(0.8, 2.0)) + fits[("wt", "iptg")] = _make_fit("wt", 0.99, 0.01, np.log(0.017), 2.0) + return fits + + +_CONCS = [0.0, 1e-3, 1e-2, 1e-1, 1.0] +_GROWTH_DF = pd.DataFrame({"titrant_name": ["iptg"] * len(_CONCS), + "titrant_conc": _CONCS}) + + +def test_deattenuate_leaves_spiked_untouched_and_corrects_bulk(): + rng = np.random.default_rng(3) + fits = _build_fits(rng) + bulk_keys = [k for k in fits if k[0] != "wt"] + + corrected = deattenuate_congression(fits, _GROWTH_DF, lam=1.0, spiked={"wt"}) + + # Spiked genotype is congression-free -> identical. + assert np.allclose(corrected[("wt", "iptg")].est_t, + fits[("wt", "iptg")].est_t) + # Bulk genotypes were corrected. + assert any(not np.allclose(corrected[k].est_t, fits[k].est_t) + for k in bulk_keys) + # De-attenuation pulls the masked induced-end occupancy back down. + assert _mean_theta_high(corrected, bulk_keys) < _mean_theta_high(fits, bulk_keys) + # dk_geno (index 1) is untouched by the theta correction. + for k in bulk_keys: + assert corrected[k].est_t[1] == fits[k].est_t[1] + + +def test_deattenuate_lambda_none_is_noop(): + rng = np.random.default_rng(4) + fits = _build_fits(rng) + noop = deattenuate_congression(fits, _GROWTH_DF, lam=None, spiked={"wt"}) + for k in fits: + assert np.allclose(noop[k].est_t, fits[k].est_t) diff --git a/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py b/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py index e910cb80..5d89af24 100644 --- a/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py +++ b/tests/tfscreen/simulate/empirical/test_fit_phenotypes.py @@ -139,6 +139,18 @@ def test_fit_phenotypes_accepts_ln_cfu_var_only(): TRUTH["wt"]["theta_low"], abs=1e-3) +def test_parallel_matches_serial(): + """num_workers>1 (process pool) must give the same fits as serial.""" + df = _build_growth_df(noise_sd=0.02, seed=5) + res_serial, _ = fit_phenotypes(df, CALIB, dk_geno_prior=None, + progress=False, num_workers=1) + res_par, _ = fit_phenotypes(df, CALIB, dk_geno_prior=None, + progress=False, num_workers=2) + pd.testing.assert_frame_equal( + res_serial.set_index("genotype").sort_index(), + res_par.set_index("genotype").sort_index()) + + def test_noiseless_roundtrip_recovers_truth(): """With no observation noise the fit should recover the true params.""" df = _build_growth_df(noise_sd=0.0)